Hadoop 运行环境搭建与完全分布式部署

虚拟机环境搭建

本机操作系统配置如下:

  • linux 版本:CentOS Linux release 7.4.1708(Core)
    运行命令 cat /etc/redhat-release
  • cpu info:Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
    运行命令 grep "model name" /proc/cpuinfo | cut -f2 -d:
  • cpu cores:4
    运行命令 cat /proc/cpinfo | grep "cpu cores" | uniq
  • MemTotal:7872792 kB
    运行命令 grep MemTotal /proc/meminfo
  • 位数:64
    运行命令 getconf LONG_BITecho $HOSTTYPE

安装 vmware

首先去官网下载 vmware ,根据系统版本选择 windows 或者 linux,我选择的 vmeare 版本是 VMware-Workstation-Full-14.1.3-9474260.x86_64.bundle

进入下载目录后,先给运行文件赋予执行权限,命令如下:

1
sudo chmod +x VMware-Workstation-Full-14.1.3-9474260.x86_64.bundle

然后运行文件,命令如下:

1
sudo ./VMware-Workstation-Full-14.1.3-9474260.x86_64.bundle

跳出安装界面,不断点击下一步,进行安装即可。

在 wmware 中安装 CentOS

进入 CentOS官网 找到相应的镜像,点击下载。

02_01_download

我选择的是阿里云的镜像。然后打开安装好的 wmware 软件

02_02_create

点击自定义安装

02_03_Custom

选择 Workstation 12.x 选项

02_04_Workstation

选择之后载入系统镜像(其实选择直接载入也是一样的)

02_05_ISO

选择相应的系统,与系统版本

02_06_linux

选择虚拟机安装目录

02_07_location

根据电脑系统情况,选择处理器和核数

02_08_cores

选择内存大小

02_09_memory

添加网络类型

02_10_network

I/O控制器选择推荐的就好了

02_11_IO

磁盘类型,同样选择推荐

02_12_disk

创建新的虚拟盘

02_13_virtual

按需设置磁盘大小

02_14_disksize

指定磁盘文件

02_15_diskfile

点击自定义硬件

02_16_hardware

光驱中选择已经下载好的镜像文件,点击关闭

02_17_browse

CentOS 启动初始化设置

启动虚拟机

03_01_start

选择语言

03_02_language

软件选择,不选默认是最小安装

03_03_software

勾选图形化界面,有图形化比较好操作,如果 linux 窗口命令玩的溜也可以最小化安装

03_04_gnome

点击完成,点击开始安装,稍等大概 5 分钟左右,安装成功,期间设置 root 账户密码,user 账户密码

03_05_root

重启电脑,配置完成

安装 VMTools 工具

什么是 VM tools ? 顾名思义就是 Vmware 的一组工具。主要用于虚拟主机显示优化与调整,另外还可以方便虚拟主机与本机的交互,如允许共享文件夹,甚至可以直接从本机向虚拟主机拖放文件、鼠标无缝切换、显示分辨率调整等,十分实用。

重启虚拟机后,点击左上角 VM 图标,选择 Install VMware Tools 选项

04_01_VM

04_02_install

打开终端,使用 root 权限运行如下命令,挂载 CD-DVD

1
>>> mount -t auto /dev/cdrom /mnt/cdrom

若文件夹 /mnt/cdrom 不存在,手动创建一下,再次运行上述命令

进入挂载的文件夹 /mnt/cdrom 后运行命令 ll 查看文件内容,如下图

04_03_mount

运行如下命令,文件 VMwareTools-10.2.5-8068393.tar.gz 保存到你希望存放的位置,我直接放在了桌面上

1
>>> cp VMwareTools-10.2.5-8068393.tar.gz /home/luoteng/桌面

04_04_tar

解压 VMwareTools 文件,运行如下命令或者鼠标右键文件选择解压

1
>>> tar -zxvf VMwareTools-10.2.5-8068393.tar.gz

解压完成,进入解压后的文件夹 wmware-tools-distrib 如下图所示

04_05_distrib

打开终端,首先进入解压文件目录,运行如下命令,进行安装

