开始正式搭建Hadoop环境,之所以分开写,也是便于阅读及以后参考。
Hadoop环境的搭建过程中,需要配置几个XML文件,接下来简单介绍下这几个XML文件的作用
core-site.xml
主要配置NameNode的一些信息,主要属性如下:
<configuration>
<!-- 指定hdfs的nameservice名称空间为ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!-- 指定hadoop临时目录,默认在/tmp/{$user}目录下,不安全,每次开机都会被清空-->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/hdpdata/</value>
<description>需要手动创建hdpdata目录</description>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
<description>zookeeper地址,多个用逗号隔开</description>
</property>
</configuration>
hdfs-site.xml
主要配置hdfs
<configuration>
<!-- NameNode HA配置 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
<description>指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致</description>
</property>
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
<description>ns命名空间下有两个NameNode,逻辑代号,随便起名字,分别是nn1,nn2</description>
</property>
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>node01:9000</value>
<description>nn1的RPC通信地址</description>
</property>
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>node01:50070</value>
<description>nn1的http通信地址</description>
</property>
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>node02:9000</value>
<description>nn2的RPC通信地址</description>
</property>
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>node02:50070</value>
<description>nn2的http通信地址</description>
</property>
<!--JournalNode配置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node03:8485;node04:8485;node05:8485/ns</value>
<description>指定NameNode的edits元数据在JournalNode上的存放位置</description>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/journaldata</value>
<description>指定JournalNode在本地磁盘存放数据的位置</description>
</property>
<!--namenode高可用主备切换配置 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>开启NameNode失败自动切换</description>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<description>配置失败自动切换实现方式,使用内置的zkfc</description>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
<description>配置隔离机制,多个机制用换行分割,先执行sshfence,执行失败后执行shell(/bin/true),/bin/true会直接返回0表示成功</description>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
<description>使用sshfence隔离机制时需要ssh免登陆</description>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
<description>配置sshfence隔离机制超时时间</description>
</property>
<!--dfs文件属性设置-->
<property>
<name>dfs.replication</name>
<value>3</value>
<description>设置block副本数为3</description>
</property>
<property>
<name>dfs.block.size</name>
<value>134217728</value>
<description>设置block大小是128M</description>
</property>
</configuration>
yarn-site.xml
yarn的一些配置信息
由于我们是在虚拟机中配置,hadoop默认集群内存大小为8192MB,一般来说是不够的,需要加参数限制,见下方对内存的设置,当然土豪随意
<configuration>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id,一组高可用的rm共同的逻辑id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
</property>
<!-- 指定RM的名字,可以随便自定义 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node01</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>${yarn.resourcemanager.hostname.rm1}:8088</value>
<description>HTTP访问的端口号</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node02</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>${yarn.resourcemanager.hostname.rm2}:8088</value>
</property>
<!-- 指定zookeeper集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
<!--NodeManager上运行的附属服务,需配置成mapreduce_shuffle,才可运行MapReduce程序-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 开启日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志聚合HDFS目录 -->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/data/hadoop/yarn-logs</value>
</property>
<!-- 日志保存时间3days,单位秒 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>259200</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
<discription>单个任务可申请最少内存,默认1024MB</discription>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
<discription>nodemanager默认内存大小,默认为8192MB(value单位为MB)</discription>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
<discription>nodemanager cpu内核数</discription>
</property>
</configuration>
环境搭建
主机名 | IP | 安装软件 | 运行的进程 |
---|---|---|---|
node01 | 192.168.47.10 | JDK、Hadoop、Zookeeper | NameNode(Active)、DFSZKFailoverController(zkfc)、ResourceManager(Standby)、QuorumPeerMain(Zookeeper) |
node02 | 192.168.47.11 | JDK、Hadoop、Zookeeper | NameNode(Standby)、DFSZKFailoverController(zkfc)、ResourceManager(Active)、QuorumPeerMain(Zookeeper)、Jobhistory |
node03 | 192.168.47.12 | JDK、Hadoop、Zookeeper | DataNode、NodeManager、QuorumPeerMain(Zookeeper)、JournalNode |
node04 | 192.168.47.13 | JDK、Hadoop | DataNode、NodeManager、JournalNode |
node05 | 192.168.47.14 | JDK、Hadoop | DataNode、NodeManager、JournalNode |
本次环境搭建规划如下:
主机名 | IP | 安装软件 | 运行的进程 |
---|---|---|---|
node01 | 192.168.47.10 | JDK、Hadoop、Zookeeper | NameNode(Active)、DFSZKFailoverController(zkfc)、ResourceManager(Standby)、QuorumPeerMain(Zookeeper) |
node02 | 192.168.47.11 | JDK、Hadoop、Zookeeper | NameNode(Standby)、DFSZKFailoverController(zkfc)、ResourceManager(Active)、QuorumPeerMain(Zookeeper)、Jobhistory |
node03 | 192.168.47.12 | JDK、Hadoop、Zookeeper | DataNode、NodeManager、QuorumPeerMain(Zookeeper)、JournalNode |
node04 | 192.168.47.13 | JDK、Hadoop | DataNode、NodeManager、JournalNode |
node05 | 192.168.47.14 | JDK、Hadoop | DataNode、NodeManager、JournalNode |
搭建过程中,无特殊说明,均为使用hadoop用户
- 上传hadoop安装包,本次采用hadoop2.7.4版本
- 解压
tar -xzvf hadoop-2.7.4.tar.gz
目录放在hadoop用户家目录apps下 - 切换root用户,创建软链接
ln -s /home/hadoop/apps/hadoop-2.7.4 /usr/local/hadoop
- 修改属主
chown -R hadoop:hadoop /usr/local/hadoop
- 修改环境变量:
vim /etc/profile
,添加如下变量,其中,PATH为追加变量
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_HOME=$HADOOP_HOME
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- 编译环境变量
source /etc/profile
- 切换回hadoop用户,进入hadoop配置文件路径
cd /usr/local/hadoop/etc/hadoop
- 修改hadoop-env.sh中JAVA_HOME为jdk安装路径/快捷路径
- 配置core-site.xml为之前xml内容
- 配置hdfs-site.xml为之前内容
- 配置yarn-site.xml为之前内容
- 配置mapred-site.xml为如下内容(Hadoop安装文件中此文件给的为mapred-site.xml.template,需修改为mapred-site.xml)
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>指定mr框架为yarn方式 </description>
</property>
<!-- 历史日志服务jobhistory相关配置 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node02:10020</value>
<description>历史服务器端口号</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node02:19888</value>
<description>历史服务器的WEB UI端口号</description>
</property>
<property>
<name>mapreduce.jobhistory.joblist.cache.size</name>
<value>2000</value>
<description>内存中缓存的historyfile文件信息(主要是job对应的文件目录)</description>
</property>
</configuration>
- 手动创建指定的临时目录:
mkdir /usr/local/hadoop/hdpdata
- 修改slaves文件,设置datanode和nodemanager启动节点主机名称
在slaves文件中添加节点的主机名称
node03
node04
node05
配置hadoop用户免密码登录
需要配置集群之间的免密码登录
- 在所有节点产生秘钥及公钥
ssh-keygen -t rsa
- 在每个节点上,将公钥copy到node01
ssh-copy-id -i node01
- 将node01节点上的authorized_keys copy到其他节点
scp authorized_keys hadoop@node02:/home/hadoop/.ssh
- 每个节点分别尝试与其他节点的ssh登录,包括自己
ssh node01
,如果需要输入密码,则是第一次登录,输入就好
在其他节点配置hadoop
- 将配置好的hadoop安装目录copy到其他节点(切换到hadoop安装目录)
scp -r hadoop-2.7.4 hadoop@node02:/home/hadoop/apps
- 创建软链接,修改软链接属主
- 添加环境变量
至此,集群环境准备工作基本就绪,检查一下防火墙是否关闭(iptables -L),及SELinux的状态(getenforce),防止启动时出错
上图中,防火墙状态正常,但SELinux不对,设置SELinuxsetenforce 0
,再看状态变为Permissive
启动集群
- 切换回hadoop用户
- 启动journalnode(分别在node03、node04、node05上启动)
/usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode
启动成功后,jps
会看到多了如下进程JournalNode
- 格式化HDFS 在node01上执行命令
hdfs namenode -format
,格式化成功后会在core-site.xml中的hadoop.tmp.dir指定的路径下生成dfs文件夹,将该文件夹拷贝到node02的相同路径下
scp -r hdpdata hadoop@node02:/usr/local/hadoop
- 在node01上执行格式化ZKFC的操作
hdfs zkfc -formatZK
执行成功,日志输出如下信息
INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns in ZK
- 在node01上启动HDFS
sbin/start-dfs.sh
启动成功后,在node03、node04、node05会出现datanode进程,在node01、node02会出现NameNode进程及DFSZKFailoverController进程 - 在node02上启动YARN
sbin/start-yarn.sh
- 在node01单独启动一个ResourceManger作为备份节点
sbin/yarn-daemon.sh start resourcemanager
- 在node02上启动JobHistoryServer
sbin/mr-jobhistory-daemon.sh start historyserver
- 至此,hadoop启动完成
HDFS HTTP访问地址
NameNode (active):http://192.168.47.10:50070
NameNode (standby):http://192.168.47.11:50070
ResourceManager HTTP访问地址
ResourceManager :http://192.168.47.11:8088
历史日志HTTP访问地址
JobHistoryServer:http://192.168.47.11:19888
集群验证
- 验证HDFS 是否正常工作及HA高可用
- 向hdfs上传一个文件
hadoop fs -put /usr/local/hadoop/README.txt /
- 在active节点手动关闭active的namenode
sbin/hadoop-daemon.sh stop namenode
- 通过HTTP 50070端口查看standby namenode的状态是否转换为active,再手动启动上一步关闭的namenode
sbin/hadoop-daemon.sh start namenode
- 验证YARN是否正常工作及ResourceManager HA高可用
- 运行测试hadoop提供的demo中的WordCount程序:
hadoop fs -mkdir /wordcount
hadoop fs -mkdir /wordcount/input
hadoop fs -mv /README.txt /wordcount/input
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /wordcount/input /wordcount/output
注意:HDFS 上/wordcount/output 为输出路径不能存在,否则任务不能执行
- 验证ResourceManager HA
- 手动关闭node02的ResourceManager
sbin/yarn-daemon.sh stop resourcemanager
- 通过HTTP 8088端口访问node01的ResourceManager查看状态
- 手动启动node02 的ResourceManager
sbin/yarn-daemon.sh start resourcemanager
附录:
- 关闭Journalnode: hadoop目录下:
sbin/hadoop-daemon.sh stop journalnode
- 在刚开始搭建时,没有配置nodemanager内存大小,导致nodemanager启动不起来,查看日志,通过网络搜索,发现是内存不够,需要配置nodemanager的内存参数,见上文,内存参数为后来补充