前置准备:有可用的zookeeper。
节点名 | zookeeper | namenode | datanode | journalnode | zkfc | resourcemanager | nodemanager |
---|---|---|---|---|---|---|---|
hadoop171 | √ | √ | √ | √ | √ | √ | |
hadoop172 | √ | √ | √ | √ | √ | √ | √ |
hadoop173 | √ | √ | √ | √ | √ |
安装包下载地址:
hadoop官网,版本全下载速度慢。
清华开源镜像,下载速度快,版本少。
tar -zxvf hadoop-3.2.1.tar.gz -C /opt/module
修改名称(可选)
mv hadoop-3.2.1.tar.gz hadoop
解压好后,进入hadoop/etc/hadoop
下
修改文件,建议先在一台机器中全部修改完后把文件复制到其他节点中。
hadoop-env.sh
增加java路径
vim hadoop-env.sh
export JAVA_HOME=路径
配置文件
core-site.xml
<configuration>
<property>
<!-- 配置hadoop使用的hdfs-->
<name>fs.defaultFS</name>
<value>hdfs://king</value>
</property>
<property>
<!-- 配置zkfc使用的zookeeper地址-->
<name>ha.zookeeper.quorum</name>
<value>hadoop171:2181,hadoop172:2181,hadoop173:2181</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<!-- 默认是在/tmp下面,我这里自定义的,可以省略 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop/data/hadoop/hdfs/tmp</value>
</property>
<!-- 回收站,保存7天 -->
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<!-- 集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>king</value>
</property>
<!-- 命名空间中namenodes的id -->
<property>
<name>dfs.ha.namenodes.king</name>
<value>nn1,nn2</value>
</property>
<!-- 每个NameNode监听的标准RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.king.nn1</name>
<value>hadoop171:9820</value>
</property>
<property>
<name>dfs.namenode.rpc-address.king.nn2</name>
<value>hadoop172:9820</value>
</property>
<!-- 每个NameNode监听的标准HTTP地址 -->
<property>
<name>dfs.namenode.http-address.king.nn1</name>
<value>hadoop171:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.king.nn2</name>
<value>hadoop172:9870</value>
</property>
<!-- 共享存储目录的位置 -->
<property>
<name> dfs.namenode.shared.edits.dir </name>
<value>qjournal://hadoop171:8485;hadoop172:8485;hadoop173:8485/king</value>
</property>
<!-- 代理配置 -->
<property>
<name>dfs.client.failover.proxy.provider.king</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 这是JournalNode进程保持逻辑状态的路径。这里在linux服务器文件的绝对路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/hadoop/data/hadoop/hdfs/jn</value>
</property>
<!-- 设置故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/jinghang/.ssh/id_rsa</value>
</property>
<!-- 以下内容可以省略 -->
<!-- 编辑日志存储路径 -->
<property>
<name>dfs.namenode.edits.dir</name>
<value>/opt/module/hadoop/data/hadoop/hdfs/edits</value>
</property>
<!-- 镜像文件存储路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/module/hadoop/data/hadoop/hdfs/name</value>
</property>
<!-- datanode节点存储数据块文件的本地路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/module/hadoop/data/hadoop/hdfs/data</value>
</property>
<!-- 白名单 -->
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop/etc/hadoop/whitelist</value>
</property>
<!-- 黑名单 -->
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop/etc/hadoop/blacklist</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<!-- 指定MapReduce运行在Yarn上 -->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<!-- 指定mr的classpath -->
<name>mapreduce.application.classpath</name>
<value>/opt/module/hadoop/etc/hadoop:/opt/module/hadoop/share/hadoop/mapreduce/*:/opt/module/hadoop/share/hadoop/mapreduce/lib/*:/opt/module/hadoop/share/hadoop/common/*:/opt/module/hadoop/share/hadoop/common/lib/*:/opt/module/hadoop/share/hadoop/hdfs/*:/opt/module/hadoop/share/hadoop/hdfs/lib/*:/opt/module/hadoop/share/hadoop/yarn/*:/opt/module/hadoop/share/hadoop/yarn/lib/*</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop173:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop173:19888</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<!--mapreduce执行shuffle(洗牌的意思)获取数据的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!-- rm开启ha模式 -->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<!-- 集群名称,作为zk上RN抢锁的路径 -->
<name>yarn.resourcemanager.cluster-id</name>
<value>king</value>
</property>
<property>
<!-- RM节点名称 -->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<!-- RM节点的主机名 -->
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop172</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop173</value>
</property>
<property>
<!-- RM前台访问地址 -->
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop172:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop173:8088</value>
</property>
<property>
<!-- zk节点地址 -->
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop171:2181,hadoop172:2181,hadoop173:2181</value>
</property>
<!--指定resourcemanager的状态信息存储在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--容器是否存在物理内存限制-->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!--以下内容可以省略-->
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>/opt/module/hadoop/etc/hadoop:/opt/module/hadoop/share/hadoop/common/lib/*:/opt/module/hadoop/share/hadoop/common/*:/opt/module/hadoop/share/hadoop/hdfs:/opt/module/hadoop/share/hadoop/hdfs/lib /*:/opt/module/hadoop/share/hadoop/hdfs/*:/opt/module/hadoop/share/hadoop/mapreduce/lib/*:/usr/local/hadoop-3.1.3/share/hadoop/mapreduce/*:/opt/module/hadoop/share/hadoop/yarn:/opt/module/hadoop/share/hadoop/yarn/lib/*:/opt/module/hadoop/share/hadoop/yarn/*:/opt/module/hbase/lib/*</value>
</property>
<!-- 存储本地化文件的目录列表 -->
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/opt/module/hadoop/data/hadoop/local</value>
</property>
<!-- 存储容器日志的目录列表 -->
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/opt/module/hadoop/data/hadoop/yarn/logs</value>
</property>
</configuration>
设置workers
vim workers
hadoop171
hadoop172
hadoop173
如果设置了黑白名单,则需要创建,没设置这一步可以跳过
设置白名单
vim whitelist
hadoop171
hadoop172
hadoop173
创建黑名单
touch blacklist
创建目录,我的配置文件中自定义了一些路径,如果没设置可以省略这一步,自定义的路径我在上面的xml文件中备注了。
在hadoop下面创建data文件夹
mkdir -p data/hadoop
cd data/hadoop
mkdir -p hdfs/data hdfs/edits hdfs/jn hdfs/name hdfs/tmp
mkdir local
mkdir -p yarn/local yarn/logs
配置完成后,将hadoop拷贝到其他节点中
scp -r hadoop 用户@节点名称:/opt/module
配置环境变量
vim /etc/profile
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$PATH:$HADOOP_HOME/sbin
刷新
source /etc/profile
格式化namenode
温馨提示:zookeeper一定要开着哦!
首先在三台机器中启动journalnode
hdfs --daemon start journalnode
在hadoop171中格式化namenode
hdfs namenode -format
格式化后启动
hdfs --daemon start namenode
在hadoop172中同步节点中的namenode元数据
hdfs namenode -bootstrapStandby
在hadoop171节点上关闭namenode
hdfs --daemon stop namenode
在hadoop171上格式化zkfc
hdfs zkfc -formatZK
在三台节点中关闭journalnode
hdfs --daemon stop journalnode
启动hadoop集群
start-all.sh
验证HA高可用
namenode验证HA高可用
hdfs haadmin -getAllServiceState
停止掉active的NameNode
kill -9 进程号
再次查看
hdfs haadmin -getAllServiceState
可以看到状态由standby变为active,而停掉的节点使用此命令会报拒绝连接的异常
启动停掉的namenode再次查看
resourcemanager验证HA
yarn rmadmin -getAllServiceState
步骤和namenode一样。
至此,hadoop HA的搭建和测试完成,接下来说一下安装过程中需要注意的地方和可能会遇到的报错在
1.在上面配置文件中,需要注意,我这里是 ‘king’ 如果需要改的话,记得将上面配置文件中所有涉及到 ’king‘ 的全部改成你修改的集群名称。还有注意节点名称也需要修改,我下面将需要修改的地方高亮出来。
hdfs-site.xml
core-site.xml
yarn-site.xml
core-site.xml
2.NameNode 无法自动故障转移(切换active)
原因是因为hdfs-site.xml中有下面的配置
解决办法:安装包含fuster程序的软件包Psmisc(每个机器上都要安装):
yum -y install psmisc