共计 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 高可用集群配置详解(三)
正文完
星哥玩云-微信公众号
