大数据之 Hadoop-4-搭建 Hadoop2.x 分布式集群

一、配置集群各节点SSH无密钥登录

Hadoop的进程间通信使用SSH(Secure Shell)方式。SSH是一种通信加密协议,使用非对称加密方式,可以避免网络窃听。为了使Hadoop各节点之间能够无密钥相互访问,使彼此之间相互信任,通信不受阻碍,在搭建Hadoop集群之前需要配置各节点的SSH无密钥登录。

1、无密钥登录原理

file

总的来说,判定是否允许无密钥登录,关键在于登录节点的密钥信息是否已经存在于被登录节点的授权文件中,如果存在,则允许登录。

2、无密钥登录操作步骤

Hadoop集群需要确保在每一个节点上都能无密钥登录到其他节点。

ssh-copy-id 命令可以把本地主机的公钥复制并追加到远程主机的 authorized_keys 文件中,该命令也会给远程主机的用户主目录(home)、~/.ssh 目录和 ~/.ssh/authorized_keys 设置合适的权限。

(1)、分别在三个节点中执行以下命令,生成密钥文件:

$ cd ~/.ssh/    # 若没有该目录,请先执行一次 ssh localhost 命令
$ ssh-keygen -t rsa # 生成密钥文件,会有提示输入加密信息,按回车键即可

(2)、分别在三个节点中执行以下命令,将公钥信息复制并追加到对方节点的授权文件 authorized_keys 中:

$ ssh-copy-id centos01
$ ssh-copy-id centos02
$ ssh-copy-id centos03

file

命令执行过程中需要输入当前用户的密码。
(3)、测试SSH无密钥登录
仍然使用ssh命令进行测试登录即可。

二、搭建Hadoop2.x分布式集群

本文档的搭建思路是,在节点 centos01 中安装 Hadoop 并修改配置文件,然后将配置好的Hadoop 安装文件远程复制到集群中的其他节点。集群中各节点的角色分配如下表所示:

节点 角色
centos01 NameNode
SecondaryNameNode
DataNode
ResourceManager
NodeManager
centos02 DataNode
NodeManager
centos03 DataNode
NodeManager

上表中的角色指的是Hadoop集群各节点所启动的守护进程,其中的 NameNodeDataNodeSecondaryNameNode 是 HDFS 集群所启动的进程,ResourceManagerNodeManager 是 YARN 集群所启动的进程。

1、上传 Hadoop并解压

在 centos01 节点中,将Hadoop 安装文件 hadoop-3.1.3.tar.gz 上传到 /opt/softwares/ 目录,然后进入该目录,解压安装文件到 /opt/modules/,命令如下:

file

Hadoop下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/

$ cd /opt/softwares
$ tar -zxf hadoop-3.1.3.tar.gz -C /opt/modules/

2、配置系统环境变量

为了方便地在任意目录下执行Hadoop命令,而不需要进入到Hadoop安装目录,需要配置Hadoop系统环境变量。此处只需要配置centos01节点即可。
执行以下命令,修改文件 /etc/profile:

$ sudo vi /etc/profile

在文件末尾加入以下内容:

#JAVA_HOME
export JAVA_HOME=/opt/modules/jdk1.8.0_211
export PATH=$PATH:$JAVA_HOME/bin

#HADOOP_HOME(新增)
export HADOOP_HOME=/opt/modules/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

执行以下命令,刷新profile文件,使修改生效:

$ source /etc/profile

执行hadoop命令,若能成功输出以下信息,说明Hadoop系统变量配置成功:

[hadoop@centos01 hadoop-3.1.3]$ hadoop
Usage: hadoop [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]
 or    hadoop [OPTIONS] CLASSNAME [CLASSNAME OPTIONS]
  where CLASSNAME is a user-provided Java class

  OPTIONS is none or any of:

buildpaths                       attempt to add class files from build tree
--config dir                     Hadoop config directory
--debug                          turn on shell script debug mode
--help                           usage information

查看Hadoop版本

$ hadoop version
Hadoop 3.1.3

重启(如果Hadoop命令不能用再重启)

$ sync
$ sudo reboot

3、Hadoop目录结构

3.1 查看Hadoop目录结构

