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

Hadoop完全分布式搭建部署

339次阅读
没有评论

共计 9980 个字符,预计需要花费 25 分钟才能阅读完成。

1 环境准备

1.1 修改 IP

1.2 修改主机名及主机名和 IP 地址的映射

1.3 关闭防火墙

1.4 ssh 免密登录

1.5 安装 JDK,配置环境变量

2 集群规划

节点名称 NN JJN DN ZKFC ZK RM NM
linux1 NameNode JournalNode DataNode ZKFC Zookeeper   NodeManager
linux2 NameNode JournalNode DataNode ZKFC ZooKeeper ResourceManager NodeManager
linux3   JournalNode DataNode   ZooKeeper ResourceManager NodeManager

3 安装Zookeeper 集群

安装详解参考:Zookeeper 集群搭建 https://www.linuxidc.com/Linux/2020-03/162767.htm

4 配置 Hadoop

4.1 修改 core-site.xml

<configuration>
<!-- meNode 的地址组装成一个集群 mycluster -->
<property>
   <name>fs.defaultFS</name>
   <value>hdfs://mycluster</value>
</property>
<!-- 指定 hadoop 运行时产生文件的存储目录 -->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/module/hadoop/data/ha/tmp</value>
</property>
<!-- 指定 ZKFC 故障自动切换转移 -->
<property>
     <name>ha.zookeeper.quorum</name>
     <value>linux1:2181,linux2:2181,linux3:2181</value>
</property>

</configuration>

4.2 修改 hdfs-site.xml

<connfiguration>
<!-- 设置 dfs 副本数,默认 3 个 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 完全分布式集群名称 -->
<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>
<!-- 集群中 NameNode 节点都有哪些 -->
<property>
   <name>dfs.ha.namenodes.mycluster</name>
   <value>nn1,nn2</value>
</property>
<!-- nn1 的 RPC 通信地址 -->
<property>
   <name>dfs.namenode.rpc-address.mycluster.nn1</name>
   <value>linux1:8020</value>
</property>
<!-- nn2 的 RPC 通信地址 -->
<property>
   <name>dfs.namenode.rpc-address.mycluster.nn2</name>
   <value>linux2:8020</value>
</property>
<!-- nn1 的 http 通信地址 -->
<property>
   <name>dfs.namenode.http-address.mycluster.nn1</name>
   <value>linux1:50070</value>
</property>
<!-- nn2 的 http 通信地址 -->
<property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>linux2:50070</value>
</property>
<!-- nn2 的 http 通信地址 -->
<property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>linux2:50070</value>
</property>
<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://linux1:8485;linux2:8485;linux3:8485/mycluster</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/hadoop/.ssh/id_rsa</value>
</property>
<!-- 声明 journalnode 服务器存储目录-->
<property>
   <name>dfs.journalnode.edits.dir</name>
   <value>/opt/module/hadoop/data/ha/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
   <name>dfs.permissions.enable</name>
   <value>false</value>
</property>
<!-- 访问代理类:client,mycluster,active 配置失败自动切换实现方式-->
<property>
   <name>dfs.client.failover.proxy.provider.mycluster</name>
 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置自动故障转移-->
<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
</property>
</configuration>

4.3 修改 mapred-site.xml

[hadoop@linux1 hadoop]# mv mapred-site.xml.template mapred-site.xml
[hadoop@linux1 hadoop]# vi  mapred-site.xml
<configuration>
<!-- 指定 mr 框架为 yarn 方式 -->
 <property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
 </property>
<!-- 指定 mr 历史服务器主机, 端口 -->
  <property>   
    <name>mapreduce.jobhistory.address</name>   
    <value>linux1:10020</value>   
  </property>   
<!-- 指定 mr 历史服务器 WebUI 主机, 端口 -->
  <property>   
    <name>mapreduce.jobhistory.webapp.address</name>   
    <value>linux1:19888</value>   
  </property>
<!-- 历史服务器的 WEB UI 上最多显示 20000 个历史的作业记录信息 -->    
  <property>
    <name>mapreduce.jobhistory.joblist.cache.size</name>
    <value>20000</value>
  </property>
<!--配置作业运行日志 --> 
  <property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.intermediate-done-dir</name>
    <value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate</value>
  </property>
  <property>
    <name>yarn.app.mapreduce.am.staging-dir</name>
    <value>/tmp/hadoop-yarn/staging</value>
  </property>
</configuration>

4.4 修改 slaves

linux1
linux2
linux3

4.5 修改 yarn-site.xml

