Setup a Hadoop Standalone via VirtualBox on Ubuntu [搭建基于VirtualBox的Hadoop伪分布式集群]
Hadoop的伪分布式集群也就是单机模式,主要是针对hadoop进行开发测试。较之分布式集群方式,搭建方式比较简单。这里为了研究hdfs,yarn的源代码以及修改代码后部署,所以通过虚拟机建立伪分布模式,并使用hadoop源码编译安装。
首先创建一个名为hadoop-alone
的虚拟机,和之前的分布式虚拟机一样,配置都是默认配置,Memory是2GB,硬盘10GB。通过虚拟磁盘安装ubuntu server 16.04,具体步骤很简单,只要按照默认选项来就可以了。其中有几点需要注意:不进行磁盘加密,磁盘分区为400MB的/boot空间,1GB的swap space, 剩下的所有磁盘空间均为/。
VirtualBox Network Configuration
只有一台虚拟机,进行网络配置比较简单。第一个adapter默认是NAT,第二个adapter选择host-only network。默认网段是192.168.56.3-254
,这里采取192.168.56.151
。
编辑虚拟机/etc/network/interfaces,添加新的网卡信息
auto enp0s8
iface enp0s8 inet static
address 192.168.56.151
netmask 255.255.255.0
最后用ping命令来测试机器之间的连接。
Install Hadoop from Source
Prequisite:Java
通过下面的命令安装Java 8, 安装之后通过java -version
命令检查是否正确安装,应该是java 8
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
然后link tools.jar到另外一个位置,首先tools.jar应该在如下位置${java.home}/../lib/tools.jar
,然后通过下面命令建立一个link
ln -s /usr/lib/jvm/java-8-oracle/lib/tools.jar /usr/lib/tools.jar
ls -ltr /usr/lib/tools.jar
同时修改环境变量,加入JAVA
Prequisite:Maven
通过下面命令安装Maven
sudo apt install maven
同时修改环境变量,加入MAVEN
通过下面命令检查maven的安装情况mvn --version
,应该是Apache Maven 3.3.9
Prequisite:Protocol Buffers
下载protobuf-2.5.0.tar.gz,解压编译安装[需要gcc和g++]。
./configure
make
make install
sudo ldconfig
之后输入命令protoc --version
,显示为libprotoc 2.5.0
Prequisite:Others
安装其他依赖库
sudo apt-get install autoconf libtool zlib1g-dev pkg-config libssl-dev
Build from Source Code
cd hadoop-2.9.1-src
mvn clean install -DskipTests
mvn clean package -Pdist -DskipTests -Dtar
编译成功,生成的jar包会放在hadoop-2.9.1-src/hadoop-dist/target/hadoop-2.9.1.tar.gz。另外每个模块也会有对于的生成的jar包。
之后解压,将hadoop文件夹移动到/usr/local/
并且修改/etc/hadoop/hadoop-env.sh
,添加JAVA和Hadoop的环境变量
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
之后使用source hadoop-env.sh
使修改生效。同时也可以把这些环境变量写入~/.bashrc
文件。
可以通过hadoop自带的wordcount来验证hadoop,随便找一个输入文件作为input
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.1.jar wordcount /usr/local/hadoop/input/test.txt /usr/local/hadoop/output
输入结果存在output文件夹下
Configuration
首先编辑hadoop的core-site.xml这样集群中的机器就知道中心机器是哪台。编辑/usr/local/hadoop/etc/hadoop/core-site.xml添加如下代码
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://<对应master机器的ip地址>:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/<自定义路径>/tmp</value>
</property>
</configuration>
然后修改/usr/local/hadoop/etc/hadoop/hdfs-site.xml文件。
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
一个可能的问题是datanode denied communication with namenode because hostname cannot be resolved。修复方法是修改/usr/local/hadoop/etc/hadoop/hdfs-site.xml,添加
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
另一个问题是需要设置datanode和namenode的dir,不然的话,hadoop会默认放到/tmp/文件夹下,由于/tmp/文件夹的内容经常会清空,会影响namenode启动。所以需要修改hdfs-site.xml
,添加如下代码,指定datanode和namenode位置
<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>
</configuration>
然后配置namenode节点的mapred-site.xml
添加下面配置文件,让yarn和mapreduce互相知道。告诉mapreduce你的计算任务是基于yarn的调度分配。
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
然后配置每台机器的yarn-site.xml
的配置信息,这样每台机器就知道resourcemanager
节点的IP是192.168.56.100。
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-alone</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
通过hdfs namenode -format
格式化namenode
最后通过下列命名可以逐一启动服务
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh start secondarynamenode
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
或者通过下列命令一次性启动
sbin/start-dfs.sh
sbin/start-yarn.sh
Test
运行mapreduce wordcount例子程序作为测试。
先创建hdfs文件夹并上传数据,
hdfs dfs -mkdir -p /wordcounttest/input
hdfs dfs -put data/<test-data> /wordcounttest/input
然后运行mapreduce job
yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.1.jar wordcount /wordcounttest/input /wordcounttest/output
查看运行结果
hdfs dfs -ls /wordcounttest/output
hdfs dfs -cat /wordcounttest/output/part-r-00000
output目录中有两个文件,_SUCCESS文件是空文件,有这个文件说明Job执行成功。
part-r-00000文件是结果文件,其中-r-说明这个文件是Reduce阶段产生的结果。
停止服务
# 停止namenode
hadoop-daemon.sh stop namenode
# 停止datanode
hadoop-daemon.sh stop datanode
# 停止resourcemanager
yarn-daemon.sh stop resourcemanager
# 停止nodemanager
yarn-daemon.sh stop nodemanager
# 停止dfs服务
sbin/stop-dfs.sh
# 停止yarn服务
sbin/stop-yarn.sh
# 停止所有服务
sbin/stop-all.sh