1
2
>>> cd wmware-tools-distrib
>>> ./vmware-install.pl

04_06_pl

然后根据屏幕提示一路回车。到此整个安装过程算是完成了。

如果安装过程中出现问题,建议安装之前执行一下安装 GCC 和 PERL,命令如下:

1
2
3
>>> yum install perl gcc kernel-devel
>>> yun -y install kernel-devel-$(uname -r)
>>> yum -y install net-tools perl gcc gcc-c++

如下图:
图 04_07

配置共享目录

点击左上角 VM 图标,选择 Settings 选项,选择 Always enabled

05_01_Settings

设置共享文件夹名字和路径,点击确定 OK ,然后保存 Save
05_02_share

hadoop 运行环境搭建

克隆虚拟机

鼠标移至待复制的虚拟机上,右键 -> Manage -> Clone

06_01_clone

06_02_next

创建完整克隆
06_03_full

设置虚拟机名称和存放位置
06_04_name

点击完成,等待几分钟,克隆完毕
06_05_cloning

06_06_finish

配置网络

点击左上角 Edit 图标,选择 Virtual Network Editor 选项,查看 IP 地址是否设置正确,如下图

07_01_NAT

设置静态 ip

点击左上角 VM 图标,选择 Settings 选项,查看网络适配器中的物理地址,没有点击生成一个(必须关闭虚拟机才能生成),如下图

07_02_adapter

或者在终端运行命令 ifconfig 也可以查看,如下图

07_03_ifconfig

启动虚拟机,在终端命令窗口中输入如下命令,对文件进行修改(不同机器文件名 ens33 会有所不同):

1
>>> vim /etc/sysconfig/network-scripts/ifcfg-ens33

需要修改的内容有 6 项

  • HWADDR=00:0C:29:D3:57:98
  • IPADDR=192.168.1.101
  • GATEWAY=192.168.1.2
  • ONBOOT=yes
  • BOOTPROTO=static
  • DNS1=8.8.8.8

07_04_ifcfg

修改完成后退出,运行下面命令重启网络服务,然后重新启动虚拟机

1
>>> service network restart

修改主机名

修改 linuxhosts 文件,进入 Linux 系统查看虚拟机的主机名。通过 hostname 命令查看。

如果感觉此主机名不合适,我们可以进行修改。CentOS 6 通过编辑 /etc/sysconfig/network 文件, CentOS 7 通过编辑 /etc/hostname 文件。我将虚拟机主机名改为 hadoop101

1
>>> vim /etc/hostname

打开虚拟机的 /etc/hosts 文件,添加如下内容

  • 192.168.1.100 hadoop100
  • 192.168.1.101 hadoop101
  • 192.168.1.102 hadoop102
  • 192.168.1.103 hadoop103
1
>>> vim /etc/hosts

08_01_hosts

我们在主机的终端下运行一下 ping hadoop101 ,发现主机无法识别虚拟机的名称,如下图:

08_02_ping

同样按照上面的方法修改下主机的 /etc/hosts 文件,如下图

08_03_hosts

在运行一下命令 ping hadoop101 ,OK,主机与虚拟机已经能够连接,如图

08_04_hadoop101

关闭防火墙

查看防火墙开机启动状态

1
>>> systemctl status firewalld

09_01_status