[hadoop@linux2 hadoop]$ vi yarn-site.xml
<configuration>
<!-- reducer 获取数据的方式 -->
 <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!--启用 resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <!--声明两台 resourcemanager 的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>rmCluster</value>
    </property>
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>linux2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>linux3</value>
    </property>
    <!--指定 zookeeper 集群的地址-->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>linux1:2181,linux2:2181,linux3:2181</value>
    </property>
    <!--启用自动恢复-->
    <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>
</configuration>

4.5 拷贝 hadoop 到其他节点

[hadoop@linux1 module]$ scp -r hadoop/ hadoop@linux2:/opt/module/
[hadoop@linux1 module]$ scp -r hadoop/ hadoop@linux3:/opt/module/

4.6 配置 Hadoop 环境变量

[hadoop@linux1 module]$ vim /etc/profile
export HADOOP_HOME=/opt/module/hadoop
export PATH=$Java_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH


生效
[hadoop@linux1 module]$ source /etc/profile

5 启动集群

1)在各个 JournalNode 节点上,输入以下命令启动 journalnode 服务:(前提 zookeeper 集群已启动)

[hadoop@linux1 hadoop]$ hadoop-daemon.sh start journalnode
[hadoop@linux2 hadoop]$ hadoop-daemon.sh start journalnode
[hadoop@linux3 hadoop]$ hadoop-daemon.sh start journalnode

cd /opt/module/hadoop/data

Hadoop 完全分布式搭建部署

 产生 clusterID 的集群编号

cd /opt/moudle/hadoop/data/ha

Hadoop 完全分布式搭建部署

tmp 目录也会产生 clusterID 集群编号

启动 nn1 上 namenode

[hadoop@linux1 current]$ hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/hadoop/logs/hadoop-hadoop-namenode-linux1.out
[hadoop@linux1 current]$ jps
13040 NameNode
13121 Jps
5442 QuorumPeerMain
12403 JournalNode

3)在 [nn2] 上,同步 nn1 的元数据信息:

[hadoop@linux2 hadoop]$ hdfs namenode -bootstrapStandby

Hadoop 完全分布式搭建部署

 4)启动 nn2 上的 namenode

[hadoop@linux2 hadoop]$ hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/hadoop/logs/hadoop-hadoop-namenode-linux2.out
[hadoop@linux2 hadoop]$ jps
2368 JournalNode
2498 NameNode
1783 QuorumPeerMain
2574 Jps
[hadoop@linux2 hadoop]$ 

5)在 [nn1] 上,启动所有 datanode

[hadoop@linux1 current]$  hadoop-daemons.sh start datanode
linux1: starting datanode, logging to /opt/module/hadoop/logs/hadoop-hadoop-datanode-linux1.out
linux2: starting datanode, logging to /opt/module/hadoop/logs/hadoop-hadoop-datanode-linux2.out
linux3: starting datanode, logging to /opt/module/hadoop/logs/hadoop-hadoop-datanode-linux3.out
[hadoop@linux1 current]$ 

访问地址:http://linux2:50070/dfshealth.html#tab-overview

Hadoop 完全分布式搭建部署

 

 

访问地址:http://linux1:50070/dfshealth.html#tab-overview 

Hadoop 完全分布式搭建部署

 6)手动切换状态,在各个 NameNode 节点上启动 DFSZK Failover Controller,先在哪台机器启动,哪个机器的 NameNode 就是 Active NameNode

[hadoop@linux1 current]$ hadoop-daemon.sh start zkfc
[hadoop@linux2 current]$ hadoop-daemon.sh start zkfc

设置第一个为 active
[hadoop@linux1 current]$  hdfs haadmin -transitionToActive nn1 --forcemanual

Web 页面查看

 

 

Hadoop 完全分布式搭建部署Hadoop 完全分布式搭建部署

 7 启动 yarn

(1)在 linux2 中执行:

[hadoop@linux2 hadoop]$ start-yarn.sh

(2)在 linux3 中执行:

[hadoop@linux3 hadoop]$ yarn-daemon.sh start resourcemanager

(3)查看服务状态

[hadoop@linux3 hadoop]$ yarn rmadmin -getServiceState rm1
active
[hadoop@linux3 hadoop]$ yarn rmadmin -getServiceState rm2
standby
[hadoop@linux3 hadoop]$ 

Hadoop 完全分布式搭建部署

 

测试集群

1.查看集群

[hadoop@linux1 opt]$ jps
13040 NameNode
5442 QuorumPeerMain
12403 JournalNode
15139 NodeManager
14908 DFSZKFailoverController
13390 DataNode
15711 Jps
[hadoop@linux1 opt]$ 

