一、前言
hadoop 在分布式计算,大数据领域一直享有盛名,也零零碎碎看过一些 hadoop 相关的东西,但却没有真正实战过,一是工作还暂时未涉及到 hadoop ,二是安装 hadoop 集群没有那个硬件基础。
现在换了一个内存大点的电脑,不能浪费这个资源,于是便来搭个 hadoop 集群吧。
二、hadoop 集群环境
这里准备3个虚拟机节点。
我是用 VMware10 虚拟了一个 Ubuntu16.04 环境,然后再克隆两个 Ubuntu16.04 节点环境。
因为是在同一台机器上搭建 hadoop 集群,所以虚拟机网络设置是NAT模式。(Vmware虚拟机三种网络模式详解
三个节点准备好,通过 ifconfig 命令查看 ip , 三个节点的 ip 分别为:
192.168.184.131
192.168.184.133
192.168.184.134
这里打算 131 当作 master 节点,用于运行hadoop程序中的namenode、secondorynamenode和jobtracker任务。 133 和 134 当作 slave 节点,主要将运行hadoop程序中的datanode和tasktracker任务。
在准备好这3个结点之后,分别将主机名重命名,命名主机名的方法,修改 /etc/hostname 文件:
gedit /etc/hostname
我这里对三个节点分别命名为:master, slave1, slave2。
![](/qrcode.jpg)
三、搭建过程记录
在做好上述准备后,正式开始。
3.1、创建 hadoop 账户
首先创建 hadoop 账户,并配置管理员权限。
安装 Hadoop 那么需要创建一个 Hadoop 用户,毕竟创建一个新的用户,配置环境相对更加干净一些。
创建一个hadoop 用户,并使用 /bin/bash作为shell:
sudo useradd -m hadoop -s /bin/bash
设置密码:
sudo passwd hadoop
增加管理员权限:
sudo adduser hadoop sudo
三个节点都执行相同操作。
3.2、配置hosts文件
配置 hosts 文件主要用于确定每个结点的 IP 地址,方便后续 master 结点能快速查到并访问各个结点。
三个节点都需要修改,内容一致,如下:
sudo gedit /etc/hosts
3.3、配置ssh免密码连入
1.Hadoop 中的集群,单点模式是需要使用到SSH登录,Ubuntu默认参数了 SSH client, 还需要安装SSH Server:
sudo apt-get update
sudo apt-get install openssh-server
2.安装之后就可以使用 SSH 登录本机,生成 master 的公钥,在 master 节点终端运行:
ssh localhost # 使用此命令登录一次 (会输入一次 yes),用于生成 ~/.ssh 目录
cd ~/.ssh
ssh-keygen -t rsa # 执行此命令后一直按回车即可,会在 ~/.ssh 下生成 id_rsa 私钥文件 和 id_rsa.pub 公钥文件。
3.在 master 节点配置无密码 ssh 本机,这一步还是在 master 节点上运行:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 加入授权
4.完成此命令后,运行 ssh 验证一下
ssh localhost
此时不需密码验证。
5.让主结点(master)能通过SSH免密码登录两个子结点(slave)
前四步可以让 master ssh 本机无密码登录,还需让 master ssh 免密登录两个 slave 节点,为了实现这个功能,两个slave结点的公钥文件中必须要包含主结点的公钥信息。
切换到 slave1 节点,拷贝 master 节点公钥信息:
scp hadoop@master:~/.ssh/id_rsa.pub ./master_isa.pub
接着在 slave1 节点上将 master 的 ssh 公匙保存到相应位置:
cat ~/.ssh/master_isa.pub >> ~/.ssh/authorized_keys
然后 切回到 master 节点:
ssh slave1
首次需要 yes 确认。
6.然后 slave2 执行同样的操作。
3.4、配置 JDK
三个节点都要安装 JDK,也可以将这步挪到前面,先装好一个节点的 JDK,然后克隆其他的节点。
具体安装参考:https://www.zybuluo.com/w1992wishes/note/1207973
安装好后,并配置相应的环境变量。
3.5、安装 hadoop
1.首先下载 hadoop 相应版本,可以到如下路径查找 hadoop 各版本:
https://archive.apache.org/dist/hadoop/common/
将下载的压缩包解压:
sudo tar -zxvf /opt/hadoop-2.7.4.tar.gz
mv hadoop-2.7.4 hadoop # 改名
2.添加 Hadoop 环境变量:
sudo gedit /etc/profile
保存后使配置生效:
source /etc/profile
hadoop # 查看Hadoop
hadoop version # 查看 hadoop 的安装版本
3.6、配置 hadoop 相关文件:
操作之前关闭每台机器的防火墙 sudo ufw disable。
1.编辑 hadoop-env.sh,配置 hadoop JDK 依赖:
gedit hadoop-env.sh
2.配置 slaves:
gedit slaves
保存所有的 slave 节点 (slave1、slave2),将文件首行的 localhost 删除。
3.配置 core-site.xml:
core-site.xml 配置集群的全局参数,主要定义了系统级别的参数,如 :HDFS URL、Hadoop 的临时目录等信息。
gedit core-site.xml
在 <configuration> </configuration>
标签里面添加如下内容:
<property>
<!-- 指定 HDFS 的 nameService,与(hdfs-site.xml)对应 -->
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<!-- 指定 hadoop 运行时产生文件的存储路径 -->
<name>hadoop.tmp.dir</name>
<value>file:/opt/hadoop/hadoop_tmp</value>
<description>Abase for other temporary directories.</description>
</property>
4.配置 hdfs-site.xml:
gedit hdfs-site.xml
在 <configuration> </configuration>
标签里面添加如下内容:
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<!-- 文件的副本数,默认为 3;这里只有两台 DataNode 所以这里设置为 2 -->
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<!-- NameNode 数据目录 -->
<name>dfs.namenode.name.dir</name>
<value>file:/opt/hadoop/hadoop_tmp/dfs/name</value>
</property>
<property>
<!-- DataNode 数据目录 -->
<name>dfs.datanode.data.dir</name>
<value>file:/opt/hadoop/hadoop_tmp/dfs/data</value>
</property>
这之后创建 name 和 data 目录:
cd /opt/hadoop
mkdir -p hadoop_tmp/dfs/name # -p 代表递归创建目录
cd hadoop_tmp/dfs/
mkdir data
5.配置 yarn-site.xml:
gedit yarn-site.xml
在 <configuration> </configuration>
标签里面添加如下内容:
<property>
<!-- 指定 YARN 的 ResourceManager 的地址,NameNode 节点中的一个 -->
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<!-- reducer 取数据的方式是 mapreduce_shuffle -->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
6.配置 mapred-site.xml:
默认文件名为 mapred-site.xml.template,配置这个文件前,需要将这个文件重命名:
mv mapred-site.xml.template mapred-site.xml
gedit mapred-site.xml
<property>
<!-- 通知框架 MR 使用 YARN -->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:19888</value>
</property>
3.7、Hadoop 集群
将 Hadoop 分发,在 master 机器配置完成以后, 将 /opt/hadoop 文件夹复制到各个节点上:
先在 master 节点压缩:
cd /opt/hadoop
sudo tar czvf hadoop.master.tar.gz hadoop/
然后切到 slave 节点:
scp hadoop@master:/opt/hadoop.master.tar.gz /opt
sudo tar xzvf hadoop.master.tar.gz
解压后配置 hadoop 环境变量,然后 hadoop version 验证一下。
至此,如果集群已经安装完毕。
四、运行 Hadoop 集群
1.首次启动需要先在 master 节点执行 namenode 的格式化:
cd /opt/hadoop/bin
hdfs namenode -format # 格式化文件系统
2.当格式化通过之后,就可以启动 hadoop 了,启动必须在 master 节点上运行:
start-dfs.sh
通过 jps 查看,master 节点至少有三个进程, slave1 和 slave2 至少有 2 个:
通过 web 界面查看是否配置成功,在浏览器中输入http://192.168.184.131:50070:
3.启动 strat-yarn.sh:
start-yarn.sh
通过 hdfs dfsadmin -report 命令,查看集群是否正常启动:
hdfs dfsadmin -report
4.可选启动命令 mr-jobhistory-daemon.sh start historyserver:
这个脚本的服务是实现 web 查看作业的历史运行情况,有些情况下,作业运行完了,在 web 端就无法查看运行情况,可以通过开启这个的守护进程来达到查看历史任务。
5.关闭集群:
# 关闭集群的操作必须在 hadoop20 执行
stop-yarn.sh
stop-dfs.sh # 单独启动 HDFS 集群
start-mapred.sh # 单独启动 Map/Reduce
start-all.sh # 同时启动HDFS和Map/Reduce
mr-jobhistory-daemon.sh stop historyserver
# 从主节点 master 关闭 hadoop,主节点会关闭所有从节点的 NameNode 进程
stop-all.sh
五、附:HDFS 常用操作
hadoop fs -ls
# 列出HDFS下的文件
hadoop fs -mkdir /input
# 在 HDFS / 目录下创建 input 文件夹
hadoop fs -ls /input
# 列出 HDFS 下某个文档中的文件
hadoop fs -put test1.txt /input/test
# 上传文件到指定 HDFS /input 目录下并重新命名,只有所有的 DataNode 都接收完数据才算成功
hadoop fs -get /in getin
# 从 HDFS 获取文件并且重新命名为 getin,同 put 一样可操作文件也可操作目录
hadoop fs -rmr /output
# 从 HDFS 上删除指定文件
hadoop fs -cat /input/*
# 查看 HDFS 上 input 目录的内容
hdfs dfsadmin -report
# 查看 HDFS 的基本统计信息
hdfs dfsadmin -safemode enter # 进入安全模式
hdfs dfsadmin -safemode leave # 退出安全模式