如图上方框所示,说明防火墙处于启动状态,运行下面第一条命令进行临时关闭(重启后又回到启动状态),运行下面第二条命令进行永久关闭(如果想恢复 disable 改为 enable

1
2
>>> sudo systemctl stop firewalld
>>> sudo systemctl disable firewalld

运行命令后我们在看一下防火墙状态,如下图
09_02_dead

设置用户具有 root 权限

运行如下命令,进入相应文件

1
>>> vim /etc/sudoers

修改以下内容,如图

09_03_ALL

修改完毕,现在可以用 luoteng 帐号登录,然后用命令 su- ,即可获得 root 权限进行操作。

下载 jdk

若虚拟机自带 jdk 1.7 以上版本可以跳过下载和安装步骤。

首先进入Oracle官网,如下图

10_01_download

点击 Downloads 进入下载界面,如下图

10_02_jdk

点击 Java for Developers 进入下一页面,移动至最底端,如图

10_03_history

点击 DOWNLOAD ,找到 Java SE 8 历史版本页面入口,如图

10_04_SE8

点击 Java SE 8 ,找到 jdk-8u144-linux-x64.tar.gz 进行下载,如下图所示

10_05_jdk8

注意点击上方 Accept License Agreement 点的原圆点,否则无法下载资源,另外下载前需要注册一下 Oracle 账号

/opt 目录下创建 modulesoftware 两个文件夹,一个用来存放 jar 包,一个用来 存放 jar 包解压后的文件。

1
2
>>> sudo mkdir module
>>> sudo mkdir software

10_06_mkdir

运行命令 ll 发现文件夹的所有者为 root 账号,为了方便以后用 luoteng 账号操作,修改 module software 文件夹的所有者。

1
>>> sudo chown luoteng:luoteng module/ software/

10_07_chown

把上面下载好的 jdk 文件放入目录 software ,同时把事前准备好的 hadoop jar 包也放入目录 software ,待安装文件准备就绪,准备安装。

10_08_software

安装 jdk

解压 jdk/opt/module 目录下

1
>>> tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/

11_01_jdk

配置 jdk 环境变量,首先进入目录 /opt/module/jdk1.8.0_144 ,运行命令 pwd 获取路径地址,如下图

11_02_pwd

运行命令 sudo vim /etc/profile 打开 /etc/profile 文件,在末尾作如下修改:

1
2
3
##JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin

11_03_javahome

运行如下命令,让修改的文件生效,并测试一下 jdk 是否安装成功

1
2
>>> source /etc/profile
>>> java -version

11_04_version

配置 hadoop

安装 hadoop

进入到 Hadoop 安装包路径下,解压 hadoop/opt/module 目录下

1
>>> tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/

12_01_hadoop

查看是否解压成功

1
>>>  ls /opt/module/

12_02_tar

配置环境变量,首先进入目录 /opt/module/hadoop-2.7.2 ,运行命令 pwd 获取路径地址,如下图
12_03_pwd

运行命令 sudo vim /etc/profile 打开 /etc/profile 文件,在末尾作如下修改:

1
2
3
4
##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

12_04_hadoophome

运行如下命令,让修改的文件生效,并测试一下 hadoop 是否安装成功

1
2
>>> source /etc/profile
>>> hadoop

12_05_hadoop

如上图所示,表示安装完成。

hadoop 文件说明

进入 hadoopbin 目录下,看下都有哪些命令,如下图
12_06_bin

hdfs 管理分布式文件系统,hadoop 管理整个集群,yarn 负责资源调度。

进入 hadoopetc/hadoop 目录,里面存放所有的 hadoop 的配置文件,看下都有哪些配置文件,如下图
12_07_etc

进入 hadoopsbin 目录,里面存放启动集群和停止集群的命令,看下都有哪些命令,如下图
12_08_sbin

完全分布式部署 Hadoop

  1. 准备 3 台客户机(关闭防火墙、 静态 ip、主机名称)
  2. 安装 jdk
  3. 配置环境变量
  4. 安装 hadoop
  5. 配置环境变量
  6. 安装 ssh
  7. 配置集群
  8. 启动测试集群

hadoop 的完全分布式部署步骤总结如上,其中 1~5 上文都有讲解,我们就不一台一台的配置客户机,直接拿配置好的虚拟机进行克隆。

准备虚拟机

我们在 hadoop101 的基础上克隆在克隆两台虚拟机。克隆好的虚拟机记得一定更改相应的 ip 地址主机名称物理地址等信息。

我们将两台克隆好的虚拟机分别命名为 hadoop102hadoop103 ,网络IP地址分别设置为 192.168.1.102192.168.1.103 。如下图所示:
13_01_102103

远程同步工具 rsync

rsync 远程同步工具,主要用于备份和镜像。具有速度快、 避免复制相同内容和支持符号链接的优点。

rsyncscp 区别: 用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更新。scp 是把所有文件都复制过去。

相关命令

  • 查看 rsync 使用说明
    man rsync | more
  • 基本语法
    rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
    选项:
    • -r 递归
    • -v 显示复制过程
    • -l 拷贝符号连接

编写集群分发脚本

hadoop101home/user/bin 目录下创建文件 xsync

首先运行命令 mkdir bin 创建文件夹 bin ,再运行命令 touch xsync 创建 xsync 文件。如下图所示:
13_02_touch

运行命令 sudo vim xsync ,然后在文件中写入如下内容:

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
#!/bin/bash
#1 获取输入参数个数, 如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi

#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname

#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

#4 获取当前用户名称
user=`whoami`

#5 循环
for((host=102; host<104; host++)); do
#echo $pdir/$fname $user@hadoop$host:$pdir
echo --------------- hadoop$host ----------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done

13_03_xsync

修改脚本 xsync 具有执行权限

1
>>> chmod 777 xsync

13_04_chown

测试 xsync 脚本,将 hadoop101bin 目录及文件分发到 hadoop102hadoop03 上,运行如下命令

1
>>> xsync bin/

运行结果如下图
13_05_xsyncbin

上图中每次分发文件都需要输入密码(红框部分),如果有 100 台服务器岂不是要输入 100 次?下面我们设置一下 SSH 免密码登陆,设置后可以解决输入密码问题。

SSH 免密登陆

ssh 免密登陆原理如下图所示
13_06_ssh

无密钥配置操作步骤

  1. 进入到我的 home 目录的 .ssh 文件夹下(如果没有该文件夹,可以运行下 ssh 命令会自动生成一个)

    1
    >>> cd ~/.ssh
  2. 生成公钥和私钥

    1
    >>> ssh-keygen -t rsa

    然后敲(三个回车),就会生成两个文件 id_rsa (私钥)、 id_rsa.pub (公钥)
    13_07_keygen

  3. 将公钥拷贝到要免密登录的目标机器上

    1
    2
    3
    >>> ssh-copy-id hadoop102
    >>> ssh-copy-id hadoop103
    >>> ssh-copy-id hadoop101

    运行完成后,我们发现目标机器上的 .ssh/ 文件夹下会多出一个 authorized_keys 文件,如下图
    13_08_authorized

同样的操作步骤在 hadoop102 上执行一边。因为后面集群配置的时候我们将 hadoop101 设置为 NameNode ,将 hadoop102 设置为 ResourceManager,这两个节点都需要进行文件分发操作。

同理,我们只让 hadoop101 上的 luoteng 账户进行分发授权,root 账户还没有免密登陆授权,所以在 hadoop101hadoop101 切换下 root 账号,同样操作步骤再来一轮。

我们在进行 ssh 远程登录,就不需要输入密码了,如下图所示
13_09_ssh

.ssh 文件夹下的文件功能解释

  • ~/.ssh/known_hosts :记录 ssh 访问过计算机的公钥(public key)
  • id_rsa :生成的私钥
  • id_rsa.pub :生成的公钥
  • authorized_keys :存放授权过得无秘登录服务器公钥

集群配置

集群部署规划

hadoop101 hadoop102 hadoop103
HDFS NameNode
DataNode

DataNode
SecondaryNameNode
DataNode
YARN
NodeManager
ResourceManager
NodeManager

NodeManage

配置 core-site.xml

进入目录 etc/hadoop ,打开 core-site.xml 文件

1
>>> vim core-site.xml

在文件中写入如下内容:

1
2
3
4
5
6
7
8
9
10
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>

如下图所示
14_01_coresite

配置 Hdfs

打开 hadoop-env.sh 文件

1
>>> vim hadoop-env.sh

修改文件内容 export JAVA_HOME=/opt/module/jdk1.8.0_144 ,如下图
14_02_hadoopsh

打开 hdfs-site.xml 文件

1
>>> vim hdfs-site.xml

在文件中写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>

<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:50090</value>
</property>

如下图所示
14_03_hdfs

配置 yarn

打开 yarn-env.sh 文件

1
>>> vim yarn-env.sh

修改文件内容 export JAVA_HOME=/opt/module/jdk1.8.0_144 ,如下图
14_04_yarnenv

打开 yarn-site.xml 文件

1
>>> vim yarn-site.xml

在文件中写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
<!-- reducer 获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 指定 YARN 的 ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>

如下图所示
14_05_yarnsite

配置 mapreduce

打开 mapred-env.sh 文件

1
>>> vim mapred-env.sh

修改文件内容 export JAVA_HOME=/opt/module/jdk1.8.0_144 ,如下图
14_06_mapredenv

首先将配置文件 mapred-site.xml.template 拷贝一份,命名为 mapred-site.xml

1
>>> cp mapred-site.xml.template mapred-site.xml

打开 mapred-site.xml 文件

1
>>> vim mapred-site.xml

在文件中写入如下内容:

1
2
3
4
5
<!-- 指定 mr 运行在 yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

如下图所示
14_07_mapredsite

配置 slaves

打开 slaves 文件

1
>>> vim slaves

在该文件中添加(有几个 DataNode 就添加几个节点)

1
2
3
hadoop101
hadoop102
hadoop103

如下图所示
14_08_slaves

注意该文件下不能有空格,也不允许有换行。配置该文件的主要目的是群起集群,如果不配置该文件,集群只能一个节点一个节点启动。

在集群上分发配置文件

退回到 etc 目录下,运行下面命令,将 hadoop 文件夹下所有文件进行分发操作

1
>>> xsync hadoop/

14_09_xsync

如上图,我们注意到,由于前面配置过 ssh 免密登陆,这里不需要输入密码了,完美!

群启集群

如果集群是第一次启动,需要格式化 NameNode ,命令如下:

1
>>> bin/hdfs namenode -format

14_10_format

我们看到 hadoop 跟目录下没有 datalogs 文件夹,是因为这是第一次启动集群,如果不是第一次启动集群而进行格式化操作,需要运行命令 rm -rf data/ logs/ 删除 datalogs 文件夹的内容,在进行格式化操作,否则会出现问题。

见到如下图所示的样子,表示格式化完成。
14_11_namenode

启动集群,在 hadoop101 节点的 /opt/module/hadoop-2.7.2 目录下,运行命令:

1
>>> sbin/start-dfs.sh

14_12_dfs

启动 yarn ,在 hadoop102 节点的 /opt/module/hadoop-2.7.2 目录下,运行命令:

1
>>> sbin/start-yarn.sh

14_13_yarn

集群启动后,我们分别在三个节点上输入命令 jps 看下启动的节点是否跟我们预先设定的集群部署规划一致:

14_14_hadoop101

14_15_hadoop102

14_16_hadoop103

网页中查看

集群启动之后,我们可以通过网页对 hadoopHDFS 文件系统和 yarn 管理系统进行查看。

web 端查看 HDFS 文件系统,在网页中输入:

http://192.168.1.101:50070/dfshealth.html#tab-overview

如下图所示:
15_01_hdfs

点击标签 Utilities -> Browse the file system ,即可以浏览文件。
15_02_hdfs

yarn 的浏览器页面查看地址:

http://192.168.1.102:8088/cluster

如下图所示:
15_03_yarn

集群启动与停止

集群停止命令很简单,只需要将启动的 start 改成 stop 即可。

各个服务组件逐一启动

  • 分别启动 hdfs 组件

    1
    >>> hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
  • 启动 yarn

    1
    >>> yarn-daemon.sh start|stop resourcemanager|nodemanager

各个模块分开启动(配置 ssh 是前提) 常用

  • 整体启动/停止 hdfs

    1
    2
    >>> start-dfs.sh
    >>> stop-dfs.sh
  • 整体启动/停止 yarn

    1
    2
    >>> start-yarn.sh
    >>> stop-yarn.sh
  • 全部启动(不建议使用)

    1
    2
    >>> start-all.sh
    >>> stop-all.sh
坚持原创技术分享,您的支持将鼓励我继续创作!