[hadoop@linux2 hadoop]$ jps
2368 JournalNode
2498 NameNode
3746 Jps
1783 QuorumPeerMain
3271 NodeManager
2633 DataNode
3417 ResourceManager
3162 DFSZKFailoverController
[hadoop@linux2 hadoop]$ 

[hadoop@linux3 hadoop]$ jps
2147 JournalNode
2515 NodeManager
1733 QuorumPeerMain
2249 DataNode
2719 ResourceManager
2847 Jps
[hadoop@linux3 hadoop]$ 

创建文件夹

[root@linux3 ~]# mkdir -p /opt/wcinput
root@linux3 ~]# cd /opt/
[root@linux3 opt]# chown hadoop:hadoop wcinput
root@linux3 opt]# su hadoop
[hadoop@linux3 opt]$ vi /opt/wcinput/my.txt

 

hello world
hello scals
hello java
hello php
hello world
php   

放到 hdfs 中

[hadoop@linux3 opt]$ hadoop fs -put /opt/wcinput/my.txt /user/hadoop/input

执行单词统计

[hadoop@linux3 opt]$ hadoop jar /opt/module/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /user/hadoop/input /user/hadoop/output

查看输出

[hadoop@linux3 opt]$ hadoop dfs -ls /usr/hadoop/output

将输出下载到本地

[hadoop@linux3 hadoop]$ hadoop dfs -get /user/hadoop/output/part-r-00000

查看文件

[hadoop@linux3 hadoop]$ vim part-r-00000


hello   5
java    1
php     2
scals   1
world   2

四 Hadoop 集群群启脚本

1 启动服务

zookeeper   hadoop 

2 脚本

1 编写启动集群脚本  vi start-cluster.sh

#!/bin/bash
echo “****************** 开始启动集群所有节点服务 ****************”
echo “****************** 正在启动 zookeeper *********************”
for i in hadoop@linux1 hadoop@linux2 hadoop@linux3
do
ssh $i ‘/opt/module/apache-zookeeper-3.6.0/bin/zkServer.sh start’
done
echo “******************** 正在启动 HDFS *******************”
ssh hadoop@linux1 ‘/opt/module/hadoop/sbin/start-dfs.sh’
echo “********************* 正在启动 YARN ******************”
ssh hadoop@linux2 ‘/opt/module/hadoop/sbin/start-yarn.sh’
echo “*************** 正在 node21 上启动 JobHistoryServer *********”
ssh hadoop@linux1 ‘/opt/module/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver’
echo “****************** 集群启动成功 *******************”*

2 编写关闭集群脚本 vi stop-cluster.sh

#!/bin/bash
echo  "*************      开在关闭集群所有节点服务      *************"
echo  "*************  正在 linux1 上关闭 JobHistoryServer  *************"
ssh   hadoop@linux1 '/opt/module/hadoop/sbin/mr-jobhistory-daemon.sh stop historyserver'
echo  "*************         正在关闭 YARN               *************"
ssh   hadoop@linux2 '/opt/module/hadoop/sbin/stop-yarn.sh'
echo  "*************         正在关闭 HDFS               *************"
ssh   hadoop@linux1 '/opt/module/hadoop/sbin/stop-dfs.sh'
echo  "*************         正在关闭 zookeeper          *************"
for i in hadoop@linux1 hadoop@linux2 hadoop@linux3
do
     ssh $i '/opt/module/apache-zookeeper-3.6.0/bin/zkServer.sh stop'
done

[hadoop@linux1 hadoop]$ chmod +x start-cluster.sh 

在使用 ssh 命令的时候出现了找不到 JAVA_HOME 的问题
通过 ssh 登陆之后会发现找不到 JAVA_HOME,我的 JAVA_HOME 是定义在 /etc/profile 里面的。
研究后发现远程登录和直接登录执行的文件是不一样的:
/etc/profile: 当用户登录时, 该文件被执行.
/etc/bashrc: 当 bash shell 被打开时, 该文件被执行.
ssh 作为远程登录的方式进入,当然就无法触发 /etc/profile 的执行,所以会发生找不到 JAVA_HOME 的问题,所以需要将 java 的配置信息配置到 bashrc 的文件中去,配置步骤如下所示:
.bashrc 是一个隐藏的文件,要打开并修改该文件需要:

(1) 命令 vim ~/.bashrc 进入到文件;

(2) 直接按 i 键可以对文件进行修改,Esc +:+ wq 退出并保存修改之后的文件

(3) 命令:source ~/.bashrc 更新 .bashrc

对该文件进行修改保存后,在执行相关的操作,就不会发生如上的问题啦。

更多 Hadoop 相关信息见Hadoop 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=13

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