Hadoop完全分布式环境搭建

Hadoop完全分布式环境搭建

前期准备

在配置hadoop完全分布式集群环境前,我们需要做一些准备工作,比如配置节点的主机名、静态IP、IP映射和NTP全局时钟等等,如果完成了这些配置以后准备好Java和Hadoop的安装包、规划好不同节点的功能即可正式开始配置。

笔者可以使用的节点为westgisB052~westgisB057,总共6个节点,这些节点都已经完成了主机名、静态IP、IP映射和NTP全局时钟等前期配置,也在westgisB052准备好了相关的安装包,具体路径如下图所示:

安装包路径

如图上所示,笔者安装包的路径在~/pkg/下面,其中~表示用户根目录,因为笔者当前使用的账户为G22,所以~代表的绝对路径是/home/G22

此外,因为Hadoop是主从式架构,因此在这6个节点中还需要选取一个节点作为主节点,一个节点作为客户端(Client),其余的节点作为从节点,本次实验中笔者选取的主节点为westgisB052,客户端为westgisB057,其余节点作为从节点。

注:需要注意的是,主节点、客户端、从节点都可以配在一个节点上,但是在真实的大规模数据处理场景下,很容易给这一节点造成极高的负载,导致节点挂掉;所以本次实验中仅在一个节点上配置一种角色。


免密登陆

进行免密登陆配置的目的是要让 Master 节点可以无密码 SSH 登陆到各个 Slave 节点上,当然对于Master节点来说,也需要配置自身的免密登陆。因为该步骤是初学者最容易出问题的步骤,使用笔者会花较多的笔墨铺垫。

1.主节点免密登陆

主节点免密登陆有有两个步骤:① 产生密钥和公钥,② 将公钥的内容添加进当前节点的SSH认证文件。

  1. 产生密钥和公钥,在主节点上执行如下命令:

    cd ~/.ssh               # 如果没有该目录,先执行一次:ssh 主机名
    rm ./id_rsa*            # 删除之前生成的公匙(如果之前没创建过公钥可忽略)
    ssh-keygen -t rsa       # 一直按回车就可以
    

    ~/.ssh目录默认是没有的,用户使用ssh 主机名后会自动创建,同时在该目录下生成known_hosts文件,用来存储使用ssh命令进行过通行的节点的信息。

  2. 将公钥的内容添加进当前节点的SSH认证文件,命令如下:

    cat ./id_rsa.pub >> ./authorized_keys #将公钥内容加入SSH认证文件
    chmod 600 authorized_keys             #将认证文件的权限设为仅拥有者可读写
    

如果没接触过Linux,可能会对上述第一行命令中的>>非常疑惑,>>的作用是重定向,假设有一个命令为cmd >> file,其中cmd表示一个有输出的命令,而file代表一个文本文件,则cmd >> file的作用就是将cmd执行得到的输出写入file文件中,而不是打印在控制台。

Linux系统是一个权限管理做的很到位的多用户操作系统,Linux下的一个文件会因为用户的不同而享有不同的操作权限。

对一个文件而言,用户有三种身份:拥有者(owner)、群组成员(group)、其它人(other),对其的操作权限包括读(read)、写(write)、执行(execute)。

在使用chmod命令修改文件权限时,参数可以为3个0~7的数字,这3个数字依次代表owner、group、other的操作权限。

对于数字的取值来说:1代表可执行,2表示可写,4表示可读,其余数字对应为前面三个数字的组合求和,代表这三种权限的组合,例如5=4+1,表示该文件可读可执行,但是不可写入。

通过上述命令得到的认证文件authorized_keys的权限初始值为664,而在SSH协议中为了保证免密登陆的安全性,需要将authorized_keys的权限设置为600,即仅拥有者可读写。

执行完上述命令后,即可执行ssh 主机名进行免密登陆,此次登陆不需要输入密码则证明免密登陆配置成功,否则配置失败,笔者执行命令的过程如下图所示:

在这里插入图片描述

2.从节点免密登陆配置

配置主节点免密登陆的过程中,我们不难发现上述操作的本质就是先在master产生密钥id_rsa.pub,之后再将密钥的内容添加进目标主机的认证文件authorized_keys

配置从节点的免密登陆与配置主节点的免密登陆很类似,和上一步骤中不同的地方是:将密钥添加到认证文件的目标主机从master变成了多个slave。

