大数据学习之路(3):hadoop的完全分布式搭建

331 阅读5分钟

一、环境配置

准备三台虚拟机。

因为集群是有多台服务器组成的,当设计到配置的更改,要求集群的配置是同步的,所以需要在每台机器上都做相同的更改。当集群的服务器很多时,重复性的工作做起来没有意义且非常麻烦,因此,需要集群分发脚本。

1.1 scp 安全拷贝

scp可以实现服务器与服务器之间的数据拷贝,基本语法如下:

命令   递归       要拷贝的文件路径/名称    目的用户@主机:目的路径/名称

[root@xiaolei module]# scp -r /etc/profile.d/my_env.sh  root@hadoop104:/etc/profile.d/

1.2 XSync 集群分发脚本

rsync和scp的区别:用rsync做文件的复制要比scp的速度更快,rsync只对差异文件做更新。scp是将所有文件都复制过去。基本语法:

rsync    -av       $pdir/$fname              $user@hadoop$host:$pdir/$fname
命令   选参数   要拷贝的文件路径/名称    目的用户@主机:目的路径/名称
选项参数说明 :
-a:归档拷贝
-v:显示复制过程

用xsync来命名分发脚本:

注意问题,在etc/profile的文件中添加路径:/home/lei/bin 如下,然后把脚本写在这里就可以实现全局访问了。

export PATH=$PATH:/home/lei/bin

然后在/home/lei 目录下建立bin目录,在下面创建xsync文件:

[lei@xiaolei module]# cd /home/leilei
[lei@xiaolei leilei]# ls
[lei@xiaolei leilei]# mkdir bin
[lei@xiaolei leilei]# touch xsync
[lei@xiaolei leilei]# vim xsync

脚本内容

#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
  echo Not Enough Arguement!
  exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 
do
  echo ====================  $host  ====================
  #3. 遍历所有目录,挨个发送
  for file in $@
  do
    #4 判断文件是否存在
    if [ -e $file ]
    then
      #5. 获取父目录
      pdir=$(cd -P $(dirname $file); pwd)
      #6. 获取当前文件的名称
      fname=$(basename $file)
      ssh $host "mkdir -p $pdir"
      rsync -av $pdir/$fname $host:$pdir
    else
      echo $file does not exists!
    fi
  done
done

测试:脚本可以使用。

[root@xiaolei bin]# xsync /home/leilei/bin/xsync 
==================== hadoop101 ====================
root@hadoop101's password: 
root@hadoop101's password: 
sending incremental file list
xsync

sent 693 bytes  received 35 bytes  208.00 bytes/sec
total size is 602  speedup is 0.83

二、分布式集群搭建

2.1 集群规划

三台机器:hadoop101、hadoop102、hadoop103。

使用的用户为:lei 。该用户拥有root用户的权限。

资源分配:

nameNode、Resourcemanager、SecondarynameNode 相对来讲需要的资源更多,因此,把这个分布到不同的机器。

DataNode是负责数据存储的,因为三台机器都有存储资源,因此三台都要有DataNode。Nodemanager是负责资源管理的,因为三台机器都有计算资源,因此三台都要有nodeManager。

hadoop101:   NameNode        DataNode  Nodemanager
hadoop102:  Resourcemanager  DataNode  Nodemanager
hadoop103: SecondarynameNode DataNode  Nodemanager

2.2 集群搭建

1、删除每个节点中hadoop安装目录下的data和logs目录,这是之前留下的记录。

2、配置etc/hadoop/hadoop-env.sh 的javahome

3、配置core-site:定义一个路径变量

<!-- 指定NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop101:9820</value>
</property>
<!-- 指定hadoop数据的存储目录 
     
      官方配置文件中的配置项是hadoop.tmp.dir ,用来指定hadoop数据的存储目录,此次配置用的hadoop.data.dir是自己定义的变量, 因为在hdfs-site.xml中会使用此配置的值来具体指定namenode 和 datanode存储数据的目录
 配置的一个简洁变量
-->
    <property>
        <name>hadoop.data.dir</name>
        <value>/opt/module/hadoop-3.1.3/data</value>
</property>
 
 

4、配置hdfs-site

手动指定存储位置

<!-- 指定HDFS副本的数量 -->
<property>
   <name>dfs.replication</name>
   <value>1</value>
</property>

 <!-- 指定NameNode数据的存储目录 -->
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file://${hadoop.data.dir}/name</value>
  </property>
 <!-- 指定Datanode数据的存储目录 -->

  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file://${hadoop.data.dir}/data</value>
  </property>

   <!-- 指定SecondaryNameNode数据的存储目录 -->

    <property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>file://${hadoop.data.dir}/namesecondary</value>
  </property>

   <!-- 兼容配置,先跳过 -->
    <property>
    <name>dfs.client.datanode-restart.timeout</name>
    <value>30s</value>
  </property>

  <!-- nn web端访问地址-->
