大数据–实分布部署Hadoop

系统及环境

网络环境:处于局域网下的部分机器(>=4)
系统版本:win10较新版本,支持子系统
子系统版本:ubuntu18.04
其他软件:Xshell6,Xftp6
实验要求:在多台机器上安装hadoop,配置完成后,可以在完成官方demo的wordcount功能,实现其他功能

下载安装wsl(ubuntu)

  1. 系统要求:win10较新版本
  2. 修改电脑名(用以在ubuntu中分辨是哪台电脑,这一步推荐在后面其他节点修改配置里做):右击此电脑-属性-更改设置-计算机描述(ustc+序号)-更改-计算机名(ustc+序号)-稍后重启
  3. 关闭防火墙:控制面板-网络和Internet-网络和共享中心-wd防火墙(左下角)-启用或关闭wd防火墙-稍后重启
  4. 开启wsl功能:打开控制面板-程序-启用或关闭windows功能-勾选适用于Linux的Windows子系统-重启电脑
  5. 打开Microsoft Store,搜索ubuntu,选择18.04下载
  6. 先创建ustc用户,密码也为ustc(只是为了好记)
  7. 创建hadoop用户
1
2
3
4
5
$sudo useradd -m hadoop -s /bin/bash # 创建hadoop用户,并使用/bin/shell作为shell
$sudo passwd hadoop #为hadoop用户设置密码
$sudo adduser hadoop sudo #为hadoop用户增加管理员权限
$su - hadoop #切换当前用户为hadoop
$sudo apt-get update #更新hadoop用户的apt,方便后面安装ssh

安装ssh并设置免密码登录

  1. 安装ssh,生成公钥和私钥
1
2
3
4
5
6
7
$ sudo apt-get install openssh-server	#安装SSH server
$ cd /home/hadoop # 进入hadoop下
$ ssh-keygen -t rsa #一直回车,会在用户文件夹下生成.ssh文件夹,文件夹下生成三个文件,不要添加sudo,否在会报错
$ sudo /etc/init.d/ssh start #启动ssh服务
若启动报错,则将没有的文件对应生成一下
$ sudo ssh-keygen -t rsa -f /etc/xxx
$ ps -e |grep ssh #查看ssh进程,显示有ssh服务则为成功
  1. 生成密钥和公钥并将公钥复制给其他机器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
免密登录过程简介:本机生成公钥id_rsa.pub(上一步已经做好),将生成的公钥上传到目标机器上的授权文件authorized_keys,本机即可免密登录目标机

创建授权文件:将id_rsa.pub的内容给authorized_keys,若没有auth文件则会自动生成一个
$ cd /home/hadoop/.ssh #进入用户文件夹下面的.ssh文件夹
$ cat id_rsa.pub>>authorized_keys

给.ssh文件夹和authorized_keys授权,权限如下
$cd /home/hadoop/.ssh #已经在这一步请不用操作
$sudo chmod 600 authorized_keys
$cd ..#回到上一层目录
$sudo chmod 700 .ssh
$cd ..#回到上一层目录
$sudo chmod 700 hadoop #将.ssh上级目录授权为700

修改配置
$sudo vim /etc/ssh/sshd_config
Port xxx (可以修改成其他统一端口号)
PermitRootLogin yes
将下面配置更改为yes
PasswordAuthentication yes(不修改会报权限问题)
$ sudo /etc/init.d/ssh restart #重启ssh服务

将客户端的公钥~/.ssh/id_rsa.pub通过ssh-copy-id -i拷贝到服务器(只需要将master节点的公钥复制给其他datanode节点,其他的可以不用复制)
$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@xxx.xxx.xxx.xxx -p xxxx
user代表Linux用户,xxx.xxx.xxx.xxx代表远程主机地址,下面为例子:
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.xxx -p xxxx
需要输入目标机器用户的密码,如hadoop用户的密码hadoop

如果公钥拷贝没有报错,使用命令即可免密码登录另一台机器
$ ssh -p 6666 hadoop@192.168.1.xxx #-p后面代表的是端口号 就是上一步修改的配置里面的Port


以上免密为本机登录其他机器的操作,并不需要每台机器都需要进行拷贝操作,只需要一台作为主机分发到其他机器即可

安装Java并配置环境变量

  1. 安装xshell和xftp,安装直接一路确认即可
  2. 尝试使用xshell连接自己的机子,以下命令都可以在xshell里运行,当然原来的界面也是可以的(连接步骤略)
  3. 安装java,并配置环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ sudo mkdir /usr/local/java#在/usr/local下创建java文件夹

