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