Hadoop Federation HA部署
为什么要部署联合命名空间?
大家都知道,hadoop集群的存储能力受限于namenode的内存,所以才会有所谓的小文件问题。在一些复杂的业务场景下,提高namenode性能成为了提高集群上限的有效途径。
HDFS Federation是 hdfs为了水平扩张namenode的存储性能,提供的多命名空间,基于Federation 搭建的集群在伸缩性,namenode性能,吞吐量都有很大的优势,并且能提供应用之间的隔离,避免类似于一个测试程序拖慢整个集群性能的情况。
一、环境准备
集群内核版本:Centos6.5
准备工作:
从官网下载需要用到的jar包。
- hadoop-2.7.6.tar.gz
- jdk-8u171-linux-x64.tar.gz
- zookeeper-3.4.12.tar.gz
1.1 关闭防火墙
用户:root
机器:每一台
执行:service iptables stop
注意,执行完之后只是本机暂时关闭防火墙,重启之后防火墙仍然会打开,所以还需额外执行:chkconfig iptables off
1.2 配置主机名
用户:root
机器:每一台
执行:vim /etc/sysconfig/network
编辑主机名
例:HOSTNAME=hadoop01
注意:主机名中不允许出现下划线,特殊字符#$,不然会找不到主机导致无法正常启动。而且这种方式修改主机名需要重启之后才能永久生效。如果不想重启系统可以配合临时修改主机名的命令:hostname [主机名] ,临时修改主机名。可以达到重启或不重启都是同一个主机名的目的。
1.3 配置hosts文件
用户:root
机器:每一台
执行:vim /etc/hosts
10.129.1.75 m0001.xh-hadoop.com
10.129.1.76 m0002.xh-hadoop.com
10.129.1.77 m0003.xh-hadoop.com
10.129.1.78 m0004.xh-hadoop.com
10.129.1.79 s0001.xh-hadoop.com
10.129.1.80 s0002.xh-hadoop.com
10.129.1.81 s0003.xh-hadoop.com
10.129.1.82 s0004.xh-hadoop.com
10.129.1.83 s0005.xh-hadoop.com
10.129.1.84 s0006.xh-hadoop.com
10.129.1.85 s0007.xh-hadoop.com
10.129.1.86 s0008.xh-hadoop.com
10.129.1.87 k0001.xh-kafka.com
10.129.1.88 k0002.xh-kafka.com
10.129.1.89 k0003.xh-kafka.com
10.129.1.90 k0004.xh-kafka.com
10.129.1.91 k0005.xh-kafka.com
将集群节点ip和对应hostname配置到hosts文件中去
格式:[ip] [空格] [主机名]
1.4 创建hadoop用户组和hdfs用户
用户:root ,hdfs
机器:每一台
执行:
groupadd hadoopgroup(创建hadoop用户组)
useradd hdfs -g hadoopgroup -G root (创建hdfs用户,并添加用户组)
passwd hdfs (修改用户密码)
1.5 配置免密登录
用户:root ,hdfs
机器:每一台
集群之间的通信需要配置免密登录,而且每个用户独立拥有自己的密钥,所以需要给每个用户配置免密登录。
生成公钥
执行:ssh-keygen (生成公钥)
#然后一直按回车
下发公钥到每一台需要配置免密登录的机器上去
执行:ssh-copy-id [主机名]
#输入用户密码
测试: ssh [hostname] 发现可以直接登录无需输入密码。
注意:root和hdfs用户都需要配置免密登录,而且本机也需要配置免密登录。
1.6 安装和配置jdk
用户:root
机器:每一台
安装集群的运行环境,jdk。用的是jdk1.8版本
解压jdk安装包到指定目录
执行:tar -zxvf jdk-8u171-linux-x64.tar.gz -C /cloud/java
配置环境变量
执行:vim /etc/profile
#在行尾添加
export JAVA_HOME=/cloud/java/jdk1.8.0_171
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
保存退出
执行:source /etc/profile
测试:java -version 查看java版本,能够正确打印版本号说明配置成功
1.7 上传安装zookeeper
用户:root
机器:第一个zookeeper节点
1.解压 执行:tar -zxvf zookeeper-xxx -C [目录]
2.在zookeeper第一台机器执行 修改配置文件
执行:vi zoo.cfg
# 添加以下内容
dataDir=/home/hadoop/zookeeper/data
dataLogDir=/home/hadoop/zookeeper/log
server.1=slave1:2888:3888
server.2=slave2:2888:3888
server.3=slave3:2888:3888
#创建myid文件
执行:vim /home/hadoop/zookeeper/data/myid
#添加
1
3.将zookeeper scp到其他主机并修改myid文件为server对应的数字。
执行: scp –r /home/hadoop/zookeeper hadoop@slave1:/home/hadoop
4.启动zookeeper
#每一台zookeeper节点机器
执行:/home/hadoop/zookeeper/bin/zkServer.sh start
1.8 配置hadoop环境变量
用户:root
机器:每一个hadoop节点
执行:vim /etc/profile
#在末尾添加
export HADOOP_HOME=/cloud/hadoop-2.7.6
export PATH=$PATH:$HADOOP_HOME/bin
export YARN_HOME=${HADOOP_HOME}
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export YARN_CONF_DIR=${YARN_HOME}/etc/hadoop
二、部署hadoop
2.1 上传解压Hadoop安装包
用户:root
机器:第一台hadoop节点
执行:tar -zxvf hadoop-xxx -C [目录名]
目录说明:
bin : 命令脚本
etc/hadoop : 配置文件
lib : hadoop依赖包目录
sbin : hadoop启动和关闭命令都在该目录下
libexec : 存放的也是hadoop命令,不过不常用
最常用的就是bin和 etc
2.2 配置hadoop-env.sh
用户:root
机器:第一台hadoop节点
执行:vim hadoop-env.sh
这个文件写的是hadoop的环境变量,主要修改hadoop的java_home以及日志存放路径
切换到etc/hadoop
执行:vim hadoop-env.sh
#修改环境变量
#在末尾添加
export JAVA_HOME = /cloud/java/jdk1.8.0_171
export HADOOP_CONF_DIR = /cloud/hadoop-2.7.6/etc/hadoop
export HADOOP_LOG_DIR=/cloud/data1/hadoop-data/hadoop_logs/$USER
export HADOOP_PID_DIR=/cloud/data1/hadoop-data/hadoop_logs/hadoop-pid
export HADOOP_IDENT_STRING=$USER
保存退出
source hadoop-env.sh 立即生效
2.3 配置yarn-env.sh
用户:root
机器:第一台hadoop节点
执行:vim yarn-env.sh
yarn-env.sh 存放的是yarn的环境,变量。保险起见另配一遍。
切换到 etc/hadoop
执行: vim yarn-env.sh
#修改环境变量
#在末尾添加
export YARN_LOG_DIR=/cloud/data1/hadoop-data/yarn-log-dir/
export HADOOP_YARN_USER=${HADOOP_YARN_USER:-yarn}
export YARN_CONF_DIR=”${YARN_CONF_DIR:-$HADOOP_YARN_HOME/conf}”
export HADOOP_CONF_DIR=/cloud/hadoop-2.7.6/etc/hadoop
export HADOOP_COMMON_HOME=/cloud/hadoop-2.7.6
export HADOOP_HDFS_HOME=/cloud/hadoop-2.7.6
export HADOOP_YARN_HOME=/cloud/hadoop-2.7.6
保存退出
source yarn-env.sh 立即生效
2.4 配置mapred-env.sh
用户:root
机器:第一台hadoop节点
执行:vim mapred-env.sh
mapred-env.sh 存放的是mapreduce运行时需要的一些环境变量
切换到etc/hadoop
执行:vim mapred-env.sh
#修改环境变量
#在末尾添加
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA
export HADOOP_MAPRED_LOG_DIR=/cloud/data1/hadoop-data/mapreduce/logs
保存退出
source yarn-env.sh 立即生效
2.5 配置hdfs-site.xml
用户:root
机器:第一台hadoop节点
执行:vim hdfs-site.xml
在这里配置多命名空间
并配置通信地址
配置failover
其他配置详见官网hdfs-site.xml默认配置
2.6 配置core-site.xml
用户:root
机器:第一台hadoop节点
执行: vim core-site.xml
配置
其他配置详见官网core-site.xml默认配置
2.7 配置yarn-site.xml
用户:root
机器:第一台hadoop节点
执行 :vim yarn-site.xml
配置resourcemanager高可用
配置web应用代理和logserverurl
其他配置详见,yarn-site.xml
2.8 配置mapred-site.xml
用户:root
机器:第一台hadoop节点
执行: vim mapred-site.xml
配置jobhistory
配置定时清理
其他配置,详见mapred-site.xml
2.9 copy Hadoop目录
用户:root
机器:第一个hadoop节点
将hadoop目录拷贝到所有hadoop节点
执行:scp /cloud/hadoop-2.7.6 root@hostname:/cloud/
#scp [hadoop目录] [用户名]@[hostname]:[目标地址]
2.10 在指定节点启动journalnode
用户:hdfs
机器:每一个journalnode节点
执行:
/cloud/hadoop-2.7.6/sbin/hadoop-daemon.sh start journalnode
2.11 初始化namenode
用户:hdfs
执行:
#初始化,每一个namespace的第一台namenode
/cloud/hadoop-2.7.6/bin/hdfs namenode -format
#停止journalnode(每一个journalnode节点)
/cloud/hadoop-2.7.6/sbin/hadoop-daemon.sh stop journalnode
#修改namenode的版本文件,统一clusterID,注意所有命名空间clusterID需要一致
vim /cloud/data1/dfs/nn/current/VERSION
#将修改后的nn文件拷贝到同namespace的其他namenode节点
scp -r /cloud/data1/dfs/nn hdfs@m0002.xh-hadoop.com:/cloud/data1/dfs/(m0001到m0002,m0003到m0004)
#修改journalnode目录下的VERSION文件,同理,同步集群的clusterID(第一个journalnode节点)
vim /cloud/data1/dfs/jn/common-hdfs/current/VERSION
vim /cloud/data1/dfs/jn/hbase-hdfs/current/VERSION
#将修改好的journalnode节点的VERSION文件拷贝到其他journalnode节点
scp /cloud/data1/dfs/jn/common-hdfs/current/VERSION hdfs@m0002.xh-hadoop.com:/cloud/data1/dfs/jn/common-hdfs/current/ (从m0001到m0002,m0003,m0004,s0002)
scp /cloud/data1/dfs/jn/hbase-hdfs/current/VERSION hdfs@m0002.xh-hadoop.com:/cloud/data1/dfs/jn/hbase-hdfs/current/ (从m0001到m0002,m0003,m0004,s0002)
2.12 格式化zkfc
用户:hdfs
机器:每一个namespace的第一个namenode
执行:
/cloud/hadoop-2.7.6/bin/hdfs zkfc -formatZK (m0001 m0003)
启动集群
用户:hdfs
执行:
#启动journalnode,每一个journalnode节点
/cloud/hadoop-2.7.6/sbin/hadoop-daemon.sh start journalnode (m0001,m0002,m0003,m0004,s0002)
查看启动日志
tail -f -n 2000 /cloud/data1/hadoop_logs/hdfs/hadoop-hdfs-journalnode-m0001.xh-hadoop.com.log
#启动dfs,第一个namenode
/cloud/hadoop-2.7.6/sbin/start-dfs.sh
查看启动日志
tail -f -n 2000 /cloud/data1/hadoop_logs/hdfs/hadoop-hdfs-namenode-m0001.xh-hadoop.com.log
#启动zkfc,每一个zkfc节点
/cloud/hadoop-2.7.6/sbin/hadoop-daemon.sh start zkfc
查看日志
tail -f -n 2000 /cloud/data1/hadoop_logs/hdfs/hadoop-hdfs-zkfc-m0001.xh-hadoop.com.log
三、 总结
在以前的工作中也有过部署hadoop集群的经历,不过这次部署hadoop Federation还是第一次,与普通hadoop部署最大的不同点是要修改两个命名空间的namenode版本号一致,因为datanode只能向一个namenode发送心跳信息。这点需要特别注意。