共计 27288 个字符,预计需要花费 69 分钟才能阅读完成。
1、环境
CentOS7 Hadoop2.6.5 Zookeeper3.4.9 JDK1.8
master 作为 active 主机,data1 作为 standby 备用机,三台机器均作为数据节点,yarn 资源管理器在 master 上开启,在 data1 上备用,data1 上开启历史服务器
主要参考见下表
master | 192.168.1.215 | Namenode DataNode QuorumPeerMain ZKFC JournalNode ResourceManager NodeManager |
data1 | 192.168.1.218 | Namenode DataNode QuorumPeerMain ZKFC JournalNode ResourceManager NodeManager JobHistoryServer ApplicationHistoryServer |
data2 | 192.168.1.219 |
DataNode QuorumPeerMain JournalNode NodeManager |
2、zookeeper 集群的搭建
安装到 /usr/Apache 目录下,所有者与所属组均为 hadoop
tar -zxvf zookeeper-3.4.9.tar.gz -C /usr/Apache/ | |
ln -s zookeeper-3.4.9/ zookeeper | |
cd zookeeper/conf# 配置文件cp zoo_sample.cfg zoo.cfg |
# 编辑 zoo.cfg 的内容# The number of milliseconds of each tick | |
tickTime=2000 | |
# The number of ticks that the initial | |
# synchronization phase can take | |
initLimit=10 | |
# The number of ticks that can pass between | |
# sending a request and getting an acknowledgement | |
syncLimit=5 | |
# the directory where the snapshot is stored. | |
# do not use /tmp for storage, /tmp here is just | |
# example sakes. | |
dataDir=/usr/Apache/zookeeper/data | |
dataLogDir=/usr/Apache/zookeeper/data/log | |
# the port at which the clients will connect | |
clientPort=2181 | |
# the maximum number of client connections. | |
# increase this if you need to handle more clients | |
maxClientCnxns=60 | |
# | |
# Be sure to read the maintenance section of the | |
# administrator guide before turning on autopurge. | |
# | |
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance | |
# | |
# The number of snapshots to retain in dataDir | |
autopurge.snapRetainCount=3 | |
# Purge task interval in hours | |
# Set to "0" to disable auto purge feature | |
autopurge.purgeInterval=1 | |
# | |
server.1=master:2888:3888 | |
server.2=data1:2888:3888 | |
server.3=data2:2888:3888 |
一般采用默认值,重点是标蓝的地方。
数据的路径单独设,将日志分开,并且,不要放到默认的 tmp 文件夹下面,因为这个会定期删除
dataDir=/usr/Apache/zookeeper/data dataLogDir=/usr/Apache/zookeeper/data/log
将快照打开,并且设置 autopurge.purgeInterval=1, 与上面的不同,快照需要定期删除
增大客户端的连接数量maxClientCnxns=60
先安装到 master 下面,之后进行分发
scp -r zookeeper-3.4.9 data1:usr/Apache/ | |
scp -r zookeeper-3.4.9 data2:usr/Apache/ | |
# 注意所属组与所有者 | |
chown -R hadoop:hadoop zookeeper | |
# 三台机器分别启动 | |
zkServer.sh start | |
# 查看状态 | |
zkServer.sh status | |
# 最后,检查,关闭一个看是否自动选举 |
3、hadoop 以及 yarn 的高可用配置
先前安装过,主要是配置文件的修改,注意,如果不重新安装,需要删除一些文件 rm -rf tmp/* data/nn/* data/jn/* data/dn/* data/dn/* logs/*
上面的 data/nn data/jn data/dn data/dn 是自己建的一些文件,用于节点数据的存放。
重新安装也不麻烦,此处选择重新安装,目录选择 /usr/Apache,所有者与所属组均为 hadoop,环境变量如下:
更改环境变量,hadoop 用户下面的~/.bashrc 文件 | |
export HADOOP_HOME=/usr/Apache/hadoop | |
export ZOOKEEPER_HOME=/usr/Apache/zookeeper | |
export HADOOP_COMMON_HOME=$HADOOP_HOME | |
export HADOOP_HDFS_HOME=$HADOOP_HOME | |
export HADOOP_MAPRED_HOME=$HADOOP_HOME | |
export HADOOP_YARN_HOME=$HADOOP_HOME | |
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop | |
export CLASSPATH=.:$HADOOP_HOME/lib:$CLASSPATH | |
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin | |
# 之后 | |
source ~/.bashrc |
下面关键看配置
1> core-site.xml
<configuration> | |
<!--缓存文件存储的路径,可以这样写 file:/opt/mdisk/disk02/data/tmp,file:/opt/mdisk/disk01/data/tmp--> | |
<!--如果挂载多个数据盘,用逗号分开--> | |
<!--配置缓存文件的目录,注意另建新的文件夹 tmp,不要在 hadoop/tmp 下,因为会定期删除--> | |
<property> | |
<name>hadoop.tmp.dir</name> | |
<value>/usr/Apache/hadoop/data/tmp</value> | |
<description>A base for other temporary directories.</description> | |
</property> | |
<!--指定 nameservice 的名称,自定义,但后面必须保持一致--> | |
<property> | |
<name>fs.defaultFS</name> | |
<value>hdfs://nscluster</value> | |
</property> | |
<!-- 编辑日志文件存储的路径,这个也可以放到 hdfs-site.xml 中 --> | |
<property> | |
<name>dfs.journalnode.edits.dir</name> | |
<value>/usr/Apache/hadoop/data/jn</value> | |
</property> | |
<!--文件读写缓存大小,此处为 128kb--> | |
<property> | |
<name>io.file.buffer.size</name> | |
<value>131072</value> | |
</property> | |
<!--指定 zookeeper 地址,配置 HA 时需要,这个也可以放到 hdfs-site.xml 中--> | |
<!--<property> | |
<name>ha.zookeeper.quorum</name> | |
<value>master:2181,data1:2181,data2:2181</value> | |
</property>--> | |
<!--以下不是必须的--> | |
<!--配置 hdfs 文件被永久删除前保留的时间(单位:分钟),默认值为 0 表明垃圾回收站功能关闭--> | |
<!--<property> | |
<name>fs.trash.interval</name> | |
<value>0</value> | |
</property>--> | |
<!--指定可以在任何 IP 访问--> | |
<!--<property> | |
<name>hadoop.proxyuser.hduser.hosts</name> | |
<value>*</value> | |
</property>--> | |
<!--指定所有用户可以访问--> | |
<!--<property> | |
<name>hadoop.proxyuser.hduser.groups</name> | |
<value>*</value> | |
</property>--> | |
</configuration> |
这里要注意 hadoop.tmp.dir 这个属性,上面的注释也已经说了,一定不要放到暂时的 hadoop/tmp 中,而要放到永久的文件夹中,否则 namenode 的启动可能遇到问题。
上面一些注释掉的属性不是必须的,下面一样。
2> hdfs-site.xml
注意下面的 nscluster 是自定义的名称,并且被应用于多个属性中,部署使用时更改样式
<configuration> | |
<!--指定 hdfs 元数据存储的路径--> | |
<property> | |
<name>dfs.namenode.name.dir</name> | |
<value>file:/usr/Apache/hadoop/data/nn</value> | |
</property> | |
<!--指定 hdfs 数据存储的路径--> | |
<property> | |
<name>dfs.datanode.data.dir</name> | |
<value>file:/usr/Apache/hadoop/data/dn</value> | |
</property> | |
<!--开启 WebHDFS 功能(基于 REST 的接口服务)--> | |
<property> | |
<name>dfs.webhdfs.enabled</name> | |
<value>true</value> | |
</property> | |
<!-- 数据备份的个数 --> | |
<property> | |
<name>dfs.replication</name> | |
<value>3</value> | |
</property> | |
<!--关闭权限验证 --> | |
<property> | |
<name>dfs.permissions.enabled</name> | |
<value>false</value> | |
</property> | |
<!--DateNode 上的服务线程数,处理 rpc,默认为 10,可以调大--> | |
<property> | |
<name>dfs.datanode.handler.count</name> | |
<value>200</value> | |
</property> | |
<!--文件操作的线程数,如果处理文件有很多,则调大,建议值 8192--> | |
<property> | |
<name>dfs.datanode.max.transfer.threads</name> | |
<value>8192</value> | |
</property> | |
<!--不用的数据节点,添加到 excludes 文件,方法同 slaves 文件,之后执行 hadoop dfsadmin -refreshNodes 命令--> | |
<property> | |
<name>dfs.hosts.exclude</name> | |
<value>/usr/Apache/hadoop/etc/hadoop/excludes</value> | |
</property> | |
<!--以下为 ha 的相关配置--> | |
<!-- 指定 hdfs 的 nameservice 的名称为 nscluster,务必与 core-site.xml 中的逻辑名称相同 --> | |
<property> | |
<name>dfs.nameservices</name> | |
<value>nscluster</value> | |
</property> | |
<!-- 指定 nscluster 的两个 namenode 的名称,分别是 nn1,nn2,注意后面的后缀.nscluster,这个是自定义的,如果逻辑名称为 nsc,则后缀为.nsc,下面一样 --> | |
<property> | |
<name>dfs.ha.namenodes.nscluster</name> | |
<value>nn1,nn2</value> | |
</property> | |
<!-- 配置 nn1,nn2 的 rpc 通信 端口 --> | |
<property> | |
<name>dfs.namenode.rpc-address.nscluster.nn1</name> | |
<value>master:9000</value> | |
</property> | |
<property> | |
<name>dfs.namenode.rpc-address.nscluster.nn2</name> | |
<value>data1:9000</value> | |
</property> | |
<!-- 配置 nn1,nn2 的 http 访问端口 --> | |
<property> | |
<name>dfs.namenode.http-address.nscluster.nn1</name> | |
<value>master:50070</value> | |
</property> | |
<property> | |
<name>dfs.namenode.http-address.nscluster.nn2</name> | |
<value>data1:50070</value> | |
</property> | |
<!-- 指定 namenode 的元数据存储在 journalnode 中的路径 --> | |
<property> | |
<name>dfs.namenode.shared.edits.dir</name> | |
<value>qjournal://master:8485;data1:8485;data2:8485/nscluster</value> | |
</property> | |
<!-- 开启失败故障自动转移 --> | |
<property> | |
<name>dfs.ha.automatic-failover.enabled</name> | |
<value>true</value> | |
</property> | |
<!-- 配置失败自动切换的方式 --> | |
<property> | |
<name>dfs.client.failover.proxy.provider.nscluster</name> | |
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> | |
</property> | |
<!-- 配置 zookeeper 地址,如果已经在 core-site.xml 中配置了,这里不是必须的 --> | |
<property> | |
<name>ha.zookeeper.quorum</name> | |
<value>master:2181,data1:2181,data2:2181</value> | |
</property> | |
<!-- 配置隔离机制 --> | |
<property> | |
<name>dfs.ha.fencing.methods</name> | |
<value>sshfence</value> | |
</property> | |
<!-- 指定秘钥的位置 --> | |
<property> | |
<name>dfs.ha.fencing.ssh.private-key-files</name> | |
<value>/home/hadoop/.ssh/id_rsa</value> | |
</property> | |
<!--配置 sshfence 隔离机制超时时间--> | |
<property> | |
<name>dfs.ha.fencing.ssh.connect-timeout</name> | |
<value>30000</value> | |
</property> | |
<!--保证数据恢复--> | |
<!--<property> | |
<name>dfs.journalnode.http-address</name> | |
<value>0.0.0.0:8480</value> | |
</property>--> | |
<!--<property> | |
<name>dfs.journalnode.rpc-address</name> | |
<value>0.0.0.0:8485</value> | |
</property> --> | |
</configuration> |
3> mapred-site.xml
<configuration> | |
<property> | |
<name>mapreduce.framework.name</name> | |
<value>yarn</value> | |
</property> | |
<!--配置 MapReduce JobHistory Server 地址,默认端口 10020--> | |
<property> | |
<name>mapreduce.jobhistory.address</name> | |
<value>0.0.0.0:10020</value> | |
</property> | |
<!--配置 MapReduce JobHistory Server web ui 地址,默认端口 19888--> | |
<property> | |
<name>mapreduce.jobhistory.webapp.address</name> | |
<value>0.0.0.0:19888</value> | |
</property> | |
<!--不用的数据节点,添加到 excludes 文件,之后执行 hadoop dfsadmin -refreshNodes 命令,--> | |
<!--协同 hdfs-site.xml 中的 dfs.hosts.exclude 属性--> | |
<property> | |
<name>mapred.hosts.exclude</name> | |
<value>/usr/Apache/hadoop/etc/hadoop/excludes</value> | |
</property> | |
<property> | |
<name>mapreduce.job.ubertask.enable</name> | |
<value>true</value> | |
</property> | |
</configuration> |
注意上面 0.0.0.0:19888 这种写法,不能简单的写为 19888,否则历史服务器不能访问
————————————– 分割线 ————————————–
下面关于 Hadoop 的文��您也可能喜欢,不妨看看:
Ubuntu14.04 下 Hadoop2.4.1 单机 / 伪分布式安装配置教程 http://www.linuxidc.com/Linux/2015-02/113487.htm
CentOS 安装和配置 Hadoop2.2.0 http://www.linuxidc.com/Linux/2014-01/94685.htm
CentOS 6.3 下 Hadoop 伪分布式平台搭建 http://www.linuxidc.com/Linux/2016-11/136789.htm
Ubuntu 14.04 LTS 下安装 Hadoop 1.2.1(伪分布模式)http://www.linuxidc.com/Linux/2016-09/135406.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
实战 CentOS 系统部署 Hadoop 集群服务 http://www.linuxidc.com/Linux/2016-11/137246.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
Hadoop 2.6.0 HA 高可用集群配置详解 http://www.linuxidc.com/Linux/2016-08/134180.htm
Spark 1.5、Hadoop 2.7 集群环境搭建 http://www.linuxidc.com/Linux/2016-09/135067.htm
————————————– 分割线 ————————————–
4> yarn-site.xml
<configuration> | |
<!-- Site specific YARN configuration properties --> | |
<!--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> | |
<!-- 日志删除时间 - 1 禁用,单位为秒 --> | |
<property> | |
<name>yarn.log-aggregation.retain-seconds</name> | |
<value>604800</value> | |
</property> | |
<!--修改日志目录 hdfs://mycluster/var/log/hadoop-yarn/apps,当应用程序运行结束后,日志被转移到的 HDFS 目录(启用日志聚集功能时有效)--> | |
<property> | |
<name>yarn.nodemanager.remote-app-log-dir</name> | |
<value>/logs</value> | |
</property> | |
<!-- yarn 内存,配置 nodemanager 可用的资源内存 --> | |
<!--<property> | |
<name>yarn.nodemanager.resource.memory-mb</name> | |
<value>8192</value> | |
</property>--> | |
<!-- yarn cpu,配置 nodemanager 可用的资源 CPU --> | |
<!--<property> | |
<name>yarn.nodemanager.resource.cpu-vcores</name> | |
<value>8</value> | |
</property>--> | |
<!--以下为 ha 配置--> | |
<!-- 开启 yarn ha --> | |
<property> | |
<name>yarn.resourcemanager.ha.enabled</name> | |
<value>true</value> | |
</property> | |
<!-- 指定 yarn ha 的名称 --> | |
<property> | |
<name>yarn.resourcemanager.cluster-id</name> | |
<value>nscluster-yarn</value> | |
</property> | |
<!--启用自动故障转移--> | |
<property> | |
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>?? | |
<value>true</value> | |
</property> | |
<!-- resourcemanager 的两个名称 --> | |
<property> | |
<name>yarn.resourcemanager.ha.rm-ids</name> | |
<value>rm1,rm2</value> | |
</property> | |
<!-- 配置 rm1、rm2 的主机 --> | |
<property> | |
<name>yarn.resourcemanager.hostname.rm1</name> | |
<value>master</value> | |
</property> | |
<property> | |
<name>yarn.resourcemanager.hostname.rm2</name> | |
<value>data1</value> | |
</property> | |
<!-- 配置 yarn web 访问的端口 --> | |
<property> | |
<name>yarn.resourcemanager.webapp.address.rm1</name> | |
<value>master:8088</value> | |
</property> | |
<property> | |
<name>yarn.resourcemanager.webapp.address.rm2</name> | |
<value>data1:8088</value> | |
</property> | |
<!-- 配置 zookeeper 的地址 --> | |
<property> | |
<name>yarn.resourcemanager.zk-address</name> | |
<value>master:2181,data1:2181,data2:2181</value> | |
</property> | |
<!-- 配置 zookeeper 的存储位置 --> | |
<property> | |
<name>yarn.resourcemanager.zk-state-store.parent-path</name> | |
<value>/rmstore</value> | |
</property> | |
<!-- yarn restart--> | |
<!-- 开启 resourcemanager restart --> | |
<property> | |
<name>yarn.resourcemanager.recovery.enabled</name> | |
<value>true</value> | |
</property> | |
<!-- 配置 resourcemanager 的状态存储到 zookeeper 中 --> | |
<property> | |
<name>yarn.resourcemanager.store.class</name> | |
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> | |
</property> | |
<!-- 开启 nodemanager restart --> | |
<property> | |
<name>yarn.nodemanager.recovery.enabled</name> | |
<value>true</value> | |
</property> | |
<!-- 配置 rpc 的通信端口 --> | |
<property> | |
<name>yarn.nodemanager.address</name> | |
<value>0.0.0.0:45454</value> | |
</property> | |
<!--配置 Web Application Proxy 安全代理(防止 yarn 被攻击)--> | |
<property> | |
<name>yarn.web-proxy.address</name> | |
<value>0.0.0.0:8888</value> | |
</property> | |
</configuration> |
注意:
A. yarn.nodemanager.address 这个属性 0.0.0.0:45454,在 2.6 的版本中不要只写成 45454,否则会导致 nodemanager 启动不了
B. yarn.nodemanager.resource.memory-mb 与 yarn.nodemanager.resource.cpu-vcores 这两个属性,可以默认,在目前的 hadoop 版本中,如果设置不当,会导致 mapreduce 程序呈现 accepted 但是不能 run 的状态。在试验中,2cpu,1G 内存的配置就出现了这种情况。当设置为 8cpu,8G 内存时却正常了,即使这不是机器的真实配置。针对这种情况,另一个解决方案是添加 yarn.scheduler.minimum-allocation-mb 这个属性:
<property> | |
<name>yarn.nodemanager.resource.memory-mb</name> | |
<value>2200</value> | |
<description>Amount of physical memory, in MB, that can be allocated for containers.</description> | |
</property> | |
<property> | |
<name>yarn.scheduler.minimum-allocation-mb</name> | |
<value>500</value> | |
</property> |
由于资源问题而导致的这种情况可参考以下:
http://stackoverflow.com/questions/20200636/mapreduce-jobs-get-stuck-in-accepted-state
http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.0.9.1/bk_installing_manually_book/content/rpm-chap1-11.html
http://zh.hortonworks.com/blog/how-to-plan-and-configure-yarn-in-hdp-2-0/
C. 如果日志设置不当,也会出现 maprduce 不能运行的情况。将 yarn.log-aggregation-enable 属性设置为 true,开启日志聚集功能,则需要设置 yarn.nodemanager.remote-app-log-dir 属性,即聚集后的日志存放的路径。注意上面将属性设置为 /logs,标识的是在 hdfs 中的目录(不需要自己建立,系统需要时自己会根据配置文件创建),而非本地。下图显示了程序运行后生成的日志:
5> hadoop-env.sh
设置一些重要的环境变量,设置内存的大小等,视情况而定
export JAVA_HOME=/usr/java/jdk | |
export HADOOP_PORTMAP_OPTS="-Xmx1024m $HADOOP_PORTMAP_OPTS" | |
export HADOOP_CLIENT_OPTS="-Xmx1024m $HADOOP_CLIENT_OPTS".............. |
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-12/138430p2.htm
6> 其他
在 slaves 文件中添加 master,data1,data2 三个名字,另外需要创建在配置文件中出现的一些目录和文件:
etc/Hadoop/excludes,hadoop2.6.5/data/nn,data/tmp,data/jn,data/dn,同时设置好这些文件的权限以及所有者和所属组。
4、集群启动
1> 确定启动 zookeeper
zkServer.sh start
2> 启动 journalnode,新安装的需要三台机器分别启动
hadoop-daemons.sh start journalnode
3> 启动 master 的 namenode
hadoop-daemon.sh start namenode
4> 同步 data1 的 namenode
hdfs namenode -bootstrapStandby | |
hadoop-daemon.sh start namenode |
在 data1 上执行以上命令后,master 与 data1 节点此时仍然会是 standby 状态
5> 格式化 ZKFC,这一步可以提前运行,不是必须按此顺序,但前提是开启了 zookeeper,并且在 hadoop 的配置文件中设置开启了故障自动转移
hdfs zkfc -formatZK
在 master 上运行即可。
6> 三台机器分别启动 datanode
hadoop-daemons.sh start datanode
7> 开启 zkfc,这时查看一下,dfs 应该会正常启动了,一般率先启动 zkfc 的机器会作为 active 节点
hadoop-daemons.sh start zkfc
先在 master 上开启,后在 data1 上开启
8> 开启 yarn
start-yarh.sh | |
# 或者单独启动 | |
yarn-daemon.sh start resourcemanager | |
yarn-daemon.sh start nodemanager |
此处在 master 上运行 start-yarh.sh,在 data1 上运行yarn-daemon.sh start resourcemanager,让 data1 作为资源管理器的备选节点。
9> 其他
mr-jobhistory-daemon.sh start historyserver | |
yarn-daemon.sh start historyserver |
开启历史服务器,此处在 data1 上运行
10> 结果
master
data1
data2
访问 192.168.1.215:50070
master 处于 active 状态
访问 192.168.1.218:50070
data1 处于 standby 状态
访问 192.168.1.215:8088
访问 192.168.1.218:8088
提示:This is standby RM. Redirecting to the current active RM: http://master:8088/cluster
最后进行测试,在任一机器上运行以下命令
yarn jar ~/c02mrtest.jar com.mr.test.MRWeb /TestData/webcount.txt /DataWorld/webresult5 128 1
运行结果:
附: 常用命令
# journalnodehadoop-daemons.sh start journalnodehadoop-daemons.sh stop journalnode# namenode | |
hadoop namenode -format | |
hadoop-daemon.sh start namenode | |
hadoop-daemon.sh stop namenode# 同步 | |
hdfs namenode -bootstrapStandby | |
hadoop-daemon.sh start namenode# datanodehadoop-daemons.sh start datanode | |
hadoop-daemons.sh stop datanode# zookeeper 以及 zkfc | |
zkServer.sh startzkServer.sh stop | |
hdfs zkfc -formatZK | |
hadoop-daemons.sh start zkfc | |
hadoop-daemons.sh stop zkfc# yarn | |
yarn-daemon.sh start resourcemanager | |
yarn-daemon.sh stop resourcemanager | |
yarn-daemon.sh start nodemanageryarn-daemon.sh stop nodemanageryarn-daemon.sh start proxyserver | |
yarn-daemon.sh stop proxyserver | |
mr-jobhistory-daemon.sh start historyserver | |
mr-jobhistory-daemon.sh stop historyserver | |
yarn-daemon.sh start historyserver | |
yarn-daemon.sh stop historyserver# rm1 rm2 为配置文件中设定的资源管理器名称yarn rmadmin -getServiceState rm1 yarn rmadmin -getServiceState rm2 start-dfs.shstop-dfs.shstart-yarn.shstop-yarn.sh |
更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-12/138430.htm
1、环境
CentOS7 Hadoop2.6.5 Zookeeper3.4.9 JDK1.8
master 作为 active 主机,data1 作为 standby 备用机,三台机器均作为数据节点,yarn 资源管理器在 master 上开启,在 data1 上备用,data1 上开启历史服务器
主要参考见下表
master | 192.168.1.215 | Namenode DataNode QuorumPeerMain ZKFC JournalNode ResourceManager NodeManager |
data1 | 192.168.1.218 | Namenode DataNode QuorumPeerMain ZKFC JournalNode ResourceManager NodeManager JobHistoryServer ApplicationHistoryServer |
data2 | 192.168.1.219 |
DataNode QuorumPeerMain JournalNode NodeManager |
2、zookeeper 集群的搭建
安装到 /usr/Apache 目录下,所有者与所属组均为 hadoop
tar -zxvf zookeeper-3.4.9.tar.gz -C /usr/Apache/ | |
ln -s zookeeper-3.4.9/ zookeeper | |
cd zookeeper/conf# 配置文件cp zoo_sample.cfg zoo.cfg |
# 编辑 zoo.cfg 的内容# The number of milliseconds of each tick | |
tickTime=2000 | |
# The number of ticks that the initial | |
# synchronization phase can take | |
initLimit=10 | |
# The number of ticks that can pass between | |
# sending a request and getting an acknowledgement | |
syncLimit=5 | |
# the directory where the snapshot is stored. | |
# do not use /tmp for storage, /tmp here is just | |
# example sakes. | |
dataDir=/usr/Apache/zookeeper/data | |
dataLogDir=/usr/Apache/zookeeper/data/log | |
# the port at which the clients will connect | |
clientPort=2181 | |
# the maximum number of client connections. | |
# increase this if you need to handle more clients | |
maxClientCnxns=60 | |
# | |
# Be sure to read the maintenance section of the | |
# administrator guide before turning on autopurge. | |
# | |
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance | |
# | |
# The number of snapshots to retain in dataDir | |
autopurge.snapRetainCount=3 | |
# Purge task interval in hours | |
# Set to "0" to disable auto purge feature | |
autopurge.purgeInterval=1 | |
# | |
server.1=master:2888:3888 | |
server.2=data1:2888:3888 | |
server.3=data2:2888:3888 |
一般采用默认值,重点是标蓝的地方。
数据的路径单独设,将日志分开,并且,不要放到默认的 tmp 文件夹下面,因为这个会定期删除
dataDir=/usr/Apache/zookeeper/data dataLogDir=/usr/Apache/zookeeper/data/log
将快照打开,并且设置 autopurge.purgeInterval=1, 与上面的不同,快照需要定期删除
增大客户端的连接数量maxClientCnxns=60
先安装到 master 下面,之后进行分发
scp -r zookeeper-3.4.9 data1:usr/Apache/ | |
scp -r zookeeper-3.4.9 data2:usr/Apache/ | |
# 注意所属组与所有者 | |
chown -R hadoop:hadoop zookeeper | |
# 三台机器分别启动 | |
zkServer.sh start | |
# 查看状态 | |
zkServer.sh status | |
# 最后,检查,关闭一个看是否自动选举 |
3、hadoop 以及 yarn 的高可用配置
先前安装过,主要是配置文件的修改,注意,如果不重新安装,需要删除一些文件 rm -rf tmp/* data/nn/* data/jn/* data/dn/* data/dn/* logs/*
上面的 data/nn data/jn data/dn data/dn 是自己建的一些文件,用于节点数据的存放。
重新安装也不麻烦,此处选择重新安装,目录选择 /usr/Apache,所有者与所属组均为 hadoop,环境变量如下:
更改环境变量,hadoop 用户下面的~/.bashrc 文件 | |
export HADOOP_HOME=/usr/Apache/hadoop | |
export ZOOKEEPER_HOME=/usr/Apache/zookeeper | |
export HADOOP_COMMON_HOME=$HADOOP_HOME | |
export HADOOP_HDFS_HOME=$HADOOP_HOME | |
export HADOOP_MAPRED_HOME=$HADOOP_HOME | |
export HADOOP_YARN_HOME=$HADOOP_HOME | |
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop | |
export CLASSPATH=.:$HADOOP_HOME/lib:$CLASSPATH | |
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin | |
# 之后 | |
source ~/.bashrc |
下面关键看配置
1> core-site.xml
<configuration> | |
<!--缓存文件存储的路径,可以这样写 file:/opt/mdisk/disk02/data/tmp,file:/opt/mdisk/disk01/data/tmp--> | |
<!--如果挂载多个数据盘,用逗号分开--> | |
<!--配置缓存文件的目录,注意另建新的文件夹 tmp,不要在 hadoop/tmp 下,因为会定期删除--> | |
<property> | |
<name>hadoop.tmp.dir</name> | |
<value>/usr/Apache/hadoop/data/tmp</value> | |
<description>A base for other temporary directories.</description> | |
</property> | |
<!--指定 nameservice 的名称,自定义,但后面必须保持一致--> | |
<property> | |
<name>fs.defaultFS</name> | |
<value>hdfs://nscluster</value> | |
</property> | |
<!-- 编辑日志文件存储的路径,这个也可以放到 hdfs-site.xml 中 --> | |
<property> | |
<name>dfs.journalnode.edits.dir</name> | |
<value>/usr/Apache/hadoop/data/jn</value> | |
</property> | |
<!--文件读写缓存大小,此处为 128kb--> | |
<property> | |
<name>io.file.buffer.size</name> | |
<value>131072</value> | |
</property> | |
<!--指定 zookeeper 地址,配置 HA 时需要,这个也可以放到 hdfs-site.xml 中--> | |
<!--<property> | |
<name>ha.zookeeper.quorum</name> | |
<value>master:2181,data1:2181,data2:2181</value> | |
</property>--> | |
<!--以下不是必须的--> | |
<!--配置 hdfs 文件被永久删除前保留的时间(单位:分钟),默认值为 0 表明垃圾回收站功能关闭--> | |
<!--<property> | |
<name>fs.trash.interval</name> | |
<value>0</value> | |
</property>--> | |
<!--指定可以在任何 IP 访问--> | |
<!--<property> | |
<name>hadoop.proxyuser.hduser.hosts</name> | |
<value>*</value> | |
</property>--> | |
<!--指定所有用户可以访问--> | |
<!--<property> | |
<name>hadoop.proxyuser.hduser.groups</name> | |
<value>*</value> | |
</property>--> | |
</configuration> |
这里要注意 hadoop.tmp.dir 这个属性,上面的注释也已经说了,一定不要放到暂时的 hadoop/tmp 中,而要放到永久的文件夹中,否则 namenode 的启动可能遇到问题。
上面一些注释掉的属性不是必须的,下面一样。
2> hdfs-site.xml
注意下面的 nscluster 是自定义的名称,并且被应用于多个属性中,部署使用时更改样式
<configuration> | |
<!--指定 hdfs 元数据存储的路径--> | |
<property> | |
<name>dfs.namenode.name.dir</name> | |
<value>file:/usr/Apache/hadoop/data/nn</value> | |
</property> | |
<!--指定 hdfs 数据存储的路径--> | |
<property> | |
<name>dfs.datanode.data.dir</name> | |
<value>file:/usr/Apache/hadoop/data/dn</value> | |
</property> | |
<!--开启 WebHDFS 功能(基于 REST 的接口服务)--> | |
<property> | |
<name>dfs.webhdfs.enabled</name> | |
<value>true</value> | |
</property> | |
<!-- 数据备份的个数 --> | |
<property> | |
<name>dfs.replication</name> | |
<value>3</value> | |
</property> | |
<!--关闭权限验证 --> | |
<property> | |
<name>dfs.permissions.enabled</name> | |
<value>false</value> | |
</property> | |
<!--DateNode 上的服务线程数,处理 rpc,默认为 10,可以调大--> | |
<property> | |
<name>dfs.datanode.handler.count</name> | |
<value>200</value> | |
</property> | |
<!--文件操作的线程数,如果处理文件有很多,则调大,建议值 8192--> | |
<property> | |
<name>dfs.datanode.max.transfer.threads</name> | |
<value>8192</value> | |
</property> | |
<!--不用的数据节点,添加到 excludes 文件,方法同 slaves 文件,之后执行 hadoop dfsadmin -refreshNodes 命令--> | |
<property> | |
<name>dfs.hosts.exclude</name> | |
<value>/usr/Apache/hadoop/etc/hadoop/excludes</value> | |
</property> | |
<!--以下为 ha 的相关配置--> | |
<!-- 指定 hdfs 的 nameservice 的名称为 nscluster,务必与 core-site.xml 中的逻辑名称相同 --> | |
<property> | |
<name>dfs.nameservices</name> | |
<value>nscluster</value> | |
</property> | |
<!-- 指定 nscluster 的两个 namenode 的名称,分别是 nn1,nn2,注意后面的后缀.nscluster,这个是自定义的,如果逻辑名称为 nsc,则后缀为.nsc,下面一样 --> | |
<property> | |
<name>dfs.ha.namenodes.nscluster</name> | |
<value>nn1,nn2</value> | |
</property> | |
<!-- 配置 nn1,nn2 的 rpc 通信 端口 --> | |
<property> | |
<name>dfs.namenode.rpc-address.nscluster.nn1</name> | |
<value>master:9000</value> | |
</property> | |
<property> | |
<name>dfs.namenode.rpc-address.nscluster.nn2</name> | |
<value>data1:9000</value> | |
</property> | |
<!-- 配置 nn1,nn2 的 http 访问端口 --> | |
<property> | |
<name>dfs.namenode.http-address.nscluster.nn1</name> | |
<value>master:50070</value> | |
</property> | |
<property> | |
<name>dfs.namenode.http-address.nscluster.nn2</name> | |
<value>data1:50070</value> | |
</property> | |
<!-- 指定 namenode 的元数据存储在 journalnode 中的路径 --> | |
<property> | |
<name>dfs.namenode.shared.edits.dir</name> | |
<value>qjournal://master:8485;data1:8485;data2:8485/nscluster</value> | |
</property> | |
<!-- 开启失败故障自动转移 --> | |
<property> | |
<name>dfs.ha.automatic-failover.enabled</name> | |
<value>true</value> | |
</property> | |
<!-- 配置失败自动切换的方式 --> | |
<property> | |
<name>dfs.client.failover.proxy.provider.nscluster</name> | |
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> | |
</property> | |
<!-- 配置 zookeeper 地址,如果已经在 core-site.xml 中配置了,这里不是必须的 --> | |
<property> | |
<name>ha.zookeeper.quorum</name> | |
<value>master:2181,data1:2181,data2:2181</value> | |
</property> | |
<!-- 配置隔离机制 --> | |
<property> | |
<name>dfs.ha.fencing.methods</name> | |
<value>sshfence</value> | |
</property> | |
<!-- 指定秘钥的位置 --> | |
<property> | |
<name>dfs.ha.fencing.ssh.private-key-files</name> | |
<value>/home/hadoop/.ssh/id_rsa</value> | |
</property> | |
<!--配置 sshfence 隔离机制超时时间--> | |
<property> | |
<name>dfs.ha.fencing.ssh.connect-timeout</name> | |
<value>30000</value> | |
</property> | |
<!--保证数据恢复--> | |
<!--<property> | |
<name>dfs.journalnode.http-address</name> | |
<value>0.0.0.0:8480</value> | |
</property>--> | |
<!--<property> | |
<name>dfs.journalnode.rpc-address</name> | |
<value>0.0.0.0:8485</value> | |
</property> --> | |
</configuration> |
3> mapred-site.xml
<configuration> | |
<property> | |
<name>mapreduce.framework.name</name> | |
<value>yarn</value> | |
</property> | |
<!--配置 MapReduce JobHistory Server 地址,默认端口 10020--> | |
<property> | |
<name>mapreduce.jobhistory.address</name> | |
<value>0.0.0.0:10020</value> | |
</property> | |
<!--配置 MapReduce JobHistory Server web ui 地址,默认端口 19888--> | |
<property> | |
<name>mapreduce.jobhistory.webapp.address</name> | |
<value>0.0.0.0:19888</value> | |
</property> | |
<!--不用的数据节点,添加到 excludes 文件,之后执行 hadoop dfsadmin -refreshNodes 命令,--> | |
<!--协同 hdfs-site.xml 中的 dfs.hosts.exclude 属性--> | |
<property> | |
<name>mapred.hosts.exclude</name> | |
<value>/usr/Apache/hadoop/etc/hadoop/excludes</value> | |
</property> | |
<property> | |
<name>mapreduce.job.ubertask.enable</name> | |
<value>true</value> | |
</property> | |
</configuration> |
注意上面 0.0.0.0:19888 这种写法,不能简单的写为 19888,否则历史服务器不能访问
————————————– 分割线 ————————————–
下面关于 Hadoop 的文��您也可能喜欢,不妨看看:
Ubuntu14.04 下 Hadoop2.4.1 单机 / 伪分布式安装配置教程 http://www.linuxidc.com/Linux/2015-02/113487.htm
CentOS 安装和配置 Hadoop2.2.0 http://www.linuxidc.com/Linux/2014-01/94685.htm
CentOS 6.3 下 Hadoop 伪分布式平台搭建 http://www.linuxidc.com/Linux/2016-11/136789.htm
Ubuntu 14.04 LTS 下安装 Hadoop 1.2.1(伪分布模式)http://www.linuxidc.com/Linux/2016-09/135406.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
实战 CentOS 系统部署 Hadoop 集群服务 http://www.linuxidc.com/Linux/2016-11/137246.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
Hadoop 2.6.0 HA 高可用集群配置详解 http://www.linuxidc.com/Linux/2016-08/134180.htm
Spark 1.5、Hadoop 2.7 集群环境搭建 http://www.linuxidc.com/Linux/2016-09/135067.htm
————————————– 分割线 ————————————–
4> yarn-site.xml
<configuration> | |
<!-- Site specific YARN configuration properties --> | |
<!--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> | |
<!-- 日志删除时间 - 1 禁用,单位为秒 --> | |
<property> | |
<name>yarn.log-aggregation.retain-seconds</name> | |
<value>604800</value> | |
</property> | |
<!--修改日志目录 hdfs://mycluster/var/log/hadoop-yarn/apps,当应用程序运行结束后,日志被转移到的 HDFS 目录(启用日志聚集功能时有效)--> | |
<property> | |
<name>yarn.nodemanager.remote-app-log-dir</name> | |
<value>/logs</value> | |
</property> | |
<!-- yarn 内存,配置 nodemanager 可用的资源内存 --> | |
<!--<property> | |
<name>yarn.nodemanager.resource.memory-mb</name> | |
<value>8192</value> | |
</property>--> | |
<!-- yarn cpu,配置 nodemanager 可用的资源 CPU --> | |
<!--<property> | |
<name>yarn.nodemanager.resource.cpu-vcores</name> | |
<value>8</value> | |
</property>--> | |
<!--以下为 ha 配置--> | |
<!-- 开启 yarn ha --> | |
<property> | |
<name>yarn.resourcemanager.ha.enabled</name> | |
<value>true</value> | |
</property> | |
<!-- 指定 yarn ha 的名称 --> | |
<property> | |
<name>yarn.resourcemanager.cluster-id</name> | |
<value>nscluster-yarn</value> | |
</property> | |
<!--启用自动故障转移--> | |
<property> | |
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>?? | |
<value>true</value> | |
</property> | |
<!-- resourcemanager 的两个名称 --> | |
<property> | |
<name>yarn.resourcemanager.ha.rm-ids</name> | |
<value>rm1,rm2</value> | |
</property> | |
<!-- 配置 rm1、rm2 的主机 --> | |
<property> | |
<name>yarn.resourcemanager.hostname.rm1</name> | |
<value>master</value> | |
</property> | |
<property> | |
<name>yarn.resourcemanager.hostname.rm2</name> | |
<value>data1</value> | |
</property> | |
<!-- 配置 yarn web 访问的端口 --> | |
<property> | |
<name>yarn.resourcemanager.webapp.address.rm1</name> | |
<value>master:8088</value> | |
</property> | |
<property> | |
<name>yarn.resourcemanager.webapp.address.rm2</name> | |
<value>data1:8088</value> | |
</property> | |
<!-- 配置 zookeeper 的地址 --> | |
<property> | |
<name>yarn.resourcemanager.zk-address</name> | |
<value>master:2181,data1:2181,data2:2181</value> | |
</property> | |
<!-- 配置 zookeeper 的存储位置 --> | |
<property> | |
<name>yarn.resourcemanager.zk-state-store.parent-path</name> | |
<value>/rmstore</value> | |
</property> | |
<!-- yarn restart--> | |
<!-- 开启 resourcemanager restart --> | |
<property> | |
<name>yarn.resourcemanager.recovery.enabled</name> | |
<value>true</value> | |
</property> | |
<!-- 配置 resourcemanager 的状态存储到 zookeeper 中 --> | |
<property> | |
<name>yarn.resourcemanager.store.class</name> | |
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> | |
</property> | |
<!-- 开启 nodemanager restart --> | |
<property> | |
<name>yarn.nodemanager.recovery.enabled</name> | |
<value>true</value> | |
</property> | |
<!-- 配置 rpc 的通信端口 --> | |
<property> | |
<name>yarn.nodemanager.address</name> | |
<value>0.0.0.0:45454</value> | |
</property> | |
<!--配置 Web Application Proxy 安全代理(防止 yarn 被攻击)--> | |
<property> | |
<name>yarn.web-proxy.address</name> | |
<value>0.0.0.0:8888</value> | |
</property> | |
</configuration> |
注意:
A. yarn.nodemanager.address 这个属性 0.0.0.0:45454,在 2.6 的版本中不要只写成 45454,否则会导致 nodemanager 启动不了
B. yarn.nodemanager.resource.memory-mb 与 yarn.nodemanager.resource.cpu-vcores 这两个属性,可以默认,在目前的 hadoop 版本中,如果设置不当,会导致 mapreduce 程序呈现 accepted 但是不能 run 的状态。在试验中,2cpu,1G 内存的配置就出现了这种情况。当设置为 8cpu,8G 内存时却正常了,即使这不是机器的真实配置。针对这种情况,另一个解决方案是添加 yarn.scheduler.minimum-allocation-mb 这个属性:
<property> | |
<name>yarn.nodemanager.resource.memory-mb</name> | |
<value>2200</value> | |
<description>Amount of physical memory, in MB, that can be allocated for containers.</description> | |
</property> | |
<property> | |
<name>yarn.scheduler.minimum-allocation-mb</name> | |
<value>500</value> | |
</property> |
由于资源问题而导致的这种情况可参考以下:
http://stackoverflow.com/questions/20200636/mapreduce-jobs-get-stuck-in-accepted-state
http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.0.9.1/bk_installing_manually_book/content/rpm-chap1-11.html
http://zh.hortonworks.com/blog/how-to-plan-and-configure-yarn-in-hdp-2-0/
C. 如果日志设置不当,也会出现 maprduce 不能运行的情况。将 yarn.log-aggregation-enable 属性设置为 true,开启日志聚集功能,则需要设置 yarn.nodemanager.remote-app-log-dir 属性,即聚集后的日志存放的路径。注意上面将属性设置为 /logs,标识的是在 hdfs 中的目录(不需要自己建立,系统需要时自己会根据配置文件创建),而非本地。下图显示了程序运行后生成的日志:
5> hadoop-env.sh
设置一些重要的环境变量,设置内存的大小等,视情况而定
export JAVA_HOME=/usr/java/jdk | |
export HADOOP_PORTMAP_OPTS="-Xmx1024m $HADOOP_PORTMAP_OPTS" | |
export HADOOP_CLIENT_OPTS="-Xmx1024m $HADOOP_CLIENT_OPTS".............. |
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-12/138430p2.htm