[root@centos01 hadoop-3.1.3]# ls -l
总用量 176
drwxr-xr-x. 2 hadoop hadoop    183 9月  12 2019 bin
drwxr-xr-x. 3 hadoop hadoop     20 9月  12 2019 etc
drwxr-xr-x. 2 hadoop hadoop    106 9月  12 2019 include
drwxr-xr-x. 3 hadoop hadoop     20 9月  12 2019 lib
drwxr-xr-x. 4 hadoop hadoop    288 9月  12 2019 libexec
-rw-rw-r--. 1 hadoop hadoop 147145 9月   4 2019 LICENSE.txt
-rw-rw-r--. 1 hadoop hadoop  21867 9月   4 2019 NOTICE.txt
-rw-rw-r--. 1 hadoop hadoop   1366 9月   4 2019 README.txt
drwxr-xr-x. 3 hadoop hadoop   4096 9月  12 2019 sbin
drwxr-xr-x. 4 hadoop hadoop     31 9月  12 2019 share
[root@centos01 hadoop-3.1.3]# 

3.2 重要目录

(1)bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例

4、配置Hadoop环境变量

Hadoop 所有的配置文件都存在于安装目录/opt/modules/hadoop-3.1.3/下的 etc/hadoop 中,进入该目录,修改以下配置文件:

hadoop-env.sh
mapred-env.sh
yarn-env.sh

三个文件分别加入JAVA_HOME 环境变量,如下:

#JAVA_HOME
export JAVA_HOME=/opt/modules/jdk1.8.0_211

去掉文件注释:

# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
export JAVA_HOME=/opt/modules/jdk1.8.0_211

5、配置HDFS

(1)、修改配置文件 core-site.xml,加入以下内容:


<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://centos01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/modules/hadoop-3.1.3/tmp</value>
</property>
</configuration>

上述配置属性解析如下:

  • fs.defaultFS:HDFS的默认访问路径,也是NameNode的访问地址
  • hadoop.tmp.dir:Hadoop数据文件的存放目录。该参数如果不配置,默认指向/tmp 目录,而 /tmp 目录在系统重启后会自动被清空,从而导致Hadoop 的文件系统数据丢失。

(2)修改配置文件 hdfs-site.xml ,加入以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property><!--不检查用户权限-->
 <name>dfs.permissions.enabled</name>
 <value>false</value>
</property>
<property>
 <name>dfs.namenode.name.dir</name>
 <value>file:/opt/modules/hadoop-3.1.3/tmp/dfs/name</value>
</property>
<property>
 <name>dfs.datanode.data.dir</name>
 <value>file:/opt/modules/hadoop-3.1.3/tmp/dfs/data</value>
</property>
</configuration>

上述配置属性解析如下:

  • dfs.replication:文件在HDFS系统中的副本数
  • dfs.namenode.name.dir:NameNode 节点数据在本地文件系统的存放位置
  • dfs.datanode.data.dir:DataNode 节点数据在本地文件系统的存放位置

(3)修改slaves 文件,配置DataNode 节点。slaves或者是(/opt/modules/hadoop-3.1.3/etc/hadoop/workers) 文件原本无任何内容,需要将所有 DataNode 节点的主机名都添加进去,每个主机名占整一行(注意不要有空格)。本例中,DataNode 为三个节点,配置信息如下:

centos01
centos02
centos03

说明:需要在三台机器上都需要做配置。

6、配置YARN

(1)在安装目录 /opt/modules/hadoop-3.1.3/etc/hadoop 修改 mapred-site.xml 文件,添加以下内容,指定任务执行框架为YARN。

[root@centos01 hadoop]# cat mapred-site.xml 
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

(2)修改 yarn-site.xml 文件,添加以下内容:

vi yarn-site.xml
<?xml version="1.0"?>
<configuration>
<!-- Site specific YARN configuration properties -->
 <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
 </property>

</configuration>

上边配置属性解析如下:
yarn.nodemanager.aux-services:NodeManager 上运行的附属服务,需配置成 mapreduce_shuffle 才可运行 MapReduce 程序。YARN 提供了该配置项用于在 NodeManager 上扩展自定义服务,MapReduce 的 shuffle 功能正是一种扩展服务。

7、复制Hadoop安装文件到其他主机

