Hadoop的安装与部署(分布式+高可用)

一、硬件环境

假设有4台机,IP及主机名如下:

192.168.100.105 c1
192.168.100.110 c2
192.168.100.115 c3
192.168.100.120 c4

 

二、软件环境

操作系统:Ubuntu Server 18.04

JDK:1.8.0

Hadoop:3.3.0/3.3.1

* 这里的ZooKeeper、Hadoop根目录都放在/home/目录下

 

三、部署规划

1.组件规划

* 以下是较合理的规划,但由于本文的操作部分是较早之前写好的,没按这份规划,先凑合着搭建了测试吧,熟悉后再自行调整。

组件说明:

DataNode:储存数据的节点,定时发送心跳包和数据块信息给NameNode。一般是每台机部署1个。

NameNode:与DataNode交互信息进行监控和索引数据目录。一般是部署2个节点(主、备)。

ZKFailoverController(ZKFC):主要是负责监控NameNode及选举。每个NameNode节点都会运行ZKFC服务。

JournalNode:同步主备NameNode的数据。至少要部署3个节点,必须是奇数个(3、5、7、…),因为系统最多只能容忍 (n-1)/2 个JN节点失败而不影响正常运行。

NodeManager:Yarn的节点状况监控服务。每台机都要部署。

ResourceManager:Yarn管理集群资源调度的服务,与NodeManager交互信息进行调度管理。一般是部署2个节点(主、备)。

 

2.目录规划

 * 以下目录必须在安装Hadoop之前预先在每台机手动创建,否则启动Hadoop时会报错

 

四、运行环境配置

* 此步骤不能跳过,否则会出现各种报错

https://www.cnblogs.com/live41/p/15525826.html

 

五、安装和配置ZooKeeper

https://www.cnblogs.com/live41/p/15522363.html

 

六、下载安装包及配置系统环境变量

* 先登录root账号再进行以下操作

* 以下操作在每台机都要执行一次

1.下载及解压

https://downloads.apache.org/hadoop/common/

解压到/home/目录

 

2.创建必须的目录

* 由于ZooKeeper的所需目录在安装ZooKeeper时已创建,这里只创建Hadoop目录

cd /home/hadoop
mkdir hdfs tmp
cd hdfs
mkdir name data journal

 

3.配置环境变量

vim ~/.bashrc

在末尾加入以下内容:

export HADOOP_HOME=/home/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export HADOOP_COMMON_HOME=/home/hadoop
export HADOOP_HDFS_HOME=/home/hadoop
export HADOOP_MAPRED_HOME=/home/hadoop
export HADOOP_CONF_DIR=/home/hadoop/etc/hadoop

export HDFS_DATANODE_USER=root
export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root

export YARN_HOME=/home/hadoop
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

更新环境变量:

source ~/.bashrc

 

七、安装和配置Hadoop

* 在执行以下操作之前,记得要预先创建 三、2 的目录,否则启动Hadoop时会报错

* 不用在每台机操作,只需要在c1机操作,再通过scp命令同步配置文件给其它机

1.进入配置目录

cd /home/hadoop/etc/hadoop

 

2.编辑hadoop-env.sh

vim hadoop-env.sh

添加以下内容(如果已有,就把路径修改为对的):

export JAVA_HOME=/usr/bin/jdk1.8.0
export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}

* 这里的JAVA_HOME根据你安装的路径来修改。

 

3.编辑yarn-env.sh

vim yarn-env.sh

添加以下内容(如果已有,就把路径修改为对的):

export JAVA_HOME=/usr/bin/jdk1.8.0

 

4.编辑core-site.xml

* 各属性的说明见下面附1的文章

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ns6/</value> <!--对应hdfs-site.xml的dfs.nameservices属性-->
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/tmp</value>
    </property>
    <property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>c1:2181,c2:2181,c3:2181</value>
    </property>
    <property>
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>1000</value>
    </property>
</configuration>

 

5.编辑hdfs-site.xml

* 各属性的说明见下面附1的文章

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///home/hadoop/hdfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///home/hadoop/hdfs/data</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>

    <property>
        <name>dfs.nameservices</name>
        <value>ns6</value> <!--core-site.xml的fs.defaultFS使用该属性值-->
    </property>
    <property>
        <name>dfs.ha.namenodes.ns6</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.ns6.nn1</name>
        <value>c1:9000</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.ns6.nn2</name>
        <value>c2:9000</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.ns6.nn1</name>
        <value>c1:50070</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.ns6.nn2</name>
        <value>c2:50070</value>
    </property>

    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://c1:8485;c2:8485;c3:8485/ns6</value>
        <description>
            JournalNode的配置
            格式是qjournal://host1:port1;host2:port2;host3:port3/journalID
            默认端口号是8485,journalID建议使用nameservice的名称
        </description>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop/hdfs/journal</value>
    </property>

    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
        <description>HDFS的故障自动转移服务</description>
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.ns6</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        <description>客户端(client)通过该类获取active NameNode</description>
    </property>
    <property>
        <name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
        <value>60000</value>
    </property>

    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </value>
        <description>隔离机制(fencing),防止主备切换时同时存在2个master的情况</description>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>~/.ssh/id_rsa</value> <!--/root/.ssh/id_rsa-->
        <description>隔离机制(fencing)使用的远程控制密钥</description>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
</configuration>

 

6.编辑mapred-site.xml