如果按之前的方式去配置,工作量在slave规模很多的时候肯定是难以承受的,因此我们需要更换分发密钥的命令,同时使用一个简单的循环语句。

  1. ssh-copy-id命令了解

    ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上,同时无需我们设置权限,ssh-copy-id命令会自动给远程主机的用户主目录和~/.ssh,以及~/.ssh/authorized_keys设置合适的权限。

  2. 简单for循环

    linux中的循环语句很简单,语法如下:

    for 循环变量 in 可迭代对象
    do
      循环体
    done
    

    读者可以执行下面代码进行一个初步的体验:

    for host in westgisB0{53..57} #后面的集合表示westgisB053~westgisB057
    do
      echo $host #bash语言中,需要添加$符号,区分变量和字符文本
    done
    

    执行结果如下图所示:

在这里插入图片描述

  1. 使用for循环执行ssh-copy-id命令分发公钥

    此处我们综合前面铺垫的知识,执行如下命令:

    for host in westgisB0{53..57}
    do
      ssh-copy-id G22@$host
    done
    

    执行过程中,如果是之前没有使用ssh连接过目标节点,则会有一系列提示,并在控制台询问是否继续连接目标节点,此时需要输入yes,因为ssh-copy-id执行的过程中是需要输入目标节点的密码的,因此看到提示输入密码时也需要输入目标节点的密码。

    笔者执行上述命令、以及输入yes和密码进行交互的截图如下所示。
    从节点免密登陆

完成上面的所有操作之后,从节点的免密登陆应该都配置成功了,此时我们可以使用下面的命令进行检验

for host in westgisB0{53..57} #后面的集合表示westgisB053~westgisB057
do
  ssh $host "hostname" #通过远程调用的方式,在目标节点执行双引号内的命令
done

如果不需要输入密码进能成功输出所有遍历节点的主机名,则证明从节点的免密登陆配置成功,因为笔者遍历的节点是westgisB053~westgisB057,所以输出如下:

westgisB053
westgisB054
westgisB055
westgisB056
westgisB057


安装配置Java

在linux上安装配置Java只需要两步,第一步是将Java解压到目标文件目录,第二步是配置环境变量,没有太大的难度。

  1. 将Java解压到目标文件目录

    笔者Java压缩包的路径为:~/pkg/jdk-8u251-linux-x64.tar.gz

    笔者想解压到的路径为:~/program

    于是乎执行命令如下:

    mkdir ~/program
    tar -zxvf ~/pkg/jdk-8u251-linux-x64.tar.gz -C ~/program/
    

    执行上述命令后可以得到解压后的文件夹:/home/G22/program/jdk1.8.0_251

    因为该文件夹命名看上去令人不舒服,所以笔者进行了重命名(可选项,并不必要),重命名的代码如下:

    mv ~/program/jdk1.8.0_251 ~/program/java
    
  2. 配置环境变量

    如果读者在Windows操作系统上配置过Java,大概率也遇到过配置环境变量的步骤,在Linux中万物皆文件,包括我们执行的命令本质也是一个可执行文件,而配置环境变量的意义,就在于将Java文件夹下bin目录的可执行文件添加进名为$PATH的环境变量中。

    为了读者对此有个清晰的认识,可以执行如下命令,比较区别:

    jps
    ~/program/java/bin/jps
    

    笔者运行的结果如下:

    [G22@westgisB052 ~]$ jps
    bash: jps: command not found...
    
    [G22@westgisB052 ~]$ ~/program/java/bin/jps
    14221 Jps
    

    jps命令是java的bin目录下的一个可执行文件,作用是显示当前正在运行的java进程,可以发现直接在命令行面执行时,控制台出现了jps: command not found...的报错,而后面的命令则执行成功了,这是因为后者有jps命令完整的存放路径。

    有了前面的铺垫后,我们正式配置Java的环境变量,执行如下命令:

    echo 'export JAVA_HOME=/home/G22/program/java' >> ~/.bashrc
    echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc
    source ~/.bashrc 
    jps
    

    其中前两行命令的作用是在文件~/.bashrc中添加了Java的环境变量(因为读者的Java路径和笔者的路径不一样,所以需要按自己的路径修改对应的部分),第3行命令的作用在于刷新环境变量,第4行命令的作用是执行之前执行失败的jps

    需要注意的是:~/.bashrc文件配置的是用户级的环境变量,仅对配置的用户生效;而在Linux中还有系统级的环境变量,其配置文件是/etc/profile,对使用Linux系统的所有用户都生效。

    如果执行结果成功输出了当前运行的Java进程的pid和进程名,而不是返回之前的错误,则说明Java的环境配置成功了,例如如下结果:

    [G22@westgisB052 ~]$ jps
    14759 Jps

  3. 在上述部分我们只完成了对主节点的Java配置,而集群中的其它节点还没有配置,所以我们可以执行如下命令进行批量配置:

    for h in westgisB0{53..57} #后面的集合表示westgisB053~westgisB057
    do
     #在从节点相应位置创建目录,并分发Java文件夹
     ssh $h "mkdir ~/program"
     scp -r ~/program/java $h:~/program/
     #配置环境变量
     ssh $h "echo 'export JAVA_HOME=/home/G22/program/java' >> ~/.bashrc"
     ssh $h "echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc"  
     #刷新环境变量,打印主机名,并执行jps命令进行验证
     ssh $h "source ~/.bashrc; hostname; jps; echo"
    done
    

    读者在执行上述命令时需要注意的是:要根据自己java文件所在的路径,替换上述代码中的出现的路径。并且在执行命令的过程中要关注每一个节点的输出的结果是否符合预期,因为使用循环对节点进行操作时,一些节点可能会因为自身存在的问题导致远程调用执行的命令执行失败。

    当然,如果懒得看那么多信息,也可以执行如下命令进行验证,若是输出结果包含主机名和jps显示的Java进程,则说明从节点的Java也配置成功了。

    for h in westgisB0{53..57} #后面的集合表示westgisB053~westgisB057
    do
     ssh $h "hostname; jps; echo"
    done
    

