zookeeper集群的搭建以及hadoop ha的相关配置
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..tar.gz -C /usr/Apache/<br/> ln -s zookeeper-3.4./ zookeeper<br/> cd zookeeper/conf<br/># 配置文件<br/>cp zoo_sample.cfg zoo.cfg
# 编辑zoo.cfg的内容<br/># The number of milliseconds of each tick<br/> tickTime=<br/> # The number of ticks that the initial<br/> # synchronization phase can take<br/> initLimit=<br/> # The number of ticks that can pass between<br/> # sending a request and getting an acknowledgement<br/> syncLimit=<br/> # the directory where the snapshot is stored.<br/> # do not use /tmp for storage, /tmp here is just<br/> # example sakes.<br/> <strong>dataDir</strong><strong>=/usr/Apache/zookeeper/</strong><strong>data</strong><br/> <strong>dataLogDir</strong><strong>=/usr/Apache/zookeeper/data/</strong><strong>log</strong><br/> # the port at which the clients will connect<br/> clientPort=<br/> # the maximum number of client connections.<br/> # increase this if you need to handle more clients<br/> <strong>maxClientCnxns</strong><strong>=</strong><br/> #<br/> # Be sure to read the maintenance section of the<br/> # administrator guide before turning on autopurge.<br/> #<br/> # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance<br/> #<br/> # The number of snapshots to retain in dataDir<br/> <strong>autopurge.snapRetainCoun</strong><strong>t</strong><strong>=</strong><br/> # Purge task interval in hours<br/> # Set to "" to disable auto purge feature<br/> <strong>autopurge.purgeInterval</strong><strong>=</strong><br/> #<br/> <strong>server.</strong><strong>1=master:2888:3888<br/> server.2=data1:2888:3888<br/> server.3=data2:2888:3888</strong>
一般采用默认值,重点是标蓝的地方。
数据的路径单独设,将日志分开,并且,不要放到默认的tmp文件夹下面,因为这个会定期删除
dataDir=/usr/Apache/zookeeper/data dataLogDir=/usr/Apache/zookeeper/data/log
将快照打开,并且设置autopurge.purgeInterval=1,与上面的不同,快照需要定期删除
增大客户端的连接数量maxClientCnxns=
先安装到master下面,之后进行分发
scp -r zookeeper-3.4. data1:usr/Apache/<br/> scp -r zookeeper-3.4. data2:usr/Apache/<br/> # 注意所属组与所有者<br/> chown -R hadoop:hadoop zookeeper<br/># 分别在三台机器的/usr/Apache/zookeeper/data目录下建立myid文件,分别写入数字1、2、3,这点很重要<br/>cd /usr/Apache/zookeeper/data/<br/>touch myid<br/> # 三台机器分别启动<br/> zkServer.sh start<br/> # 查看状态<br/> zkServer.sh status<br/> # 最后,检查,关闭一个看是否自动选举
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文件<br/> export HADOOP_HOME=/usr/Apache/hadoop<br/> export ZOOKEEPER_HOME=/usr/Apache/zookeeper<br/> export HADOOP_COMMON_HOME=$HADOOP_HOME<br/> export HADOOP_HDFS_HOME=$HADOOP_HOME<br/> export HADOOP_MAPRED_HOME=$HADOOP_HOME<br/> export HADOOP_YARN_HOME=$HADOOP_HOME<br/> export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop<br/> export CLASSPATH=.:$HADOOP_HOME/lib:$CLASSPATH<br/> export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin<br/> # 之后<br/> source ~/.bashrc
下面关键看配置
1> core-site.xml
<configuration><br/> <!--缓存文件存储的路径,可以这样写file:/opt/mdisk/disk02/data/tmp,file:/opt/mdisk/disk01/data/tmp--><br/> <!--如果挂载多个数据盘,用逗号分开--><br/> <!--配置缓存文件的目录,注意另建新的文件夹tmp,不要在hadoop/tmp下,因为会定期删除--><br/> <property><br/> <name>hadoop.tmp.dir</name><br/> <value>/usr/Apache/hadoop/data/tmp</value><br/> <description>A base for other temporary directories.</description><br/> </property> <!--指定nameservice的名称,自定义,但后面必须保持一致--><br/> <property><br/> <name>fs.defaultFS</name><br/> <value>hdfs://nscluster</value><br/> </property> <!-- 编辑日志文件存储的路径,这个也可以放到hdfs-site.xml中 --><br/> <property><br/> <name>dfs.journalnode.edits.dir</name><br/> <value>/usr/Apache/hadoop/data/jn</value><br/> </property> <!--文件读写缓存大小,此处为128kb--><br/> <property><br/> <name>io.file.buffer.size</name><br/> <value>131072</value><br/> </property> <!--指定zookeeper地址,配置HA时需要,这个也可以放到hdfs-site.xml中--><br/> <!--<property><br/> <name>ha.zookeeper.quorum</name><br/> <value>master:2181,data1:2181,data2:2181</value><br/> </property>--> <!--以下不是必须的--><br/> <!--配置hdfs文件被永久删除前保留的时间(单位:分钟),默认值为0表明垃圾回收站功能关闭--><br/> <!--<property><br/> <name>fs.trash.interval</name><br/> <value>0</value><br/> </property>--> <!--指定可以在任何IP访问--><br/> <!--<property><br/> <name>hadoop.proxyuser.hduser.hosts</name><br/> <value>*</value><br/> </property>--> <!--指定所有用户可以访问--><br/> <!--<property><br/> <name>hadoop.proxyuser.hduser.groups</name><br/> <value>*</value><br/> </property>--><br/> </configuration>
这里要注意hadoop.tmp.dir这个属性,上面的注释也已经说了,一定不要放到暂时的hadoop/tmp中,而要放到永久的文件夹中,否则namenode的启动可能遇到问题。
上面一些注释掉的属性不是必须的,下面一样。
2> hdfs-site.xml
注意下面的nscluster是自定义的名称,并且被应用于多个属性中,部署使用时更改样式
<configuration> <!--指定hdfs元数据存储的路径--><br/> <property><br/> <name>dfs.namenode.name.dir</name><br/> <value>file:/usr/Apache/hadoop/data/nn</value><br/> </property> <!--指定hdfs数据存储的路径--><br/> <property><br/> <name>dfs.datanode.data.dir</name><br/> <value>file:/usr/Apache/hadoop/data/dn</value><br/> </property> <!--开启WebHDFS功能(基于REST的接口服务)--><br/> <property><br/> <name>dfs.webhdfs.enabled</name><br/> <value>true</value><br/> </property> <!-- 数据备份的个数 --><br/> <property><br/> <name>dfs.replication</name><br/> <value>3</value><br/> </property> <!--关闭权限验证 --><br/> <property><br/> <name>dfs.permissions.enabled</name><br/> <value>false</value><br/> </property> <!--DateNode上的服务线程数,处理rpc,默认为10,可以调大--><br/> <property><br/> <name>dfs.datanode.handler.count</name><br/> <value>200</value><br/> </property> <!--文件操作的线程数,如果处理文件有很多,则调大,建议值8192--><br/> <property><br/> <name>dfs.datanode.max.transfer.threads</name><br/> <value>8192</value><br/> </property> <!--不用的数据节点,添加到excludes文件,方法同slaves文件,之后执行hadoop dfsadmin -refreshNodes命令--><br/> <property><br/> <name>dfs.hosts.exclude</name><br/> <value>/usr/Apache/hadoop/etc/hadoop/excludes</value><br/> </property> <!--以下为ha的相关配置--><br/> <!-- 指定hdfs的nameservice的名称为nscluster,务必与core-site.xml中的逻辑名称相同 --><br/> <property><br/> <name>dfs.nameservices</name><br/> <value><strong>nscluster</strong></value><br/> </property> <!-- 指定nscluster的两个namenode的名称,分别是nn1,nn2,注意后面的后缀.nscluster,这个是自定义的,如果逻辑名称为nsc,则后缀为.nsc,下面一样 --><br/> <property><br/> <name>dfs.ha.namenodes.<strong>nscluster</strong></name><br/> <value>nn1,nn2</value><br/> </property> <!-- 配置nn1,nn2的rpc通信 端口 --><br/> <property><br/> <name>dfs.namenode.rpc-address.<strong>nscluster</strong>.nn1</name><br/> <value>master:9000</value><br/> </property><br/> <property><br/> <name>dfs.namenode.rpc-address.<strong>nscluster</strong>.nn2</name><br/> <value>data1:9000</value><br/> </property> <!-- 配置nn1,nn2的http访问端口 --><br/> <property><br/> <name>dfs.namenode.http-address.<strong>nscluster</strong>.nn1</name><br/> <value>master:50070</value><br/> </property><br/> <property><br/> <name>dfs.namenode.http-address.<strong>nscluster</strong>.nn2</name><br/> <value>data1:50070</value><br/> </property> <!-- 指定namenode的元数据存储在journalnode中的路径 --><br/> <property><br/> <name>dfs.namenode.shared.edits.dir</name><br/> <value>qjournal://master:8485;data1:8485;data2:8485/nscluster</value><br/> </property> <!-- 开启失败故障自动转移 --><br/> <property><br/> <name>dfs.ha.automatic-failover.enabled</name><br/> <value>true</value><br/> </property> <!-- 配置失败自动切换的方式 --><br/> <property><br/> <name>dfs.client.failover.proxy.provider.nscluster</name><br/> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value><br/> </property> <!-- 配置zookeeper地址,如果已经在core-site.xml中配置了,这里不是必须的 --><br/> <property><br/> <name>ha.zookeeper.quorum</name><br/> <value>master:2181,data1:2181,data2:2181</value><br/> </property> <!-- 配置隔离机制 --><br/> <property><br/> <name>dfs.ha.fencing.methods</name><br/> <value>sshfence</value><br/> </property> <!-- 指定秘钥的位置 --><br/> <property><br/> <name>dfs.ha.fencing.ssh.private-key-files</name><br/> <value>/home/hadoop/.ssh/id_rsa</value><br/> </property> <!--配置sshfence隔离机制超时时间--><br/> <property><br/> <name>dfs.ha.fencing.ssh.connect-timeout</name><br/> <value>30000</value><br/> </property> <!--保证数据恢复--><br/> <!--<property><br/> <name>dfs.journalnode.http-address</name><br/> <value>0.0.0.0:8480</value><br/> </property>--><br/> <!--<property><br/> <name>dfs.journalnode.rpc-address</name><br/> <value>0.0.0.0:8485</value><br/> </property> --><br/> </configuration>
3> mapred-site.xml
<configuration><br/> <property><br/> <name>mapreduce.framework.name</name><br/> <value>yarn</value><br/> </property> <!--配置 MapReduce JobHistory Server 地址 ,默认端口10020--><br/> <property><br/> <name>mapreduce.jobhistory.address</name><br/> <value>0.0.0.0:10020</value><br/> </property> <!--配置 MapReduce JobHistory Server web ui 地址, 默认端口19888--><br/> <property><br/> <name>mapreduce.jobhistory.webapp.address</name><br/> <value>0.0.0.0:19888</value><br/> </property> <!--不用的数据节点,添加到excludes文件,之后执行hadoop dfsadmin -refreshNodes命令,--><br/> <!--协同hdfs-site.xml中的dfs.hosts.exclude属性--><br/> <property><br/> <name>mapred.hosts.exclude</name><br/> <value>/usr/Apache/hadoop/etc/hadoop/excludes</value><br/> </property> <property><br/> <name>mapreduce.job.ubertask.enable</name><br/> <value>true</value><br/> </property> </configuration>
注意上面0.0.0.0:19888这种写法,不能简单的写为19888,否则历史服务器不能访问
4> yarn-site.xml
<configuration> <!-- Site specific YARN configuration properties --><br/> <!--NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可运行MapReduce程序--><br/> <property><br/> <name>yarn.nodemanager.aux-services</name><br/> <value>mapreduce_shuffle</value><br/> </property> <!-- 开启日志聚集功能 --><br/> <property><br/> <name>yarn.log-aggregation-enable</name><br/> <value>true</value><br/> </property> <!-- 日志删除时间 -1禁用,单位为秒 --><br/> <property><br/> <name>yarn.log-aggregation.retain-seconds</name><br/> <value>604800</value><br/> </property> <!--修改日志目录hdfs://mycluster/var/log/hadoop-yarn/apps,当应用程序运行结束后,日志被转移到的HDFS目录(启用日志聚集功能时有效)--><br/> <property><br/> <name>yarn.nodemanager.remote-app-log-dir</name><br/> <value>/logs</value><br/> </property> <!-- yarn内存,配置nodemanager可用的资源内存 --><br/> <!--<property><br/> <name>yarn.nodemanager.resource.memory-mb</name><br/> <value>8192</value><br/> </property>--> <!-- yarn cpu,配置nodemanager可用的资源CPU --><br/> <!--<property><br/> <name>yarn.nodemanager.resource.cpu-vcores</name><br/> <value>8</value><br/> </property>--> <!--以下为ha配置--><br/> <!-- 开启yarn ha --><br/> <property><br/> <name>yarn.resourcemanager.ha.enabled</name><br/> <value>true</value><br/> </property> <!-- 指定yarn ha的名称 --><br/> <property><br/> <name>yarn.resourcemanager.cluster-id</name><br/> <value>nscluster-yarn</value><br/> </property> <!--启用自动故障转移--><br/> <property><br/> <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>??<br/> <value>true</value><br/> </property> <!-- resourcemanager的两个名称 --><br/> <property><br/> <name>yarn.resourcemanager.ha.rm-ids</name><br/> <value>rm1,rm2</value><br/> </property> <!-- 配置rm1、rm2的主机 --><br/> <property><br/> <name>yarn.resourcemanager.hostname.rm1</name><br/> <value>master</value><br/> </property><br/> <property><br/> <name>yarn.resourcemanager.hostname.rm2</name><br/> <value>data1</value><br/> </property> <!-- 配置yarn web访问的端口 --><br/> <property><br/> <name>yarn.resourcemanager.webapp.address.rm1</name><br/> <value>master:8088</value><br/> </property><br/> <property><br/> <name>yarn.resourcemanager.webapp.address.rm2</name><br/> <value>data1:8088</value><br/> </property> <!-- 配置zookeeper的地址 --><br/> <property><br/> <name>yarn.resourcemanager.zk-address</name><br/> <value>master:2181,data1:2181,data2:2181</value><br/> </property> <!-- 配置zookeeper的存储位置 --><br/> <property><br/> <name>yarn.resourcemanager.zk-state-store.parent-path</name><br/> <value>/rmstore</value><br/> </property> <!-- yarn restart--><br/> <!-- 开启resourcemanager restart --><br/> <property><br/> <name>yarn.resourcemanager.recovery.enabled</name><br/> <value>true</value><br/> </property> <!-- 配置resourcemanager的状态存储到zookeeper中 --><br/> <property><br/> <name>yarn.resourcemanager.store.class</name><br/> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value><br/> </property> <!-- 开启nodemanager restart --><br/> <property><br/> <name>yarn.nodemanager.recovery.enabled</name><br/> <value>true</value><br/> </property> <!-- 配置rpc的通信端口 --><br/> <property><br/> <name>yarn.nodemanager.address</name><br/> <value>0.0.0.0:45454</value><br/> </property><br/> <!--配置Web Application Proxy安全代理(防止yarn被攻击)--><br/> <property><br/> <name>yarn.web-proxy.address</name><br/> <value>0.0.0.0:8888</value><br/> </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><br/> <name>yarn.nodemanager.resource.memory-mb</name><br/> <value>2200</value><br/> <description>Amount of physical memory, in MB, that can be allocated for containers.</description><br/> </property> <property><br/> <name>yarn.scheduler.minimum-allocation-mb</name><br/> <value>500</value><br/> </property>
由于资源问题而导致的这种情况可参考以下:
http://stackoverflow.com/questions/20200636/mapreduce-jobs-get-stuck-in-accepted-state
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<br/> export HADOOP_PORTMAP_OPTS="-Xmx1024m $HADOOP_PORTMAP_OPTS"<br/> export HADOOP_CLIENT_OPTS="-Xmx1024m $HADOOP_CLIENT_OPTS"<br/>..............
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<br/> 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<br/> # 或者单独启动<br/> yarn-daemon.sh start resourcemanager<br/> yarn-daemon.sh start nodemanager
此处在master上运行start-yarh.sh,在data1上运行yarn-daemon.sh start resourcemanager,让data1作为资源管理器的备选节点。
9> 其他
mr-jobhistory-daemon.sh start historyserver<br/> 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
运行结果:
附:常用命令
# journalnode<br/>hadoop-daemons.sh start journalnode<br/>hadoop-daemons.sh stop journalnode<br/> <br/># namenode<br/> hadoop namenode -format<br/> hadoop-daemon.sh start namenode<br/> hadoop-daemon.sh stop namenode<br/> <br/># 同步<br/> hdfs namenode -bootstrapStandby<br/> hadoop-daemon.sh start namenode<br/> <br/># datanode<br/>hadoop-daemons.sh start datanode<br/> hadoop-daemons.sh stop datanode # zookeeper以及zkfc<br/> zkServer.sh start<br/>zkServer.sh stop<br/> hdfs zkfc -formatZK<br/> hadoop-daemons.sh start zkfc<br/> hadoop-daemons.sh stop zkfc<br/> <br/># yarn<br/> yarn-daemon.sh start resourcemanager<br/> yarn-daemon.sh stop resourcemanager<br/> yarn-daemon.sh start nodemanager<br/>yarn-daemon.sh stop nodemanager<br/>yarn-daemon.sh start proxyserver<br/> yarn-daemon.sh stop proxyserver<br/> mr-jobhistory-daemon.sh start historyserver<br/> mr-jobhistory-daemon.sh stop historyserver<br/> yarn-daemon.sh start historyserver<br/> yarn-daemon.sh stop historyserver<br/># rm1 rm2为配置文件中设定的资源管理器名称<br/>yarn rmadmin -getServiceState rm1 <br/>yarn rmadmin -getServiceState rm2 start-dfs.sh<br/>stop-dfs.sh<br/>start-yarn.sh<br/>stop-yarn.sh
转发申明:
本文转自互联网,由小站整理并发布,在于分享相关技术和知识。版权归原作者所有,如有侵权,请联系本站,将在24小时内删除。谢谢