共计 10029 个字符,预计需要花费 26 分钟才能阅读完成。
Zookeeper 集群安装
Zookeeper 是一个开源分布式协调服务,其独特的 Leader-Follower 集群结构,很好的解决了分布式单点问题。目前主要用于诸如:统一命名服务、配置管理、锁服务、集群管理等场景。大数据应用中主要使用 Zookeeper 的集群管理功能。
本集群使用 zookeeper-3.4.5-cdh5.7.1 版本。首先在 Hadoop-slave1 节点安装 Zookeeper,方法如下:
// 新建目录
$ mkdir app/cdh
// 解压 zookeeper 安装包
$ tar -xvf zookeeper-3.4.5-cdh5.7.1.tar.gz -C app/cdh/
// 删除安装包
$ rm -rf zookeeper-3.4.5-cdh5.7.1.tar.gz
// 配置用户环境变量
$ vim .bash_profile
export ZOOKEEPER_HOME=/home/hadoop/app/cdh/zookeeper-3.4.5-cdh5.7.1
export PATH=$PATH:$ZOOKEEPER_HOME/bin
// 使修改的环境变量生效
$ source.bash_profile
// 修改 zookeeper 的配置文件
$ cd app/cdh/zookeeper-3.4.5-cdh5.7.1/conf/
$ cp zoo_sample.cfg zoo.cfg
$ vim zoo.cfg
# 客户端心跳时间 (毫秒)
tickTime=2000
# 允许心跳间隔的最大时间
initLimit=10
# 同步时限
syncLimit=5
# 数据存储目录
dataDir=/home/hadoop/app/cdh/zookeeper-3.4.5-cdh5.7.1/data
# 数据日志存储目录
dataLogDir=/home/hadoop/app/cdh/zookeeper-3.4.5-cdh5.7.1/data/log
# 端口号
clientPort=2181
# 集群节点和服务端口配置
server.1=hadoop-slave1:2888:3888
server.2=hadoop-slave2:2888:3888
server.3=hadoop-slave3:2888:3888
# 以下为优化配置
# 服务器最大连接数,默认为 10,改为 0 表示无限制
maxClientCnxns=0
# 快照数
autopurge.snapRetainCount=3
# 快照清理时间,默认为 0
autopurge.purgeInterval=1
// 创建 zookeeper 的数据存储目录和日志存储目录
$ cd ..
$ mkdir -p data/log
// 在 data 目录中创建一个文件 myid,输入内容为 1
$ echo "1" >> data/myid
// 修改 zookeeper 的日志输出路径 (注意 CDH 版与原生版配置文件不同)
$ vim libexec/zkEnv.sh
if ["x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="$ZOOKEEPER_HOME/logs"
fi
if ["x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi
// 修改 zookeeper 的日志配置文件
$ vim conf/log4j.properties
zookeeper.root.logger=INFO,ROLLINGFILE
// 创建日志目录
$ mkdir logs
将 hadoop-slave1 节点上的 Zookeeper 目录同步到 hadoop-slave2 和 hadoop-slave3 节点,并修改 Zookeeper 的数据文件。此外,不要忘记设置用户环境变量。// 在 hadoop-slave1 中将 zookeeper 目录复制到其它节点
$ cd ~
$ scp -r app/cdh/zookeeper-3.4.5-cdh5.7.1hadoop-slave2:/home/hadoop/app/cdh
$ scp -r app/cdh/zookeeper-3.4.5-cdh5.7.1 hadoop-slave3:/home/hadoop/app/cdh
// 在 hadoop-slave2 中修改 data 目录中的 myid 文件
$ echo "2" >app/cdh/zookeeper-3.4.5-cdh5.7.1/data/myid
// 在 hadoop-slave3 中修改 data 目录中的 myid 文件
$ echo "3" >app/cdh/zookeeper-3.4.5-cdh5.7.1/data/myid
最后,在安装了 Zookeeper 的各节点上启动 Zookeeper,并查看节点状态,方法如下:// 启动
$ zkServer.sh start
// 查看状态
$ zkServer.sh status
// 关闭
$ zkServer.sh stop
Hadoop HA 配置
// 在 hadoop-master1 节点解压 hadoop 安装包
$ tar-xvf hadoop-2.6.0-cdh5.7.1.tar.gz -C /home/hadoop/app/cdh/
// 删除安装包
$ rmhadoop-2.6.0-cdh5.7.1.tar.gz
// 修改 hadoop-env.sh 文件
$ cd/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/etc/hadoop
$ vimhadoop-env.sh
exportJAVA_HOME=/home/hadoop/app/jdk1.7.0_79
// 配置 core-site.xml 文件
$ vim core-site.xml
<configuration>
<!-- 指定 hdfs 的 nameservices 名称为 mycluster,与 hdfs-site.xml 的 HA 配置相同 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定缓存文件存储的路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/data/tmp</value>
</property>
<!-- 配置 hdfs 文件被永久删除前保留的时间(单位:分钟),默认值为 0 表明垃圾回收站功能关闭 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<!-- 指定 zookeeper 地址,配置 HA 时需要 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop-slave1:2181,hadoop-slave2:2181,hadoop-slave3:2181</value>
</property>
</configuration>
// 配置 hdfs-site.xml 文件
$ vim hdfs-site.xml
<configuration>
<!-- 指定 hdfs 元数据存储的路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/data/namenode</value>
</property>
<!-- 指定 hdfs 数据存储的路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/data/datanode</value>
</property>
<!-- 数据备份的个数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 关闭权限验证 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- 开启 WebHDFS 功能(基于 REST 的接口服务)-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- ////////////// 以下为 HDFS HA 的配置 ////////////// -->
<!-- 指定 hdfs 的 nameservices 名称为 mycluster -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 指定 mycluster 的两个 namenode 的名称分别为 nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 配置 nn1,nn2 的 rpc 通信端口 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop-master1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop-master2:8020</value>
</property>
<!-- 配置 nn1,nn2 的 http 通信端口 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop-master1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop-master2:50070</value>
</property>
<!-- 指定 namenode 元数据存储在 journalnode 中的路径 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop-slave1:8485;hadoop-slave2:8485;hadoop-slave3:8485/mycluster</value>
</property>
<!-- 指定 journalnode 日志文件存储的路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/data/journal</value>
</property>
<!-- 指定 HDFS 客户端连接 active namenode 的 java 类 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制为 ssh -->
<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>
<!-- 开启自动故障转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
// 配置 mapred-site.xml 文件
$ vim mapred-site.xml
<configuration>
<!-- 指定 MapReduce 计算框架使用 YARN -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定 jobhistory server 的 rpc 地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop-master1:10020</value>
</property>
<!-- 指定 jobhistory server 的 http 地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop-master1:19888</value>
</property>
<!-- 开启 uber 模式(针对小作业的优化)-->
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<!-- 配置启动 uber 模式的最大 map 数 -->
<property>
<name>mapreduce.job.ubertask.maxmaps</name>
<value>9</value>
</property>
<!-- 配置启动 uber 模式的最大 reduce 数 -->
<property>
<name>mapreduce.job.ubertask.maxreduces</name>
<value>1</value>
</property>
</configuration>
// 配置 yarn-site.xml 文件
$ vim yarn-site.xml
<configuration>
<!-- NodeManager 上运行的附属服务,需配置成 mapreduce_shuffle 才可运行 MapReduce 程序 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 配置 Web Application Proxy 安全代理(防止 yarn 被攻击)-->
<property>
<name>yarn.web-proxy.address</name>
<value>hadoop-master2:8888</value>
</property>
<!-- 开启日志 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 配置日志删除时间为 7 天,- 1 为禁用,单位为秒 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 修改日志目录 -->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/logs</value>
</property>
<!-- 配置 nodemanager 可用的资源内存 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<!-- 配置 nodemanager 可用的资源 CPU -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
<!-- ////////////// 以下为 YARN HA 的配置 ////////////// -->
<!-- 开启 YARN HA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 启用自动故障转移 -->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定 YARN HA 的名称 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarncluster</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>hadoop-master1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop-master2</value>
</property>
<!-- 配置 YARN 的 http 端口 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop-master1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop-master2:8088</value>
</property>
<!-- 配置 zookeeper 的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop-slave1:2181,hadoop-slave2:2181,hadoop-slave3:2181</value>
</property>
<!-- 配置 zookeeper 的存储位置 -->
<property>
<name>yarn.resourcemanager.zk-state-store.parent-path</name>
<value>/rmstore</value>
</property>
<!-- 开启 yarn 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>
<!-- 开启 yarn nodemanager restart -->
<property>
<name>yarn.nodemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置 nodemanager IPC 的通信端口 -->
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:45454</value>
</property>
</configuration>
// 配置 slaves 文件
$ vimslaves
hadoop-slave1
hadoop-slave2
hadoop-slave3
// 创建配置文件中涉及的目录
$ cd/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/
$ mkdir-p data/tmp
$ mkdir-p data/journal
$ mkdir-p data/namenode
$ mkdir-p data/datanode
// 将 hadoop 工作目录同步到集群其它节点
$ scp-r /home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/hadoop-master2:/home/hadoop/app/cdh/
scp -r/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/ hadoop-slave1:/home/hadoop/app/cdh/
scp -r/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/ hadoop-slave2:/home/hadoop/app/cdh/
scp -r/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/ hadoop-slave3:/home/hadoop/app/cdh/
// 在集群各节点上修改用户环境变量
$ vim .bash_profile
export HADOOP_HOME=/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
// 使修改的环境变量生效
$ source.bash_profile
// 解决本地库文件不存在的问题
在 apache 官网下载 hadoop-2.6.0.tar.gz,解压后将 lib/native 下所有文件复制到 $HADOOP_HOME/lib/native 中。
Hadoop 集群的初始化
// 启动 zookeeper 集群(分别在 slave1、slave2 和 slave3 上执行)$ zkServer.shstart
// 格式化 ZKFC(在 master1 上执行)$ hdfszkfc -formatZK
// 启动 journalnode(分别在 slave1、slave2 和 slave3 上执行)$ hadoop-daemon.shstart journalnode
// 格式化 HDFS(在 master1 上执行)$ hdfsnamenode -format
// 将格式化后 master1 节点 hadoop 工作目录中的元数据目录复制到 master2 节点
$ scp-r app/cdh/hadoop-2.6.0-cdh5.7.1/data/namenode/*hadoop-master2:/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/data/namenode/
// 初始化完毕后可关闭 journalnode(分别在 slave1、slave2 和 slave3 上执行)$ hadoop-daemon.shstop journalnode
- Hadoop 2.6.0 HA 高可用集群配置详解(一)
- Hadoop 2.6.0 HA 高可用集群配置详解(二)
- Hadoop 2.6.0 HA 高可用集群配置详解(三)
正文完
星哥玩云-微信公众号