<property>
  <name>dfs.namenode.http-address</name>
  <value>hadoop101:9870</value>
</property>
  <!-- 2nn web端访问地址-->

  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop103:9868</value>
  </property>

5、配置yarn-site

<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>
     <!-- 指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop102</value>
</property>
<!-- 环境变量的继承 -->
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
<!--取消虚拟内存的限制 -->    
<property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
</property>

6、配置mapreduce mapred-site

<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  
      // 下面这个不需要配置
<property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>

7、同步配置

xsync  /opt/module/hadoop3.1.3

2.3 集群单点启动

1、如果集群是第一次启动,需要格式化nameNode

hdfs namenode -format

2、启动hdfs

在hadoop101上启动nameNode

hdfs --daemon start namenode

在hadoop101、hadoop102 、hadoop103 上启动datanode

hdfs --daemon start datanode

在Hadoop103 启动secondarynamenode

hdfs --daemon start secondarynamenode

http://hadoop103:9868/status.html

http://hadoop101:9870/dfshealth.html

3、启动yarn

在hadoop102启动resourcemanager

yarn --daemon start resourcemanager

在hadoop101、102、103 启动nodemanager

yarn --daemon start nodemanager

http://hadoop101:8088/cluster

4、集群测试

a、在hdfs上创建一个 /user/lei/input 目录

[root@xiaolei hadoop-3.1.3]# hdfs dfs -mkdir -p /user/leilei/input

b、把本地文件上传到创建的目录中:

[root@xiaolei hadoop-3.1.3]# hdfs dfs -put wcinput/wc.input  /user/leilei/input

c、如何在hdfs查看具体存储,hadoop的默认副本就是三个。如果配置一个的话,它存放的位置是随机的。hdfs文件管理系统。

image.png

d、测试yarn

[lei@hadoop103 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/lei/input /user/lei/output

e、问题 image.png 如果出现这种问题,有两种解决方法,第一种是直接修改配置文件,将hdfs添加配置如下:

<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>

但这种不建议在生产环境使用。

第二种就是添加目录权限:

[lei@hadoop101 hadoop-3.1.3]$ bin/hdfs dfs -chmod -R 777 /

2.4 ssh免密登录

1、存在的问题:

集群的启动和关闭,现在都是通过单点启动和关闭的方式操作的,如果集群的机器很多,怎么办?

2、解决问题的想法

希望把集群启动和关闭的事情写成一个脚本

脚本的大概思路:

登录到hadoop101 启动关闭Namenode。

登录到hadoop102 启动关闭2nn。

登录到hadoop101 、hadoop102 、hadoop103 启动关闭datanode

登录到hadoop102 启动关闭resourcemanager

登录到hadoop101,hadoop102,hadoop103 启动关闭namenode

3、如何登录到远程机器

通过ssh ip/主机名

[root@xiaolei hadoop-3.1.3]# ssh hadoop101
root@hadoop101's password: 
Last login: Wed Aug 26 10:41:51 2020
[root@hadoop101 ~]# exit
登出
Connection to hadoop101 closed.

4、解决ssh登录到远程机器需要输入密码问题

通过公私钥进行免密登录。实现的效果:hadoop101、hadoop102、hadoop103。

[lei@hadoop101 /]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lei/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/lei/.ssh/id_rsa.
Your public key has been saved in /home/lei/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:73UcABIdwg3Vvosv8YTfiZbwnjf+p8kubOPcwZk/ST0 lei@hadoop101
The key's randomart image is:
+---[RSA 2048]----+
|       .=*+o     |
|        .oo..    |
|           ..    |
|            ..   |
|        S  . .. .|
|         .+ oo E.|
|          .X.=O.o|
|         .oo&==*.|
|          .B**B+=|
+----[SHA256]-----+
[lei@hadoop101 /]$ 

授权对其他机器免密:

ssh-copy-id hadoop101
ssh-copy-id hadoop102
ssh-copy-id hadoop103

同理,其他机器也做类似的操作即可完成互相免密登录。

2.5 群起集群

1、需要用到的脚本

在sbin目录下

在namenode所在节点启动
start-dfs.sh 
stop-dfs.sh

在resourcemanager所在节点启动
start-yarn.sh
stop-yarn.sh

2、hadoop如何知道在那些机器启动对应的namenode、secondnamenode、datanode、Nodemanager和resourcemanager

我们在配置文件名已经指定过namenode、secondnamenode、resourcemanager。

还剩的dn和nm 需要通过worker文件来告知启动。 hadoop3 需要通过workers文件配置在哪些节点启动datanode和Nodemanager。

vim /opt/module/hadoop-3.1.3/etc/hadoop/workers

添加ip地址,分发到每个节点。

hadoop101
hadoop102
hadoop103

3、启动集群

1)、启动HDFS:在namenode所在的节点运行启动关闭程序。

