前言
运行环境 : VirtualBox 虚拟机
系统配置 : 三台 Ubuntu 14.04.5 (用于配置一台 NameNode,俩台 DataNode)
前置条件 : 将 JDK 和 Hadoop 安装文件复制到 /tools 下面
切换 root 用户
开机前请确认三台机器的 网络配置 如下图
修改三台机器的主机名
apt-get install vim # 首先安装vim
vim /etc/hostname
# 第一台机器为 namenode节点 改为 hadoop20
# 第二台第三台机器为 datanode 节点
# 第二台改名为 hadoop21 , 第三台改名为 hadoop2
设置三台机器的静态 ip 地址
# 配置 hadoop20
ifconfig eth0 192.168.1.110
# 配置 hadoop21
ifconfig eth0 192.168.1.111
# 配置 hadoop22
ifconfig eth0 192.168.1.112
其余两台配置如图
三台机器修改完成之后输入 reboot 命令进行重启,重启后进入终端观察三台机器的机器名是否改变
若发现未改变,请检查 /etc/hostname 文件内容
发现三台机器名已经改变,输入 ping 命令测试是否 ping 通
如果发现无法 ping 通,使再次用 ifconfig eth0 [新的局域网 ip 地址] 命令从新设置一下三台机器的 ip 地址
从新设置后测试还是无法 ping 通,请再次重启设置新的 ip 网段,设置新的网段后请修改 /etc/hosts 文件下面的节点映射,保持 ip 地址和 机器名 一致
# ping 命令如下
# hadoop20 机器输入如下两行命令
ping hadoop21 -c 2
ping hadoop22 -c 2
# hadoop21 机器输入如下两行命令
ping hadoop20 -c 2
ping hadoop22 -c 2
# hadoop22 机器输入如下两行命令
ping hadoop20 -c 2
ping hadoop21 -c 2
- 若可以 ping 通会显示每次 ping 通的 time , 如图
- 如出现如下提示,则代表没有 ping 通
配置 JDK
三台机器上都要配置 JDK 环境
-
解压改名
cd /tools # 进入 tools 目录
tar -zxvf jdk-8u144-linux-x64.tar.gz -C /usr/local # 解压 JDK 到 /usr/local 目录下
cd /usr/local
ls
mv jdk1.8.0_144 jdk
-
添加 JDK 环境变量
vim /etc/profile +30 [gedit /etc/profile]
# 在文档最后添加
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin:
export CLASS_PATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
:wq! # 退出
source /etc/profile # 立即生效环境变量
# 接下来测试是否配置成功
java
javac
配置 SSH 免密码登录
-
安装 ssh
apt-get install openssh-server # 如果出错请安装 openssh-client
# 安装完毕以后 启动 ssh 服务
/etc/init.d/ssh start
ps -e | grep sshd # 查看 ssh 进程
-
在 Ubuntu 中不允许 root 登录,这里修改为允许 root 账户登录
vim /etc/ssh/sshd_config +28
# 随后找到 PermitRootLogin
# 将 PermitRootLogin 内容修改为 yes 即可
:wq! 保存退出
-
生成 hadoop20 的公钥,在 hadoop20 节点终端运行
ssh localhost # 使用此命令登录一次 (会输入一次 yes, 三次 root 密码),用于生成 ~/.ssh 目录
cd ~/.ssh
ssh-keygen -t rsa # 执行此命令后一直按回车即可,生成的密钥保存为 .ssh/id_rsa
# 执行成功后会在 ~/.ssh 下生成 id_rsa 私钥文件 和 id_rsa.pub 公钥文件。
-
在 hadoop20 节点配置无密码 ssh 本机,这一步还是在 hadoop20 节点上运行
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 加入授权
# 完成此命令后,运行 ssh 验证一下
ssh hadoop20
如果出现 ssh: connect to host hadoop21 port 22: No route to host 错误
请检查 /etc/hosts 文件,将所有的 127 ip段的注释放开,因为前面已经 127.0.1.1 删除,所有不会出现这个错误
-
设定用户权限
因为笔者的 hadoop20, hadoop21, hadoop22 主机的用户名都是 hadoop2. 所以要给它添加权限让其具有访问其他文件的权力,以便后续使用
sudo gedit /etc/sudoers
# 打开 sudoers 文件后,在 root权限那行 后面添加:hadoop2 ALL=(ALL:ALL) ALL
-
hadoop20 本机验证 ssh 无问题后将公钥传输到 hadoop21 节点和 hadoop22 节点上
scp ~/.ssh/id_rsa.pub hadoop2@hadoop21:/home/hadoop2/
# 因有时会出现 root 用户权限不够,这里采用 hadoop2 用户
# scp 有时会要求输入 hadoop21 机器上 hadoop2 用户的密码,输入完成后会提示传输完毕。
# 接下来切换到 hadoop21 本机上
-
将 hadoop21 的目录切换到 root 用户的根目录下
cd ~
mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略本行命令
cp /home/hadoop2/id_rsa.pub ~/.ssh/auhorized_keys # 将 hadoop20 主机的公钥拷贝当前目录下
-
接着在 hadoop21 节点上将 hadoop20 的 ssh 公匙保存到相应位置
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
-
切换回 hadoop20 主机,使用如下命令登录
ssh hadoop21 # 执行结果如下图
hadoop22 主机配置和 hadoop21 一致
安装 Hadoop
hadoop 环境只需要在
hadoop20 节点上配置即可,配置完成后通过 SCP 命名分发到每个 DataNode 节点上
-
解压改名
cd /usr/local
tar -zxvf /tools/hadoop-2.7.1.tar.gz -C . # . 代表当前目录
ls
mv hadoop-2.7.1 hadoop # 改名
cd /hadoop
ls # 查看是否有 /bin /sbin 目录
-
添加 Hadoop 环境变量
vim /etc/profile [gedit /etc/profile]
# 在 JAVA_HOME 后面增加一行 Hadoop 的配置
export HADOOP_HOME=/usr/local/hadoop
# 接下来修改 PATH 属性
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
:wq! # 保存退出
source /etc/profile # 让配置立即生效
hadoop # 查看Hadoop
hadoop version # 查看 hadoop 的安装版本
-
配置 JDK 依赖
cd /usr/local/hadoop/etc/hadoop
ll # 列出详细信息
# 此时要找到一个为“hadoop-env.sh”的文件 (一般在第 8 行)
vim hadoop-ebv.sh +25
# 将第25 行的 改为如下内容
export JAVA_HOME=/usr/local/jdk
:wq # 保存退出
到了这里请使用虚拟机备份一下
配置 Hadoop 相关文件
首先要记录下本机 ( hadoop20 节点 ) 的 java 安装目录 /usr/local/jdk
操作之前一定要关闭每台机器的防火墙 sudo ufw disable
编辑 hadoop-env.sh
由于 Hadoop 是基于 Java 编写的,所以需要在 hadoop-env.sh 里设置 JDK 路径。
首先进入 /usr/local/hadoop/etc/hadoop 目录
打开 hadoop-env.sh 文件
找到 JAVA_HOME 变量,将其修改为
export JAVA_HOME=/usr/local/jdk
cd /usr/local/hadoop/etc/hadoop
vim hadoop-env.sh +25
# 修改完成后 :wq 保存退出
配置 slaves
vim slaves
保存所有的 slave 节点 (hadoop21、hadoop22),此文件首行的 localhost 一定要删除
配置 core-site.xml
core-site.xml 配置集群的全局参数,主要定义了系统级别的参数,如 :HDFS URL、Hadoop 的临时目录等信息。
vim core-site.xml
<!-- 在 <configuration> </configuration> 标签里面添加如下 内容-->
<property>
<!-- 指定 HDFS 的 nameService,与(hdfs-site.xml)对应 -->
<name>fs.defaultFS</name>
<value>hdfs://hadoop20:9000</value>
</property>
<property>
<!-- 指定 hadoop 运行时产生文件的存储路径 -->
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/hadoop_tmp</value>
<description>Abase for other temporary directories.</description>
</property>
配置 hdfs-site.xml
vim hdfs-site.xml
<!-- 在 <configuration> </configuration> 标签里面添加如下 内容-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop20: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:/usr/local/hadoop/hadoop_tmp/dfs/name</value>
</property>
<property>
<!-- DataNode 数据目录 -->
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/hadoop_tmp/dfs/data</value>
</property>
创建 name 和 data 目录
cd /usr/local/hadoop
mkdir -p hadoop_tmp/dfs/name # -p 代表递归创建目录
cd hadoop_tmp/dfs/
mkdir data
cd /usr/local/hadoop/etc/hadoop # 返回上一次的工作目录
配置 yarn-site.xml
vim yarn-site.xml
<!-- 在 <configuration> </configuration> 标签里面添加如下 内容-->
<property>
<!-- 指定 YARN 的 ResourceManager 的地址,NameNode 节点中的一个 -->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop20</value>
</property>
<property>
<!-- reducer 取数据的方式是 mapreduce_shuffle -->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop20:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop20:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop20:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop20:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop20:8088</value>
</property>
配置 mapred-site.xml
默认文件名为 mapred-site.xml.template
配置这个文件前,需要将这个文件重命名
mv mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<!-- 在 <configuration> </configuration> 标签里面添加如下 内容-->
<property>
<!-- 通知框架 MR 使用 YARN -->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop20:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop20:19888</value>
</property>
将 Hadoop 分发
-
在 hadoop20 机器配置完成以后, 将 /usr/local/hadoop 文件夹复制到各个节点上
# 在 hadoop20 节点上执行 :
tar -zcf ~/hadoop.master.tar.gz /usr/local/hadoop # 可以先压缩再复制给其他节点
scp ~/hadoop.master.tar.gz hadoop2@hadoop21:/home/hadoop2/ # 复制到 hadoop21 节点上
scp ~/hadoop.master.tar.gz hadoop2@hadoop22:/home/hadoop2/ # 复制到 hadoop22 节点上
# 如果未压缩请使用下面的命令 :
scp -r /usr/local/hadoop hadoop2@hadoop21:/home/hadoop2/ # 复制到 hadoop21 节点上
scp -r /usr/local/hadoop hadoop2@hadoop22:/home/hadoop2/ # 复制到 hadoop22 节点上
-
复制完成以后切换到 hadoop21 节点执行 :
# 采用压缩复制的 请执行 :
tar -zxvf /home/hadoop2/hadoop.master.tar.gz -C /usr/local
# 未采用压缩直接复制的 请执行 :
cp -r /home/hadoop2/hadoop /usr/local
注意 : hadoop22 节点上执行的操作和 hadoop21 相同
运行 Hadoop 集群
格式化文件系统
首次启动需要先在 hadoop20 节点执行 namenode 的格式化:
source /etc/profile # 运行之前请在所有节点上生效一下环境变量
rm -r /usr/local/hadoop/logs/* # 清空日志文件
cd /usr/local/hadoop/bin
hdfs namenode -format # 格式化文件系统
特别注意 : 首次运行需要执行初始化,之后尽量不要再次执行此命令;如果出现错误必须重新格式化,请删除 /usr/local/hadoop 目录下面的 hadoop_tmp 文件夹
启动集群
- 当格式化通过之后,就可以启动 hadoop 了,启动必须在 hadoop20 节点上运行
start-dfs.sh
关闭集群
# 关闭集群的操作必须在 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,主节点会关闭所有从节点的 hadood
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 # 退出安全模式
负载均衡
start-balancer.sh
# 可以使 DataNode 节点上选择策略 重新平衡 DataNode 上的数据块的分布
参考博客 :
关于mr-jobhistory-daemon.sh的一些了解
Hadoop分布式集群安装
Hadoop集群配置(最全面总结)
Hadoop2.7.2之集群搭建(高可用)
Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS