Hadoop主要有三个组建,HDFS,Yarn,MapReduce。HDFS是一个分布式存储管理想整个Hadoop提供存储服务,Yarn是Hadoop的资源管理和调度组件,MapReduce就是具体负责进行计算的部分了。通过VirtualBox创建多个虚拟机并安装Ubuntu Server 16.04LTS版本的操作系统来建立一个Hadoop Cluster。本机操作系统Ubuntu 18.04LTS,VirtualBox 5.2。

Hadoop最新版本是3.x[笔者写这篇blog时,Hadoop的最新版本是3.1.1],但是,因为Hadoop 2.x版本相对比较成熟,并且在工业界已经广泛使用,所以2.x也是一个主流版本[笔者写这篇blog时,Hadoop stable version是2.9.1]

Create VM & Install Ubuntu Server 16.04

通过VirtualBox建立4个虚拟机,其中一个是hadoop-master,另外4个是hadoop-slave1-3。具体VM配置基本上都是默认配置,Memory是2GB,硬盘10GB[建议稍微大一点,比如15G或者20G]。

通过虚拟磁盘安装ubuntu server 16.04.5,具体步骤很简单,只要按照默认选项来就可以了。其中有几点需要注意:不进行磁盘加密,磁盘分区为400MB的/boot空间,1GB的swap space, 剩下的所有磁盘空间均为/

VirtualBox Network Configuration

进行网络配置,使4台虚拟机可以进行相互联通。VirtualBox支持多种连接方式,这里介绍两种连接方式[internal network]和[host-only network]。internal network就是多台虚拟机构建一个内网,其他机器无法访问该内网。host-only network就是通过host连接构建的网络。如果使用internal network,是无法从host主机进行Web页面访问Hadoop的,因为host机器也无法和internal network交互,但是使用host-only network则可以做到。

所有的虚拟机第一个adapter默认是NAT,第二个adapter选择host-only network。

Host-only Network

首先在virtualbox中,打开Host Network Manager,创建一个新的host-only network,并且enable DHCP Server。

根据默认设置,host ipv4就是192.168.56.1,DHCP Server的默认网段是192.168.56,Server Address:192.168.56.2,Lower Bound:192.168.56.3,Upper Bound:192.168.56.254。所以只要配置虚拟机ip在这个网段内就可以。

然后每台虚拟机的host-only network adapter,都选择attach to这个network。

编辑虚拟机/etc/network/interfaces,添加新的网卡信息

auto enp0s8
iface enp0s8 inet static
address 192.168.56.XXX[范围3-254]
netmask 255.255.255.0 

通过命令sudo /etc/init.d/networking restart使网络地址生效。

最后用ping命令来测试机器之间的连接。比如host机连接虚拟机使用ping 192.168.56.100,虚拟机连接host使用ping 192.168.56.1

SSH for Master/Slaves

为了避免从master到slave每次都要输入密码,可以通过ssh登录

ssh-keygen -t rsa [在master机器上,通过rsa方法生成公私钥]
ssh-copy-id ip/hostname [输入对应的slave机器的ip和hostname]

Install Hadoop

直接下载hadoop的二进制包就可以进行安装,当然也可以先用源代码编译成二进制文件。

其实安装hadoop,只需要安装Java。然后将二进制包解压文件之后将hadoop文件夹移动到/usr/local/

Setup HDFS Cluster

首先建议修改所有机器的\etc\hosts文件,添加所有机器的hostname和ip地址,比如添加,

hadoop-master 192.168.56.100
hadoop-slave1 192.168.56.101
hadoop-slave2 192.168.56.102
hadoop-slave3 192.168.56.103

后面需要配置文件,如果需要查看具体每个配置文件中所有支持的属性可以打开hadoop文件夹下share/doc/hadoop-project/index.html,里面有具体的介绍

Configure core-site.xml

编辑/usr/local/hadoop/etc/hadoop/core-site.xml添加下面配置

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://<对应master机器的ip地址>:9000</value>
    </property> 
</configuration>         

这样所有的机器就都知道哪台机器是中心节点,端口9000是默认端口,确保之前没有被占用过。将所有的机器的core-site.xml编辑完成后,在master机器启动hadoop namenode,在slave机器启动datanode。

hadoop-daemon.sh start namenode [master机器namenode启动命令]
hadoop-daemon.sh start datanode [slave机器datanode启动命令]

可以使用命令来查看整个集群的情况,如果没有发现live datanode那就是节点之间通讯出现了问题。

hdfs dfsadmin -report [-live/-dead]

Configure hdfs-site.xml

编辑/usr/local/hadoop/etc/hadoop/hdfs-site.xml添加下面配置

<configuration>
<property>
 <name>dfs.namenode.name.dir</name>
 <value>file:/home/hduser/mydata/hdfs/namenode</value>
</property>

<property>
 <name>dfs.datanode.data.dir</name>
 <value>file:/home/hduser/mydata/hdfs/datanode</value>
</property>

<property>
 <name>dfs.replication</name>
 <value>2</value>
</property>

</configuration>

前两个设置了datanode和namenode的dir,不然的话,hadoop会默认放到/tmp/文件夹下,由于/tmp/文件夹的内容经常会清空,会影响namenode启动。

dfs.replication指定了数据在hdfs备份的个数。hadoop系统会尝试保证整个系统所有文件备份的备份数到达设定值,比如一个block有两个备份在两台机器上,其中一台挂了,那么hadoop会自动再备份这个block到其他机器从而保证可用备份数是2,当然如果之前挂的机器回复,hadoop也不会删除这台机器原来存的那个备份

Configure yarn-site.xml

<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>master机器的ip地址[如果机器添加了master的hostname也可以写hostname]</value>
</property>
 
<property>  
    <name>yarn.nodemanager.aux-services</name>  
    <value>mapreduce_shuffle</value>  
</property> 

<property>  
    <name>yarn.nodemanager.webapp.address</name>  
    <value>[对应运行nodemanager的机器hostname]:8042</value>  
</property> 

通过下面命令测试yarn集群连接,

yarn-daemon.sh start resourcemanager [master机器启动]
yarn-daemon.sh start nodemanager [slave机器启动]

Configure mapred-site.xml

在2.x版本中,配置namenode节点的mapred-site.xml添加下面配置文件,让yarn和mapreduce互相知道。告诉mapreduce你的计算任务是基于yarn的调度分配。

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

在3.x版本中还需要配置如下内容

<property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

Control Hadoop Cluster

在2.x中,可以在master机器中配置/usr/local/hadoop/etc/hadoop/slaves,添加所有slave机器的hostname[当然前提还是在/etc/hosts添加了对应的ip地址],这样可以在master机器上使用start-dfs.shstart-yarn.shstart-all.sh和对应的stop命令来操作整个hadoop集群。

在3.x中,可以在master机器中配置/usr/local/hadoop/etc/hadoop/workers,添加所有worker机器的hostname[当然前提还是在/etc/hosts添加了对应的ip地址],然后可以同样可以使用start-dfs.shstart-yarn.shstart-all.sh和对应的stop命令来操作整个hadoop集群。

Web access

可以通过host ip:8088host ip:50070分别进行hdfs和yarn的web访问。