* 各属性的说明见下面附1的文章

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobtracker.http.address</name>
        <value>c1:50030</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>c1:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>c1:19888</value>
    </property>
    <property>
        <name>mapred.job.tracker</name>
        <value>http://c1:9001</value>
    </property>
</configuration>

 

7.编辑yarn-site.xml

* 各属性的说明见下面附1的文章

<configuration>
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yn6</value>
    </property>
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>c3</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>c4</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>c3:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>c4:8088</value>
    </property>

    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>c1:2181,c2:2181,c3:2181</value>
    </property>
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
        <description>
            ResourceManger会将应用的状态信息保存到yarn.resourcemanager.store.class配置的存储介质中,
            重启后会加载这些信息,并且NodeManger会将还在运行的container信息同步到ResourceManager。
        </description>
    </property>
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>

    <property>
        <name>yarn.application.classpath</name>
        <value>
            /home/hadoop/etc/hadoop,
            /home/hadoop/share/hadoop/common/*,
            /home/hadoop/share/hadoop/common/lib/*,
            /home/hadoop/share/hadoop/hdfs/*,
            /home/hadoop/share/hadoop/hdfs/lib/*,
            /home/hadoop/share/hadoop/yarn/*,
            /home/hadoop/share/hadoop/yarn/lib/*,
            /home/hadoop/share/hadoop/mapreduce/*
        </value>
    </property>
</configuration>

 

8.配置workers

vim workers

添加以下内容:

c1
c2
c3
c4

 

9.同步配置文件

把上面配置好的c1机的文件,通过scp同步到其它机。

cd /home/hadoop/etc/hadoop
scp * c2:/home/hadoop/etc/hadoop
scp * c3:/home/hadoop/etc/hadoop
scp * c4:/home/hadoop/etc/hadoop

 

八、启动和停止Hadoop

* 只在c1机执行

1.启动JournalNode

hdfs --workers --daemon start journalnode

虽然配置了只在c1、c2、c3机运行journalnode,但用该命令时会把c4机的也运行起来

这是因为在workers文件配置了在4台机都运行。不用管,继续往下执行即可

 

* 另外,该命令的旧版仍能执行,只是会报警告信息,命令如下(不建议使用):

hadoop-daemons.sh start journalnode

旧版有2个相似文件:hadoop-daemon.sh和hadoop-daemons.sh,前者(无s)只执行本机的journalnode,后者(有s)执行所有机器的journalnode

 

2.格式化NameNode

hadoop namenode -format

格式化后同步namenode的信息文件给c2机。因为有2个NameNode节点,c1和c2

scp -r /home/hadoop/hdfs/name/current/ c2:/home/hadoop/hdfs/name/

 

3.格式化zkfc

hdfs zkfc -formatZK

zkfc = ZKFailoverController = ZooKeeper Failover Controller

zkfc用于监控NameNode状态信息,并进行自动切换。

 

4.启动HDFS和Yarn

start-dfs.sh
start-yarn.sh

* 这步是最经常报错的,部分错误及解决方法见下面附2。

一般报的是以下2个错误(里面包含了解决方法):

https://www.cnblogs.com/live41/p/15464028.html
https://www.cnblogs.com/live41/p/15636229.html

 

只有第1次部署时需要用上面的操作,后面启动可以直接用全部启动脚本

start-all.sh

 

5.检查进程

jps

 

6.检查节点状态

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2

 

7.关闭Hadoop

stop-yarn.sh
stop-dfs.sh

也可以直接用全部停止脚本

stop-all.sh

 

九、使用Hadoop

* 只在c1机执行

1.Web页面操作

http://192.168.100.105:50070/

 

2.命令操作

https://www.cnblogs.com/xiaojianblogs/p/14281445.html

 

 

附1:

1.官方文档

https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/core-default.xml
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

 

2.中文文档

core-site.xml、hdfs-site.xml、mapred-site.xml的属性详解

https://blog.csdn.net/h952520296/article/details/79993934

 

附2:

1.使用pdsh工具连接被拒绝

错误提示:

pdsh@connect: Connection refused
java.net.ConnectException: Call From c1/192.168.100.105 to c2:9000 failed on connection exception:
java.net.ConnectException: Connection refused;

解决方法:

https://www.cnblogs.com/live41/p/15464028.html

 

2.没有配置用root账号启动Hadoop

错误提示:

ERROR: Attempting to operate on hdfs namenode as root
ERROR: Attempting to operate on hdfs datanode as root
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: Attempting to operate on hdfs journalnode as root
ERROR: Attempting to operate on hdfs zkfc as root

解决方法:

https://www.cnblogs.com/live41/p/15636229.html

 

3.重新格式化后的IO错误

错误提示(会有多种不同提示,都可以用该方法解决):

Incompatible clusterIDs in /home/hadoop/hdfs/data
Failed to add storage directory [DISK]file
Directory /home/hadoop/hdfs/journal/ns6 is in an inconsistent state: Can't format the storage directory because the current directory is not empty.

解决方法:

在格式化之前,先把name、data、logs等目录里面的文件先清除掉。注意只是删除里面的文件,不删除目录

 

附3:

非高可用方式(没使用ZooKeeper)的安装步骤

https://www.cnblogs.com/live41/p/15467263.html

 

posted @ 2021-10-29 20:23  Clotho_Lee  阅读(1955)  评论(0编辑  收藏  举报