安装配置Hadoop

安装配置Hadoop是本文的最终目的,也是免密登陆后的一个小难点,可以分为6个步骤,第一步是将Hadoop压缩包解压到目标文件目录,第二步是配置环境变量,第三步是修改配置文件,第四步是分发配置好的hadoop文件夹到其它节点,第五步是NameNode的格式化,第六部是集群的启动与关闭。

解压hadoop压缩包

笔者hadoop压缩包的路径为:~/pkg/hadoop-3.2.2.tar.gz

笔者想解压到的路径为:~/bigdata/

是故执行命令如下:

mkdir ~/bigdata/                                   #新建目录
tar -zxvf ~/pkg/hadoop-3.2.2.tar.gz -C ~/bigdata   #解压
mv ~/bigdata/hadoop-3.2.2 ~/bigdata/hadoop         #重命名

配置环境变量

同Java一样,需要设置$HADOOP_HOME的变量,同时还需要将其下bin目录和sbin目录加入到环境变量$PATH中,此处的$HADOOP_HOME/sbin目录下存放的文件亦是可执行文件,这些文件的作用是启动和关闭集群。具体命令如下:

echo 'export HADOOP_HOME=/home/G22/bigdata/hadoop' >> ~/.bashrc
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc
source ~/.bashrc 
hadoop version #验证hadoop的环境变量是否配置成功

执行上述命令时,读者要记得把第一行命令的路径换成自己hadoop文件夹所在的路径,配置成功后,执行得到的结果是hadoop的版本信息,如下所示:

[G22@westgisB052 ~]$ hadoop version
Hadoop 3.2.2
Source code repository Unknown -r 7a3bc90b05f257c8ace2f76d74264906f0f7a932
Compiled by hexiaoqiao on 2021-01-03T09:26Z
Compiled with protoc 2.5.0
From source with checksum 5a8f564f46624254b27f6a33126ff4
This command was run using /home/G22/bigdata/hadoop/share/hadoop/common/hadoop-common-3.2.2.jar

修改配置文件

