Power by GeekHades

Hadoop学习笔记——分布式部署

前言

在上文『Hadoop学习笔记——安装Hadoop3.x』的一节中详细的讲了Hadoop3.x在Ubuntu上的部署步骤,包括单机运行模式以及伪分布式模式,这节我们当独来讲一下实际的分布式部署模式。

注:本节的所有环境配置都基于上一节的基础,因此,建议先按照上一节配置步骤配置完成后再阅读此文。

虚拟机环境及相关配置

  • VM:VMware Fusion 10.1.0 for Mac
  • 虚拟操作系统:ubuntu 16.04 LTS (64 bit)
  • 网络模式:桥接模式
  • 虚拟机个数:2台(Master和Slave) PS:学习用的话2-3台其实已经足够因为再多下去只是重复相同的工作而已,而且过多会导致原系统资源不足。
  • IP地址配置:Master(192.168.0.105), Slave(192.168.0.104)

注:可以利用VMware提供的克隆虚拟机的功能来创建多台新的虚拟机,这就能够避免对多台机器反复配置。

具体步骤

配置hostname和hosts文件

  • 配置/etc/hostname是为了方便区分两台虚拟机
  • 配置/etc/hosts是为了方便hadoop找到其他工作机。

在Master机器上,使用命令

sudo vim /etc/hostname

将原先的localhost改为Master。在Slave机器上,修改为Slave

使用命令

sudo vim /etc/hosts

分别对Master和Slave两台机器的hosts文件进行修改,内容如下:

127.0.0.1   localhost
192.168.0.105   Master    # Master的IP地址
192.168.0.104   Slave     # Slave的IP地址

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

两个文件都配置完成后,重启Master和Slave,待重启完成后在此打开命令行即可看到主机名已经被改变。

此时在Master的命令行中输入

ping Slave -c 3

看是否能够成功与Slave机器获得通信。在Slave上就执行

ping Master -c 3

SSH无密码登录

在上一节中已经有提到过Master的Hadoop必须要确保能够无密码的登录到各个Slaves机器上启动相关的datanode程序。如果是使用克隆虚拟机方式来创建Slave机器的话,那么原先的Master已经可以无密码登录,Slave其实也可以无密码登录。

Master命令行中键入命令

ssh slave

首次登录可能会提示将对应机器公钥加入授权文件中输入yes即可。如果能顺利登录则该步骤已经完成,若未能顺利登录请参考『Hadoop学习笔记——安装Hadoop3.x——SSH配置』部分内容。

配置Hadoop PATH变量

为了方便之后hadoop的命令输入,我们需要在Master上配置以下Hadoop的 PATH变量

使用vim打开~/.bashrc文件,并在最后一行追加以下内容:

# config hadoop
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin

保存该文件后使用

source ~/.bashrc

对该文件进行重新链接。

修改Hadoop相关配置文件

对于以下的所有操作均在Master机器上执行,之后将压缩包通过scp命令分发到各个Slave机器上即可。

为了达到分布式所必需的启动条件,我们需要修改/usr/local/hadoop/etc/hadoop目录下的workers(在2.x之前是slaves,3.x之后改为workers)、core-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml

  • workers文件

该文件记录了所有数据节点的主机名,一行一个。默认为localhost,在分布式模式下如果Masterworkers中配置了localhost则表示Master即充当NameNode也充当DataNode。如果不配置则表明Master只充当NameNode,本文这里让Master只充当NameNode。配置文件如下:

Slave
  • core-site.xml,修改内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>file:///usr/local/hadoop/tmp</value>
    <decription>My temporary directories</decription>
  </property>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://Master:9000</value>
  </property>
</configuration>
  • hdfs-site.xml,修改内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <!-- 配置第二名称节点的地址 -->
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>Master:9890</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///usr/local/hadoop/tmp/dfs/name</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///usr/local/hadoop/tmp/dfs/data</value>
  </property>
</configuration>
  • mapred-site.xml,此文件在3.x中较2.x的修改幅度较大,在3.x版本中,yarnmapreduce等服务的环境参数不再相互继承,而是需要分开设置,即便他们其实还是同属一个环境。即HADOOP_MAPRED_HOME=HADOOP_HOME,其中HADOOP_HOME即你本机的hadoop目录。修改内容如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

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

  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>Master:10020</value>
  </property>

  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>Master:19888</value>
  </property>

  <property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
  </property>
  <property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
  </property>
  <property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
  </property>
</configuration>
  • yarn-site.xml,修改内容如下:
<?xml version="1.0"?>
<configuration>

<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>Master</value>
  </property>

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

在以上5个文件均配置完成之后,我们就可以将Master上的hadoop分发至各个Slave机器上。具体命令如下

  • 确保你处于hadoop目录的父目录中。
cd /usr/local
  • 删除日志以及临时文件
sudo rm -r hadoop/tmp
sudo rm -r hadoop/logs/*
  • 压缩hadoop
tar -zcf ~/hadoop.master.tar.gz hadoop
  • 使用scp分发至各个Slave机器上
scp ~/hadoop.master.tar.gz slave:~/Desktop

等待传输完成后,此时hadoop.master.tar.gz文件就会出现在Slave的桌面上。

此时在Slave机器上执行以下命令

  • 删除旧的hadoop
sudo rm -r /usr/local/hadoop
  • 解压hadoop.master.tar.gz
tar -zxf ~/Desktop/hadoop.master.tar.gz -C /usr/local

到此分布式模式所必需的启动配置均已配置完毕,之后只需要启动即可。

启动分布式Hadoop并运行例子

在Master机器上,首次启动hadoop先要执行NameNode的格式化,在命令行中键入:

hdfs namenode -format

之后键入以下命令即可启动hadoop,(依顺序执行)

start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver

此时分别在Master和Slave机器的命令行中键入jps即可看到如下图所示的服务进程状态:

Master

Master_jps

Slave

Slave_jps

到此分布式模式的hadoop已经运行正常运行了。

可以在浏览器端输入http://192.168.0.105:9870,其中地址域为Master的IP。选择顶部Datanodes标签即可查看所有的数据节点,如图所示

datanodes

现在我们可以运行一个示例块,在Master上(任意客户端机器都可以)按步骤执行以下命令:

  • 在HDFS上创建用户目录
hdfs dfs -mkdir -p /usr/hades
  • 在HDFS中创建一个input目录,并将/usr/local/hadoop/etc/hadoop目录的所有xml文件上传到HDFS的input文件中
hdfs dfs -mkdir input
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
  • 接着就可以运行以下MapReduce作业了
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar grep input output 'dfs[a-z]+'

等待任务完成,

run_task

在执行过程中可是在浏览器端输入http://192.168.0.105:8088/cluster查看任务进度。

任务完成后我们可以使用以下命令查看作业结果

hdfs dfs -cat output/*

结果如下图所示:

result

注:因为我所使用的是zsh,所以在*前面加入了一个转义字符,否则zsh无法识别。

如果需要关闭Hadoop集群,在Master节点上执行以下命令

stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver

到此Hadoop集群的分布式搭建就已经完成了!

最后祝大家身体健康、学业进步和工作顺利。



* 如果你对文章有任何意见或建议请发 邮件 给我!
* if you have any suggestion that you could send a E-mail to me, Please!