将jdk-8xxxx-linux-x64复制到c盘下,右击属性给文件授予全部权限,以便方便上传到wsl里面
$ cd /mnt/c #进入win的c盘
$ cp jdk-8xxxx-linux-x64.tar.gz /usr/local/java

进入java文件夹,并进行解压
$cd java/
$tar -zxvf jdk-8xxxx-linux-x64.tar.gz#解压
java文件下面会出现jdk1.8xxxx文件夹

如果遇到权限问题或者进不去java文件夹,请将/usr/local的文件夹授予权限
$ sudo chmod 777 /usr/local/java

配置环境变量
$ sudo vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8xxxx
export PATH=${PATH}:${JAVA_HOME}/bin
注意:“=”两边不要有空格

使环境变量生效
$ source /etc/profile
注意:请不要加sudo,source是bash的内建命令,那样会报找不到命令的错误

验证java环境是否配置完成
$ java -version

如果正常命令下来还是找不到,请参考:
告诉Ubuntu  Java JDK的位置
$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_231/bin/java" 1
$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_231/bin/javac" 1
$ sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_231/bin/javaws" 1
相应的将其设为默认方式:
$ sudo update-alternatives --set java /usr/local/java/jdk1.8.0_231/bin/java
$ sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_231/bin/javac
$ sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_231/bin/javaws
参考文章:https://blog.csdn.net/weixin_42001089/article/details/81865101

其他节点配置(重要)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
将所有的主机的host都配置一下,添加每台机器的ip和对应名称,如
这里由于wsl和win系统用的同一个hosts,所以我们需要修改win10下面的hosts

我们打开此电脑-C盘-window-system32-divers-etc-hosts

将所有配置项全部注释,在前面加上#
添加以下若干项,这里以我们配置的四台机器为例
192.168.1.100 ustc01
192.168.1.158 ustc02
192.168.1.58 ustc03
192.168.1.75 ustc04
(重要)将其他ip配置关闭,前面全部添加#,只保留上面四个配置,要不然在之后hadoop的监控页面看不到datanode节点信息。

如果因为没有权限进行保存,可以先拷贝到桌面进行修改,修改完复制回去覆盖

重启win电脑
记得开电脑后,开启一下ssh服务,命令见最后面的演示段落

如果Java是单独每个人配置的,以下步骤可以不做
分发hadoop到其他节点
$scp -P 6666 /home/hadoop/hadoop-2.7.7.tar.gz ustc02:/home/hadoop #-P为大写,后接端口号。
$scp -P 6666 /home/hadoop/hadoop-2.7.7.tar.gz ustc03:/home/hadoop #-P为大写。
$scp -P 6666 /home/hadoop/hadoop-2.7.7.tar.gz ustc04:/home/hadoop #-P为大写。

解压与配置和前面的java是一样的,参考前面,写了的话请忽略

主节点安装hadoop并分发到其他节点

(本配置只需要主要的namenode进行配置即可,其他datanode之后进行分发即可)

  1. 类似java的上传,将hadoop压缩包放到c盘下进行授权,并上传,本次上传路径为/home/hadoop(命令省略,请参考java配置)

  2. 配置hadoop的四个xml文件和一个子节点标识文件(所有节点这几个信息请保持一致)

    1. 修改core-site.xml

      1
      2
      3
      4
      5
      6
      <configuration>
      <property>
      <name>fs.default.name</name>
      <value>hdfs://ustc01:9000</value>
      </property>
      </configuration>
    2. 修改hdfs-site.xml

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      <configuration>
      <property>
      <name>dfs.replication</name>
      <value>3</value>
      <description>副本个数,配置默认是3,应小于datanode机器数量</description>
      </property>
      <property>
      <name>dfs.namenode.dir</name>
      <value>file:/home/hadoop/hadoop-2.7.7/tmp/dfs/name</value>
      <description>namenode上数据块的物理存储位置</description>
      </property>
      <property>
      <name>dfs.datanode.dir</name>
      <value>file:/home/hadoop/hadoop-2.7.7/tmp/dfs/data</value>
      <description>datanode上数据块的物理存储位置</description>
      </property>

      <property>
      <name>dfs.name.data.registration.ip-hostname-check</name>
      <value>false</value>
      </property>
      </configuration>
    3. 修改mapred-site.xml,本文件没有,需要运行以下命令

      1
      mv mapred-site.xml.template mapred-site.xml  #重命名
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      #这里是配置信息
      <configuration>
      <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
      </property>
      <!--<property>
      <name>mapred.job.tracker</name>
      <value>hdfs://ustc01:9001</value>
      </property>-->
      </configuration>
    4. 修改yarn-site.xml

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      <configuration>
      <!-- Site specific YARN configuration properties -->
      <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
      </property>
      <property>
      <name>yarn.resourcemanager.hostname</name>
      <value>ustc01</value>
      <description>resourcemanager位置</description>
      </property>
      <property>
      <name>yarn.nodemanager.vmem-pmem-ratio</name>
      <value>1000</value>
      <description>虚拟内存是物理内存的多少倍,这里请根据自己机器配置,默认是2.1,我这里改成1000是因为,运行wordcount时虚拟内存需要1.2TB,但是物理内存只有2G,所以我直接写了1000,这里很重要就是这个导致我们一致测试出错,这里就是原因所在,</description>

      </property>
      </configuration>

      比如卡在job,或者卡在map0%,reduce 0%,请把vmem-check-enabled的false关掉,或者不要多配,这里没看懂的,请忽略,遇到类似问题再看这个
    5. 修改slaves文件

      这里存放datanode节点名,主机节点名称不要添加,如

      1
      2
      3
      4
      5
      ustc02
      ustc03
      ustc04

      请输入你需要连接的所有datanode节点名
  3. 分发到其他节点,并配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
将配置好的文件夹,压缩打包
$ cd /home/hadoop
$ rm hadoop-2.7.7.tat.gz #删除原来上传的压缩包
$ tar -zcf hadoop-2.7.7.tar.gz hadoop-2.7.7/

$ scp -P 6666 hadoop-2.7.7.tar.gz ustc02:/home/hadoop #分发hadoop,-P为大写。
这里解压也是类似java解压配置配置

配置环境变量
$ sudo vim /etc/profile #在刚刚配置的java环境下添加配置成如下格式
export JAVA_HOME=/usr/local/java/jdk1.8.0_231
export HADOOP_HOME=/home/hadoop/hadoop-2.7.7 exportPATH=${PATH}:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:
使环境变量生效
$ source /etc/profile
注意:请不要加sudo,source是bash的内建命令,那样会报找不到命令的错误

验证hadoop环境是否配置完成
$ hadoop
如果没有报错就是成功配置了环境

由于之前我们修改了默认的22端口为6666,这里修改Hadoop的相关端口号
在hadoop-2.7.7/etc/hadoop目录修改 hadoop-env.sh 文件添加如下语句。
在最后面添加,方便寻找
$sudo vim /home/hadoop/hadoop-2.7.7/etc/hadoop/hadoop-env.sh
export HADOOP_SSH_OPTS="-p 6666"
将JAVA_HOME等号后面用/usr/local/java/jdk1.8.0_231替换掉
JAVA_HOME=/usr/local/java/jdk1.8.0_231
  1. 开启与关闭以及验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ hadoop namenode -format #格式化主节点,本条命令请不要乱输入,请部署完所有节点之后进行输入

#开启与关闭,只需要在namenode节点上输入,不要都输入了
$ start-all.sh #开启全部服务
$ stop-all.sh #关闭全部服务
$ start-dfs.sh #开启hdfs
$ start-dfs.sh #关闭hdfs

验证是否已经启动,在每个节点输入
$ jps
如果在namenode节点上显示了namenode,在datenode上显示了datanode就表示启动正常

打开win系统的浏览器,输入http://ustc01:50070,如果显示namenode与datanode节点信息正确即成功
这个网址也是心跳监管系统,展示时需要打开
  1. 代码(@TODO 冉哥豪哥 done)

  2. 文档(@TODO锋哥辉哥雷哥林哥ing)

  3. 剩余部署(@TODO洋哥ing)

    ​ 2019-11-20

开机演示需要进行的操作:

  1. 打开wsl

  2. 运行ssh(可以设置自启动,这里懒得设置)

    1
    2
    演示时需要每台机子运行这条命令,开启ssh命令
    $sudo service ssh --full-restart
  3. 一开机,hosts就变回去了,这个还没解决(待修复)

    1
    2
    3
    4
    5
    $sudo vim /etc/hosts
    192.168.1.100 ustc01
    192.168.1.158 ustc02
    192.168.1.58 ustc03
    192.168.1.75 ustc04