Setup a Hadoop 2.x/3.x Distributed Cluster via VirtualBox on Ubuntu [搭建基于VirtualBox的Hadoop分布式集群]
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.sh
,start-yarn.sh
,start-all.sh
和对应的stop命令来操作整个hadoop集群。
在3.x中,可以在master机器中配置/usr/local/hadoop/etc/hadoop/workers
,添加所有worker机器的hostname[当然前提还是在/etc/hosts添加了对应的ip地址],然后可以同样可以使用start-dfs.sh
,start-yarn.sh
,start-all.sh
和对应的stop命令来操作整个hadoop集群。
Web access
可以通过host ip:8088
和host ip:50070
分别进行hdfs和yarn的web访问。