在 centos01 节点上,将配置好的整个Hadoop安装目录复制到其他节点(centos02和centos03),命令如下:

$ cd /opt/modules
$ scp -r hadoop-3.1.3/ hadoop@centos02:/opt/modules/
$ scp -r hadoop-3.1.3/ hadoop@centos03:/opt/modules/

8、格式化NameNode

在启动Hadoop之前,需要先格式化NameNode。格式化NameNode可以初始化HDFS 文件系统的一些目录和文件,在centos节点上执行以下命令,进行格式化操作:

$ hadoop namenode -format

输出以下信息,说明格式成功:

...
2021-02-13 04:53:00,394 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at centos01/192.168.222.10
************************************************************/
[root@centos01 modules]# 

格式化成功后,会在当前节点的Hadoop安装目录中生成 tmp/dfs/name/current 目录,该目录中则生成了用于存储HDFS文件系统元数据信息的文件 fsimage 。

[root@centos01 current]# pwd
/opt/modules/hadoop-3.1.3/tmp/dfs/name/current
[root@centos01 current]# ls -l
总用量 16
-rw-r--r--. 1 root root 391 2月  13 04:53 fsimage_0000000000000000000
-rw-r--r--. 1 root root  62 2月  13 04:53 fsimage_0000000000000000000.md5
-rw-r--r--. 1 root root   2 2月  13 04:53 seen_txid
-rw-r--r--. 1 root root 219 2月  13 04:53 VERSION
[root@centos01 current]# 

需要注意的是,必须在NameNode所在节点上进行格式化操作。

9、启动Hadoop

在 centos01 节点上执行以下命令,以hadoop用户启动Hadoop集群:

$ cd /opt/modules/hadoop-3.1.3/sbin
$ start-all.sh

也可以执行 start-dfs.shstart-yarn.sh 分别启动 HDFS 集群和YARN集群。

在启动的时候,安装目录logs可能没有写的权限,centos01: ERROR: Unable to write in /opt/modules/hadoop-3.1.3/logs. Aborting.这里需要将写的权限修改:

# 加入-R 参数,将读写权限传递给子文件夹
[hadoop@centos01 hadoop-3.1.3]$ sudo chmod -R  777  logs

启动成功后的安装目录:

[hadoop@centos01 hadoop-3.1.3]$ sudo chmod -R  777  logs
[hadoop@centos01 hadoop-3.1.3]$ ls -l
总用量 176
drwxr-xr-x. 2 hadoop hadoop    183 9月  12 2019 bin
drwxr-xr-x. 3 hadoop hadoop     20 9月  12 2019 etc
drwxr-xr-x. 2 hadoop hadoop    106 9月  12 2019 include
drwxr-xr-x. 3 hadoop hadoop     20 9月  12 2019 lib
drwxr-xr-x. 4 hadoop hadoop    288 9月  12 2019 libexec
-rw-rw-r--. 1 hadoop hadoop 147145 9月   4 2019 LICENSE.txt
drwxrwxrwx. 2 root   root       37 2月  13 04:52 logs
-rw-rw-r--. 1 hadoop hadoop  21867 9月   4 2019 NOTICE.txt
-rw-rw-r--. 1 hadoop hadoop   1366 9月   4 2019 README.txt
drwxr-xr-x. 3 hadoop hadoop   4096 9月  12 2019 sbin
drwxr-xr-x. 4 hadoop hadoop     31 9月  12 2019 share
drwxr-xr-x. 3 root   root       17 2月  13 04:53 tmp
[hadoop@centos01 hadoop-3.1.3]$ cd sbin
[hadoop@centos01 sbin]$ start-all.sh
WARNING: Attempting to start all Apache Hadoop daemons as hadoop in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [centos01]
Starting datanodes
Starting secondary namenodes [centos01]
Starting resourcemanager
Starting nodemanagers
[hadoop@centos01 sbin]$ 

某些文件(多台服务也需要做配置):

su hadoop
sudo chmod -R 777 /tmp/hadoop-hadoop-datanode.pid

Hadoop安装目录下的 sbin 目录中存放了很多启动脚本,若由于内存等原因使集群中的某个守护进程挡掉了,可以执行该目录中的脚本对相应的守护进程进行启动。

或者直接更改目录权限:

sudo chown -R hadoop:hadoop /opt/*

# sudo chown -R hadoop:hadoop /tmp/*

10、查看各节点启动进程

集群启动成功之后,分别在各个节点上执行 jps 命令,查看启动的Java进程。可以看到各节点的Java进程如仙子阿:

centos01 节点的进程:

[hadoop@centos01 hadoop-3.1.3]$ jps
11033 NodeManager
11353 Jps
10925 ResourceManager

centos02 节点的进程:

[hadoop@centos02 root]$ jps
8746 Jps
8635 NodeManager

centos03 节点的进程:

[root@centos03 ~]# jps
8652 Jps
8542 NodeManager

11、本地运行模式

  1. 创建在hadoop-3.1.3文件下面创建一个wcinput文件夹
    mkdir wcinput
  2. 在wcinput文件下创建一个wc.input文件
    cd wcinput
  3. 编辑wc.input文件
    vi wc.input

    在文件中输入如下内容

    hadoop yarn
    hadoop mapreduce
    atguigu
    atguigu

    保存退出::wq

  4. 回到Hadoop目录/opt/module/hadoop-3.1.3
  5. 执行程序
    hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
  6. 查看结果
    [atguigu@hadoop101 hadoop-3.1.3]$ cat wcoutput/part-r-00000
    看到如下结果:
    atguigu 2
    hadoop  2
    mapreduce       1
    yarn    1

在执行的时候,如果出现下边的错误,则对配置需要做修改:

[hadoop@centos01 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount input wcoutput
2021-05-01 14:30:09,850 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
java.net.ConnectException: Call From centos01/192.168.222.10 to centos01:9000 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.apache.hadoop.net.NetUtils.wrapWithMessage(NetUtils.java:831)
    at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:755)
    at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1549)
    at org.apache.hadoop.ipc.Client.call(Client.java:1491)
    at org.apache.hadoop.ipc.Client.call(Client.java:1388)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:233)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:118)
    at com.sun.proxy.$Proxy9.getFileInfo(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:904)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:422)
    at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeMethod(RetryInvocationHandler.java:165)
    at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invoke(RetryInvocationHandler.java:157)
    at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeOnce(RetryInvocationHandler.java:95)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:359)
    ...
    at org.apache.hadoop.util.RunJar.run(RunJar.java:318)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:232)
Caused by: java.net.ConnectException: 拒绝连接
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
    at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531)
    at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:700)
    at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:804)
    at org.apache.hadoop.ipc.Client$Connection.access$3800(Client.java:421)
    at org.apache.hadoop.ipc.Client.getConnection(Client.java:1606)
    at org.apache.hadoop.ipc.Client.call(Client.java:1435)
    ... 45 more
[hadoop@centos01 hadoop-3.1.3]$ 

解决方案:

# 统一用户组
sudo chown -R hadoop:hadoop /opt/*

# 授予hadoop 用户tmp写权限
sudo chown -R hadoop:hadoop /tmp/*

[hadoop@centos01 sbin]$ hadoop namenode -format

重新启动:

[hadoop@centos01 sbin]$ start-dfs.sh
Starting namenodes on [centos01]
Starting datanodes
Starting secondary namenodes [centos01]
[hadoop@centos01 sbin]$ start-yarn.sh
Starting resourcemanager
Starting nodemanagers
[hadoop@centos01 sbin]$ jps
13635 ResourceManager
14101 Jps
13078 NameNode
13751 NodeManager
13386 SecondaryNameNode
13199 DataNode
[hadoop@centos01 sbin]$ 

centos02 服务器:

[root@centos02 ~]# su hadoop
[hadoop@centos02 root]$ sudo chown -R hadoop:hadoop /opt/*
[hadoop@centos02 root]$ jps
8662 Jps
7688 DataNode
8552 NodeManager
[hadoop@centos02 root]$ 

测试HDFS

$ hdfs dfs -mkdir /input
#  将 Hadoop安装目录下的文件Readme.txt 上传到新建的 input 文件夹中
$ hdfs dfs -put /opt/modules/hadoop-3.1.3/READEME.txt /input
$  hdfs dfs -put /opt/modules/hadoop-3.1.3/input/wc.txt /input

为者常成,行者常至