前言
本文只介绍hadoop集群环境的搭建,hadoop单机配置和hadoop伪分布配置将在hadoop安装教程中介绍
环境
本教程使用ubuntu16.04作为操作系统
hadoop版本为hadoop-2.8.2(可自行下载其他版本)
因本人电脑配置原因,暂选2个节点作为集群环境
节点名称 | 操作系统 | ip |
---|---|---|
master | ubuntu | 192.168.78.139 |
salve | uhuntu | 192.168.78.140 |
网络配置
我使用的是虚拟机安装的系统,两台主机的网络均为NAT模式
master主机地址为:
slave主机地址为:
主机名配置
为了便于区分需要修改各个节点的主机名,及主机名与ip地址之间的映射关系
在ubuntu中,我们可以通过“hostname 主机名”的方法临时修改主机名,也可以通过修改/etc/hostname文件的方法永久修改主机名,这里采用永久方法
vim /etc/hostname
分别将主机名设置为master和slave,可通过“hostname”命令验证
centos系统,则是修改/etc/sysconfig/network 文件,改为 HOSTNAME=master
接下来设置ip和主机之间的映射关系
vim /etc/hosts
该动作需要在两个节点上都完成
修改完成后需要重启,才能看到主机名的变化
配置好后,可通过ping命令测试是都通,使用ctrl+C结束ping动作,也可使用“ping 主机名 -c 次数”限定ping包的次数
至此所有节点的网络配置已完成
ssh无密钥登录
目的是让master可以无密钥登录到所有节点上,在master节点上执行
ssh-keygen -t rsa #生成密钥对
#将公钥传输到所有节点上
scp /root/.ssh/id_rsa.pub root@master:/root/.ssh/authorized_keys
scp /root/.ssh/id_rsa.pub root@slave:/root/.ssh/authorized_keys
传输完成后,可执行如下命令,进行验证,如果还需要输入yes,则说明不成功,如成功进入后,记得执行exit命令退出
ssh master
ssh slave
增加用户
分别在master和slave节点上增加hadoop用户
useradd -m hadoop -s /bin/bash
passwd hadoop
可为 hadoop 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题
adduser hadoop sudo
配置java环境
注:master和slave环境都需使用下面的方法配置java环境
为图方便,直接使用命令安装,
apt-get install openjdk-8-jre openjdk-8-jdk
该命令会输出一个路径,除去路径末尾的 “/bin/javac”,剩下的就是正确的路径了。如输出路径为 /usr/lib/jvm/java-8-openjdk-amd64/bin/javac,则我们需要的路径为 /usr/lib/jvm/java-8-openjdk-amd64。
配置JAVA_HOME
vim /etc/profile
在文件的最下方添加
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
接着让该环境变量生效,执行如下代码
source /etc/profile
检查设置是否正确
echo $JAVA_HOME
java -version
结果如下图所示
这样hadoop运行所需的java环境就配置完了
安装Hadoop
master节点上hadoop的安装
下载Hadoop
可以通过https://mirrors.cnnic.cn/apache/hadoop/common/下载,选择稳定版“stable” 下的 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的,另一个带有 src 的是 Hadoop 源代码,需要编译才可使用。
wget https://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.8.2.tar.gz
安装Hadoop
我选择将其安装在/usr/local
tar -xvf hadoop-2.8.2.tar.gz -C /usr/local
cd /usr/local
mv ./hadoop-2.8.2 ./hadoop
chown -R hadoop.hadoop ./hadoop
只需解压就可完成安装,检查hadoop是否可用
/usr/local/hadoop/bin/hadoop version
配置Hadoop
注意:以下命令均以/usr/local/hadoop为当前路径
core-site.xml文件
vim etc/hadoop/core-site.xml
添加如下内容:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
hdfs-site.xml文件
vim etc/hadoop/hdfs-site.xml
添加如下内容:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>#只有一个datanode节点,所以dfs.replication的值为1
</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文件
需要将etc/hadoop/mapred-site.xml.template先重命名为etc/hadoop/mapred-site.xml
mv etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
vim etc/hadoop/mapred-site.xml
然后,添加如下内容:
<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>
</configuration>
yarn-site.xml文件
vim etc/hadoop/yarn-site.xml
添加如下内容:
<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>
slaves文件
vim etc/hadoop/slaves
slaves文件里面记录的是集群里所有DataNode的主机名,因让master节点仅作为namenode使用,因此需将原来的额localhost删掉,写入slave即可
如果,master节点上之前跑过伪分布模式,需要删除之前的临时文件
rm -rf /usr/local/hadoop/tmp
rm -r /usr/local/hadoop/logs/*
slave节点上hadoop的安装
master节点配置好后,slave节点上的安装比较简单,直接上master上的/usr/local/hadoop目录拷贝到slave节点上即可
rm -rf /usr/loca/hadoop #如果之前有的话,需要删除旧的hadoop目录
scp -r /usr/local/hadoop root@slave:/usr/local
chown -R hadoop.hadoop /usr/local/hadoop
可能需要一段时间,为了节省时间可以打包后再传输
格式化namenode节点
为了在master节点的任意目录中可以使用hdfs、hadoop等命令,需在/etc/profile文件中加入一行:
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
使其生效
source /etc/profile
接下来格式化namenode
hdfs namenode -format
启动hadoop
启动需在master节点上完成
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver#启动历史服务器
启动historyserver后,我们就可以在相应机器的19888端口上打开历史服务器的WEB UI界面,可以直接查看已经运行完的作业情况
也可以使用start-all.sh替代start-dfs.sh和start-yarn.sh
启动完成后可通过jps命令查看各节点所启动的进程
jps
在master节点上可以看到如下进程
在slave节点上可以看到如下进程
缺少任意一个进程,都表示出错,另外还可以在master节点上查看datanode是否正常启动,其中,live datenode的值非0,说明启动成功。
还可以通过web页面查看
本文使用的win10主机进行浏览器访问测试,为了更好的识别master和slave,需要在win10主机的hosts文件(路径为:C:\Windows\System32\drivers\etc\hosts)中添加master和slave的信息
关闭hadoop
若需要关闭hadoop集群,也是在master主机上执行
stop-dfs.sh
stop-yarn.sh
mr-jobhistory-daemon.sh stop historyserver
同理,也可使用stop-all.sh代替stop-dfs.sh和stop-yarn.sh
本文后面还要使用hadoop集群,所以先不关闭
到此,hadoop的集群已经搭建完毕了,下面我们来运行一个实例
分布式实例
master节点上完成
hdfs dfs -mkdir -p /user/root
hdfs dfs -mkdir -p input
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
可以通过web查看datanode的状态
接下来就可以执行MapReduce 作业了
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
在输出信息中可以看到具体的进度
也可通过web页面http://master:8088/cluster查看执行进度
查看输出结果
hdfs dfs -cat output/*
将运行结果取回本地
hdfs dfs -get output ./output
cat ./output/*
注意“Hadoop 运行程序时,输出目录不能存在,否则会提示错误”