start-dfs.sh    stop-dfs.sh

2)、启动关闭yarn:在resourcemanager所在的节点运行start-yarn.sh

start-yarn.sh   stop-yarn.sh

4、管理脚本

进入/home/lei/bin 创建脚本,实现集群的群起 和群停,脚本名:mycluster.sh

#!/bin/bash
if [ $# -lt 1 ]
then
   echo Not Enough Arguement
   exit;
fi
case $1 in
"start")
      echo "========Start Hdfs============"
      ssh hadoop101 /opt/sofeware/hadoop-3.1.3/sbin/start-dfs.sh
      echo "========start yarn==========="
      ssh hadoop102 /opt/sofeware/hadoop-3.1.3/sbin/start-yarn.sh
;;
"stop")
      echo "========stop  yarn============"
      ssh hadoop102 /opt/sofeware/hadoop-3.1.3/sbin/stop-yarn.sh
      echo "========stop hdfs==========="
      ssh hadoop101 /opt/sofeware/hadoop-3.1.3/sbin/stop-dfs.sh
;;
*)
     echo "Input args error"
;;
esac

创建脚本myjps.sh 实现查看每台节点jps的脚本:不用切换其他目录下。

#!/bin/bash
for i in hadoop101 hadoop102 hadoop103
do
   echo "===== $i jps======"
   ssh $i /opt/sofeware/java8/bin/jps
done

赋值权限后,查看该目录,现在有三个脚本了:

[lei@hadoop101 bin]$ ll
总用量 12
-rwxrwxrwx  1 lei lei 581 3月  17 21:25 mycluster.sh
-rwxrwxrwx  1 lei lei 126 3月  17 21:27 myjps.sh
-rwxrwxrwx. 1 lei lei 613 3月  15 21:23 xsync

群起测试:

[lei@hadoop101 hadoop]$ mycluster.sh start
========Start Hdfs============
Starting namenodes on [hadoop101]
Starting datanodes
Starting secondary namenodes [hadoop103]
========start yarn===========
Starting resourcemanager
Starting nodemanagers

[lei@hadoop101 hadoop]$ myjps.sh 
===== hadoop101 jps======
41730 NodeManager
42325 Jps
40696 NameNode
40911 DataNode
===== hadoop102 jps======
30074 Jps
29099 ResourceManager
29326 NodeManager
28383 DataNode
===== hadoop103 jps======
23360 NodeManager
22962 SecondaryNameNode
22547 DataNode
24025 Jps

2.6 配置历史服务器

为了查看程序的历史运行情况,需要配置下历史服务器,具体的配置如下:

1)配置mapred-site.xml

在该文件里面增加如下配置:

<!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop101:10020</value>
</property>
 
<!-- 历史服务器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop101:19888</value>
</property>

2)分发配置

xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml

3)启动关闭历史服务器

mapred --daemon start historyserver
mapred --daemon stop  historyserver

4)查看jobhistory

http://hadoop101:19888/jobhistory

2.7 配置日志的聚集功能

日志聚集概念:应用运行完成以后,将程序的日志信息上次到HDFS系统上。

聚集功能的好处:可以方便的查看程序运行详情,方便开发调试。

注意:开启日志聚集功能,需要重新启动NodeManager、ResourceManager、HistoryManager。

1、配置yarn-site.xml

//启用日志聚集
 <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
</property>
<property> 
        <name>yarn.log.server.url</name> 
        <value>http://hadoop101:19888/jobhistory/logs</value> 
</property>
<property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
</property>

2、分发配置

xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml

3、重新启动集群

可以看到历史服务器在起着作用:

image.png

2.8 集群时间同步

时间同步有两种方式:

1、通过网络进行时钟同步(必须保证虚拟机能连上外网)

三台机器都安装ntpdate

yum -y install ntpdate

阿里云时钟同步服务器

sudo ntpdate ntp4.aliyun.com

三台机器定时任务

crontab -e

添加下面内容:

*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;

2、找一个机器作为时间服务器,所有的机器与这台机器时间进行定时的同步。(暂不讲解这种)