配置hadoop时总共需要修改的配置文件有6个,包括core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、workers、hadoop-env.sh(需要注意的是,以上文件都在$HADOOP/etc/hadoop/目录下)。接下来,我们按上述顺序依次进行配置。

  1. core-site.xml

    <configuration>
            <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://westgisB052:9000</value>
            </property>
            <property>
                    <name>hadoop.tmp.dir</name>
                    <value>file:/home/G22/bigdata/hadoop/tmp</value>
                    <description>Abase for other temporary directories.</description>
            </property>
    </configuration>
    

    在这个配置文件中,有两个<value>标记的取值需要修改,第一个被标记的取值为主节点暴露的端口,用于横向和其它节点进行通信,读者更换为自己的主机名;第二个标记是hadoop存放数据的位置,为一个当前还未被创建的目录,笔者使用的目录为HADOOP_HOME/tmp,读者可以参考笔者的配置,也可以自己选定。

  2. hdfs-site.xml

    <configuration>
            <property>
                    <name>dfs.replication</name>
                    <value>3</value>
            </property>
            <property>
                    <name>dfs.namenode.name.dir</name>
                    <value>file:/home/G22/bigdata/hadoop/tmp/dfs/name</value>
            </property>
            <property>
                    <name>dfs.datanode.data.dir</name>
                    <value>file:/home/G22/bigdata/hadoop/tmp/dfs/data</value>
            </property>
            <property> 
                   <name>dfs.client.use.datanode.hostname</name> 
                   <value>true</value> 
            </property>
    </configuration>
    

    笔者对该文件使用的配置总共有四个property:

    ① 第一个property是HDFS对每一个文件块的备份数量,此处的value为3;

    ② 第二个和第三个property分别是namenode和datanode存放数据的路径,笔者的value依次设为了$HADOOP_HOME/tmp/dfs/name以及$HADOOP_HOME/tmp/dfs/data

    ③ 最后一个property是为了能通过公网:IP访问hadoop集群而设置的,因为集群一般搭建在局域服务器内,只能局域网内访问9000等端口,而修改后就可以使用公网访问。

  3. mapred-site.xml

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

    该文件配置比较简单,读者直接抄配置就好,不需要改动,笔者也不作解释了。

  4. yarn-site.xml

    <configuration>
            <property>
                    <name>yarn.resourcemanager.hostname</name>
                    <value>westgisB052</value>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
            </property>
    </configuration>
    

    该文件的第一个property指定的是启动YARN时ResourceManger所在的节点,建议该节点与Hadoop中NameNode所在的节点保持一致;第二个参数直接抄就好,不需要什么改动。

  5. workers

    该文件用于指定启动DataNode和NodeManager的节点,即从节点,因为westgisB052为主节点,westgisB057为从节点,所以剩下作为从节点的节点为westgisB053~56。所以该配置文件的内容为:

    westgisB053
    westgisB054
    westgisB055
    westgisB056
    
  6. hadoop-env.sh

    该文件只需添加环境变量$JAVA_HOME$HADOOP_HOME的具体路径即可,可直接执行如下命令进行配置:

    cd $HADOOP_HOME/etc/hadoop/
    echo 'export JAVA_HOME=/home/G22/program/java' >> ./hadoop-env.sh
    echo 'export HADOOP_HOME=/home/G22/bigdata/hadoop' >> ./hadoop-env.sh
    

    如果不放心是否配置成功,可以使用命令tail -n 2 hadoop-env.sh进行验证,这个命令的作用是打印hadoop-env.sh文件的最后两行。

分发配置好的Hadoop

该过程同之前分发Java文件夹类似,同样需要分发hadoop文件夹、同样需要为从节点配置和刷新环境变量。但是Hadoop文件比较大,使用scp -r命令远程拷贝的速度比较慢,因此本次分发前,先将hadoop文件夹打包,之后再分发到集群中的其它节点进行解压,具体的执行命令如下(执行下列命令时,读者要注意更换自己的路径):

#1.先在当前节点将配置好的hadoop文件夹打包
cd $HADOOP_HOME/..   #去到hadoop文件夹的上级目录
tar -zcf hadoop.tar.gz hadoop #打包hadoop文件夹
mv ./hadoop.tar.gz ~ #将打包后的压缩文件移动到用户根目录,方便后续操作
#2.遍历所有节点,分发压缩包并在相应节点解压、配置环境变量、删除压缩包
for h in westgisB0{53..57} 
do
 #在从节点相应位置创建目录,并分发hadoop文件夹
 ssh $h "mkdir ~/bigdata"
 scp ~/hadoop.tar.gz $h:~/
 #在从节点解压hadoop到对应的路径,之后删除压缩包
 ssh $h "tar -zxf ~/hadoop.tar.gz -C ~/bigdata/;rm ~/hadoop.tar.gz"
 #配置环境变量
 ssh $h "echo 'export HADOOP_HOME=/home/G22/bigdata/hadoop' >> ~/.bashrc"
 ssh $h "echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc"  
 #刷新环境变量
 ssh $h "source ~/.bashrc"
done

执行完上述命令后,可以通过执行如下命令判断分发文件以及配置环境变量是否成功:

for h in westgisB0{53..57} 
do
 ssh $h "hostname;hadoop version;echo"
done

如果配置成功,则会依次输出每个从节点及客户端的主机名、版本号,否则分发文件或者配置环境变量中存在至少一个环节出错。

NameNode的格式化

直接在主节点执行如下命令即可:

hdfs namenode -format

需要注意的是,如果读者在配置过程中配置失败了,想要重新修改配置文件、并将新的文件分发到新节点、之后再次初始化。那么在初始化之前需要把所有节点下的$HADOOP_HOME/logs/*$HADOOP_HOME/tmp删除掉。

启动和关闭集群

直接在主节点上执行start-dfs.sh启动集群,执行stop-dfs.sh关闭集群,需要注意的是:之所以可以这么操作,是因为把$HADOOP_HOME/sbin添加到了环境变量$PATH中,否则应该使用如下命令:

cd $HADOOP_HOME
./sbin/start-dfs.sh
./sbin/stop-dfs.sh

在使用start-dfs.sh启动集群后,为了验证集群是否搭建成功,可以执行如下命令:

for i in westgisB0{52..57}
do 
  ssh $i "hostname;jps;echo"
done

如果输出同笔者一样输出了每个节点对应角色的守护进程,则说明集群配置成功:

westgisB052
851 NameNode
1349 Jps
1133 SecondaryNameNode

westgisB053
9669 DataNode
9769 Jps

westgisB054
2721 DataNode
2830 Jps

westgisB055
17204 DataNode
17318 Jps

westgisB056
31798 Jps
31657 DataNode

westgisB057
6746 Jps

因为westgisB057为客户端,功能仅仅是提交应用程序和命令,是故没有守护进程。

除了上述方法外,还可以去web界面查看是否配置成功,在浏览器中输入:主节点IP:9870即可跳转到hadoop集群的web界面,需要注意的是:如果防火墙没有关闭,则可能上一步中每个节点的守护进程都存在,但是在浏览器上连不上web界面,此时便需要关闭防火墙。(如果使用的hadoop版本为hadoop2.X,则其网址需要改为主节点IP:50070
webUI


总结

如果读者完成了上一步骤,则hadoop的安装配置就到此告一段落了,恭喜各位成功的配置了Hadoop集群,这些过程对初学者,特别是刚刚接触Linux的读者是不友好的,但是在经历本次实验之后,相信读者对Linux的权限管理、环境变量、软件的安装、以及hadoop的了解都会上一个台阶。

我们可以总结一下本次配置的步骤是什么:

  1. 配置免密登陆

  2. 配置Java

  3. 配置Hadoop

可以发现最难受的就是配置免密登陆,在没配置之前使用scp进行远程拷贝或ssh远程调用的时候都需要输入密码,很影响效率(如果读者感兴趣可以去了解linux自动交互的工具expect,该工具可以根据控制台输出的提示自动输入预设的文本进行交互,可以在没有配置免密登陆时大幅提升工作效率)

其次工作量最多的地方就是配置Hadoop,因为其除了配置环境变量外,总共还有6个配置文件需要编辑修改,之后还需要打包分发到其它节点上(当然,不打包,直接scp -r复制到其他节点也是可以的),分发以后还要对namenode进行格式化。如果是第一次配置失败,第二次修改了文件以后,再进行格式化,是很容易出错的,因为操作者可能会忘记将更新的文件分发到其它节点,也可能会忘记删除所有节点上的$HADOOP_HOME/logs/*$HADOOP_HOME/tmp,之所以要删除这些东西,是因为其遗留下来的日志和数据会影响再次格式化。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在安装Hadoop环境时,需要将Hadoop压缩包分发到指定路径。根据引用中的内容,需要将Hadoop压缩包分别放置在以下两个路径下:/kkb/install/hadoop-2.6.0-cdh5.14.2/hadoop-hdfs-project/hadoop-hdfs-httpfs/downloads和/kkb/install/hadoop-2.6.0-cdh5.14.2/hadoop-common-project/hadoop-kms/downloads。 另外,在分发Hadoop环境时,还需要进行一些配置。根据引用和引用[3]中的内容,可以按照以下步骤进行Hadoop环境变量的分发: 1. 在第一台机器上执行命令,进入Hadoop配置文件所在目录: ``` cd /kkb/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop ``` 2. 修改core-site.xml文件,可使用文本编辑器打开该文件: ``` vim core-site.xml ``` 3. 在core-site.xml文件中添加以下配置信息: ``` <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://node01:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/tempDatas</value> </property> <!-- 缓冲区大小,实际工作中根据服务器性能动态调整 --> <property> <name>io.file.buffer.size</name> <value>4096</value> </property> <!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 --> <property> <name>fs.trash.interval</name> <value>10080</value> </property> </configuration> ``` 4. 修改hdfs-site.xml文件,可使用文本编辑器打开该文件: ``` vim hdfs-site.xml ``` 5. 根据引用中的内容,在node01机器上创建所需的目录: ``` mkdir -p /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/tempDatas

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值