阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Zookeeper集群的搭建及Hadoop HA的相关配置

140次阅读
没有评论

共计 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
# 最后,检查,关闭一个看是否自动选举

Zookeeper 集群的搭建及 Hadoop HA 的相关配置

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 中的目录(不需要自己建立,系统需要时自己会根据配置文件创建),而非本地。下图显示了程序运行后生成的日志:

Zookeeper 集群的搭建及 Hadoop HA 的相关配置

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

Zookeeper 集群的搭建及 Hadoop HA 的相关配置

 data1

Zookeeper 集群的搭建及 Hadoop HA 的相关配置

 data2

 Zookeeper 集群的搭建及 Hadoop HA 的相关配置

 访问 192.168.1.215:50070 

master 处于 active 状态

 Zookeeper 集群的搭建及 Hadoop HA 的相关配置

访问 192.168.1.218:50070  

data1 处于 standby 状态

 Zookeeper 集群的搭建及 Hadoop HA 的相关配置

 访问 192.168.1.215:8088

 Zookeeper 集群的搭建及 Hadoop HA 的相关配置

访问 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

运行结果:

 Zookeeper 集群的搭建及 Hadoop HA 的相关配置

 附: 常用命令

# journalnode
hadoop-daemons.sh start journalnode
hadoop-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
# datanode
hadoop-daemons.sh start datanode hadoop-daemons.sh stop datanode

# zookeeper 以及 zkfc zkServer.
sh start
zkServer.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 nodemanager
yarn-daemon.sh stop nodemanager
yarn
-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.sh
stop-dfs.sh
start-yarn.sh
stop-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
# 最后,检查,关闭一个看是否自动选举

Zookeeper 集群的搭建及 Hadoop HA 的相关配置

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 中的目录(不需要自己建立,系统需要时自己会根据配置文件创建),而非本地。下图显示了程序运行后生成的日志:

Zookeeper 集群的搭建及 Hadoop HA 的相关配置

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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计27288字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中