Hadoop的安装和使用
本文是基于CentOS 7.3系统环境,进行Hadoop的安装和使用
- CentOS 7.3
- hadoop-2.7.2
一、Hadoop简介
(1) 什么是Hadoop
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
(2) Hadoop的优势
- 高可靠性
Hadoop底层维护多个数据副本,所有即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失 - 高扩展性
在集群间分配任务数据,可方便的扩展数以千计的节点 - 高效性
在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度 - 高容错性
能够自动将失败的任务进行重新分配
(3) Hadoop版本区别
在Hadoop1.x时代,Hadoop中的MapReduce同时处理业务逻辑计算和资源的调度,耦合性较大,在Hadoop2.x时代,增加了Yarn。Yarn只负责资源的调度,MapReduce只负责计算。
Hadoop1.x | Hadoop2.x |
---|---|
MapReduce(计算+资源调度) | MapReduce(计算) |
无 | Yarn(资源调度) |
HDFS(数据存储) | HDFS(数据存储) |
Common(辅助工具) | Common(计算+资源调度) |
(3) HDFS的架构概述
- NameNode
存储文件的元数据,如文件名,文件目录结构,文件属性(创建时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等 - DataNode
在本地文件系统存储文件块数据,以及块数据的校验和 - Secondary NameNode
用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照
(4) Yarn的架构概述
- Resource Manager
- 处理客户端的请求
- 监控Node Manager
- 启动或监控ApplicationMaster
- 资源的分配与调度
- Node Manager
- 管理单个节点上的资源
- 处理来自Resource Manager的命令
- 处理来自ApplicationMaster的命令
- Application Masterr
- 负责数据的切分
- 为应用程序申请资源并分配给内部的任务
- 任务的监控与容错
- Container
- Container是Yarn中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等
二、Hadoop安装
(1) 集群配置
hostname | CPU | 内存 | 硬盘 | IP地址 |
---|---|---|---|---|
hadoop100 | 2 | 4G | 100G | 192.168.1.100 |
hadoop101 | 2 | 4G | 100G | 192.168.1.101 |
hadoop102 | 2 | 4G | 100G | 192.168.1.102 |
(2) 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
(3) 创建用户
useradd xuzheng
passwd xuzheng
(4) 授予用户root权限
# 修改文件为可写权限
sudo chmod 640 /etc/sudoers
vi /etc/sudoers
# 添加一行
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
xuzheng ALL=(ALL) ALL
(5) 重启机器
shutdown -r now
(6) 新建目录
cd /opt
mkdir module
mkdir software
chown -R xuzheng:xuzheng module/
chown -R xuzheng:xuzheng software/
(7) 安装jdk
tar -xzvf jdk-8u201-linux-x64.tar.gz -C /opt/module/
vi /etc/profile
# 添加下面内容
export JAVA_HOME=/opt/module/jdk1.8.0_201
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
# 使配置文件生效
source /etc/profile
(8) 安装hadoop
tar -xzvf hadoop-2.7.2.tar.gz -C /opt/module/
vi /etc/profile
# 添加下面内容
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 使配置文件生效
source /etc/profile
三、本地运行模式
(1) grep实例
创建在hadoop-2.7.2文件下面创建一个input文件夹
mkdir input
准备数据:将Hadoop的xml配置文件复制到input
cp etc/hadoop/*.xml input
执行share目录下的MapReduce程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'
查看输出结果
cat output/part-r-00000
(2) Word Count实例
创建在hadoop-2.7.2文件下面创建一个wcinput文件夹
mkdir wcinput
在wcinput文件下创建一个wc.input文件
cd wcinput
vi wc.input
# 添加下面内容
hadoop yarn
hadoop mapreduce
inspur
inspur
执行share目录下的MapReduce程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
查看输出结果
cat output/part-r-00000
四、伪分布式模式
(1) 配置hadoop-env.sh
vi etc/hadoop/hadoop-env.sh
# 添加下面内容
# The java implementation to use.
export JAVA_HOME=/opt/module/jdk1.8.0_201
(2) 配置core-site.xml
vi etc/hadoop/core-site.xml
# 添加下面内容
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
</configuration>
(3) 配置hdfs-site.xml
vi etc/hadoop/hdfs-site.xml
# 添加下面内容
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
(4) 启动集群
# 格式化NameNode(第一次启动时格式化,以后不用)
# 如果再次重启NameNode会导致namenode和datanode的集群CID不同,因此无法启动datanode
hdfs namenode -format
# 启动NameNode
sbin/hadoop-daemon.sh start namenode
# 启动DataNode
sbin/hadoop-daemon.sh start datanode
# 启动DataNode
sbin/hadoop-daemon.sh start secondarynamenode
(5) 访问hdfs管理页面
http://192.168.1.100:50075
(6) 如何重启NameNode
cd /opt/module/hadoop-2.7.2
# 先停止datanode服务
sbin/hadoop-daemon.sh stop datanode
# 再停止namenode服务
sbin/hadoop-daemon.sh stop namenode
# 再删除data和logs目录
rm -rf data/ logs/
# 格式化NameNode
hdfs namenode -format
(7) hdfs操作命令
创建一个目录
bin/hdfs dfs -mkdir -p /user/xuzheng/input
上传一个文件
bin/hdfs dfs -put wcinput/wc.input /user/atguigu/input/
查看一个目录
bin/hdfs dfs -ls /user/xuzheng/input/
查看一个文件
bin/hdfs dfs -cat /user/xuzheng/ input/wc.input
运行一个MapReduce程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/xuzheng/input/ /user/xuzheng/output
查看结果
hdfs dfs -cat /user/xuzheng/output/*
下载文件
hdfs dfs -get /user/xuzheng/output/part-r-00000 ./wcoutput/
删除目录
hdfs dfs -rm -r /user/xuzheng/output
(8) 配置yarn-env.sh
vi etc/hadoop/yarn-env.sh
# 添加下面内容
export JAVA_HOME=/opt/module/jdk1.8.0_201
(9) 配置yarn-site.xml
vi etc/hadoop/yarn-site.xml
# 添加下面内容
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop100</value>
</property>
</configuration>
(8) 配置mapred-env.sh
vi etc/hadoop/mapred-env.sh
# 添加下面内容
export JAVA_HOME=/opt/module/jdk1.8.0_201
(9) 配置mapred-site.xml
vi etc/hadoop/mapred-site.xml
# 添加下面内容
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(10) 启动YARN
# 必须保证NameNode和DataNode已经启动
# 启动ResourceManager
sbin/yarn-daemon.sh start resourcemanager
# 启动NodeManager
sbin/yarn-daemon.sh start nodemanager
(11) 访问yarn管理页面
http://192.168.1.100:8088/cluster
(12) 删除output目录
bin/hdfs dfs -rm -R /user/xuzheng/output
(13) 执行share目录下的MapReduce程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/xuzheng/input/wc.input /user/xuzheng/output
(14) 查看输出结果
bin/hdfs dfs -cat /user/xuzheng/output/*
(15) 配置历史服务器
vi etc/hadoop/mapred-site.xml
# 添加下面内容
<configuration>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop100:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop100:19888</value>
</property>
</configuration>
(16) 启动历史服务器
sbin/mr-jobhistory-daemon.sh start historyserver
(17) 访问历史
点击【History】,需要提前配置hosts映射关系
192.168.1.100 hadoop100
(18) 开启日志聚集
vi yarn-site.xml
# 添加如下内容
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
(19) 关闭HistoryManager、NodeManager和ResourceManager
sbin/mr-jobhistory-daemon.sh stop historyserver
sbin/yarn-daemon.sh stop nodemanager
sbin/yarn-daemon.sh stop resourcemanager
(20) 启动HistoryManager、ResourceManager和NodeManager
sbin/mr-jobhistory-daemon.sh start historyserver
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
(21) 测试
bin/hdfs dfs -rm -R /user/xuzheng/output
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/xuzheng/input /user/xuzheng/output
四、完全分布式模式
(1) 准备3台客户机
hostname | CPU | 内存 | 硬盘 | IP地址 |
---|---|---|---|---|
hadoop100 | 2 | 4G | 100G | 192.168.1.100 |
hadoop101 | 2 | 4G | 100G | 192.168.1.101 |
hadoop102 | 2 | 4G | 100G | 192.168.1.102 |
(2) 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
(3) 增加用户并授权
useradd xuzheng
passwd xuzheng
# 修改文件为可写权限
sudo chmod 640 /etc/sudoers
vi /etc/sudoers
# 添加一行
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
xuzheng ALL=(ALL) ALL
(4) 修改主机名称
hostnamectl --static set-hostname hadoop101
hostnamectl --static set-hostname hadoop102
hostnamectl --static set-hostname hadoop103
(5) 安装jdk和hadoop
tar -xzvf jdk-8u201-linux-x64.tar.gz -C /opt/module/
tar -xzvf hadoop-2.7.2.tar.gz -C /opt/module/
(6) 配置环境变量
vi /etc/profile
# 添加下面内容
export JAVA_HOME=/opt/module/jdk1.8.0_201
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 使配置文件生效
source /etc/profile
(7) 集群规划
hadoop101 | hadoop102 | hadoop103 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
(8) 集群配置
配置core-site.xml
vi etc/hadoop/core-site.xml
# 添加下面内容
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
</configuration>
配置hadoop-env.sh
vi etc/hadoop/hadoop-env.sh
# 添加下面内容
# The java implementation to use.
export JAVA_HOME=/opt/module/jdk1.8.0_201
配置hdfs-site.xml
vi etc/hadoop/hdfs-site.xml
# 添加下面内容
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:50090</value>
</property>
</configuration>
配置yarn-env.sh
vi etc/hadoop/yarn-env.sh
# 添加下面内容
# The java implementation to use.
export JAVA_HOME=/opt/module/jdk1.8.0_201
配置yarn-site.xml
vi etc/hadoop/yarn-site.xml
# 添加下面内容
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
配置mapred-site.xml
vi etc/hadoop/mapred-site.xml
# 添加下面内容
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop101:19888</value>
</property>
</configuration>
(9) 启动HDFS
在机器hadoop101上执行
# 格式化NameNode(第一次启动时格式化,以后不用)
# 如果再次重启NameNode会导致namenode和datanode的集群CID不同,因此无法启动datanode
hdfs namenode -format
# 启动NameNode
sbin/hadoop-daemon.sh start namenode
# 启动DataNode
sbin/hadoop-daemon.sh start datanode
在机器hadoop102和hadoop103上执行
# 启动DataNode
sbin/hadoop-daemon.sh start datanode
(10) ssh无密登录配置
在机器hadoop101、hadoop102和hadoop103上执行
ssh-keygen -t rsa
在机器hadoop101、hadoop102和hadoop103上执行
ssh-copy-id hadoop101
ssh-copy-id hadoop102
ssh-copy-id hadoop103
(11) 配置从节点
在机器hadoop101上执行
vi etc/hadoop/slaves
# 删除所有内容并添加
hadoop101
hadoop102
hadoop103
(12) 集群启动(ssh配置是前提)
在机器hadoop101上执行
vi etc/hadoop/slaves
# 删除所有内容并添加
hadoop101
hadoop102
hadoop103
将slaves文件同步至其他节点
/home/xuzheng/bin/xsync slaves
停止集群所有的服务
sbin/hadoop-daemon.sh stop namenode
sbin/hadoop-daemon.sh stop datanode
NameNode节点(hadoop101)
sbin/start-dfs.sh
ResourceManager节点(hadoop102)
sbin/start-yarn.sh
(13) 测试集群
在机器hadoop101上执行
hdfs dfs -rm -r /user/xuzheng/input
hdfs dfs -mkdir -p /user/xuzheng/input
(14) 集群时间同步
安装ntp
yum -y install net-tools # netstat
yum -y install ntp
修改配置文件/etc/ntp.conf
vi /etc/ntp.conf
# 限制 192.168.1.0~192.168.255.255之间的服务器可以访问
restrict 192.168.1.0 mask 255.255.0.0 nomodify notrap
# 注释以下内容,因为集群在局域网中,所以不属于互联网其他时间
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
#添加以下信息,当失去互联网连接后,使用本机时间做同步
server 127.127.1.0
fudge 127.127.1.0 stratum 10
修改配置文件/etc/sysconfig/ntpd
vi /etc/sysconfig/ntpd
#添加以下信息,硬件时间与系统时间同步
SYNC_HWCLOCK=yes
hadoop101节点上启动ntp
systemctl stop chronyd
systemctl disable chronyd
systemctl start ntpd
systemctl enable ntpd
其他节点上启动ntp
crontab -e
# 编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop101
(15) 配置机架感知
- 修改配置文件core-site.xml
<configuration>
<property>
<name>topology.script.file.name</name>
<value>/opt/module/hadoop-2.7.2/etc/hadoop/topology.sh</value>
</property>
</configuration>
- 新建topology.sh脚本
#!/bin/bash
HADOOP_CONF=/opt/module/hadoop-2.7.2/etc/hadoop
while [ $# -gt 0 ] ; do
nodeArg=$1
exec<${HADOOP_CONF}/topology.data
result=""
while read line ; do
ar=( $line )
if [ "${ar[0]}" = "$nodeArg" ]||[ "${ar[1]}" = "$nodeArg" ]; then
result="${ar[2]}"
fi
done
shift
if [ -z "$result" ] ; then
echo -n "/default-rack"
else
echo -n "$result"
fi
done
- 修改脚本权限
chmod a+x topology.sh
- 新建topology.data文件
192.168.20.101 hadoop101 /rack1
192.168.20.102 hadoop102 /rack2
192.168.20.103 hadoop103 /rack1