一、平台环境
CentOS6.5
二、软件版本
hadoop-2.8.1下载地址
jdk-8u45-linux-x64下载地址
apache-maven-3.3.9软件下载
三、内容目录
- 前置内容
1.1 jdk安装和配置
1.2 maven安装和配置
1.3 hadoop 编译- 相关知识
2.1 hadoop部署方式介绍
2.2 hadoop主要组件介绍
2.3 hadoop主要进程介绍
2.4 jps命令介绍- 环境搭建
3.1 Hadoop本地模式安部署
3.2 Hadoop伪分布式模式部署
1、前置内容
1.1 jdk安装和配置
之前的文章已经完成过这一步骤,详情请见CentOS6.5安装JDK8
1.2 maven安装和配置
之前的文章已经完成过这一步骤,详情请见CentOS6.5安装Maven
1.3 hadoop 编译
hadoop编译并发必要步骤,只是一个熟悉把源码编译成可用的工具包操作的过程。可以直接在官网下载已经编译好的包跳过此步骤。
如果对此步骤感兴趣可以参考hadoop-2.8.1编译
2、相关知识
2.1 hadoop部署方式介绍
Hadoop部署模式有:本地模式、伪分布模式、完全分布式模式、HA完全分布式模式。区分的依据是NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager等模块运行在几个JVM进程、几个机器。参考下面表格:
模式名称 | 各个模块占用的JVM进程数 | 各个模块运行在几个机器数上 |
---|---|---|
本地模式 | 1个 | 1个 |
伪分布模式 | N个 | 1个 |
完全分布式模式 | N个 | N个 |
HA完全分布式模式 | N个 | N个 |
2.2 hadoop主要组件介绍
hadoop主要组件:HDFS、MapReduce、Yarn。
HDFS( Hadoop Distributed File System):hadoop自带的分布式文件系统,是hadoop数据存储基础。
MapReduce:一套从海量源数据提取分析元素最后返回结果集的编程模型(分布式计算,无进程)。
Yarn(Yet Another Resource Negotiator):通用的资源管理平台,可为各类计算框架提供资源的管理和调度。
此处只对三个组件功能进行简单说明,后续会通过文章对三个组件进行详细说明。注意:Yarn是Hadoop2.x才出MapReduce功能模块中拆出来的。
2.3 hadoop主要进程介绍
hadoop主要进程分为:HDFS相关进程、Yarn相关进程。下面将分别罗列两者的进程。
- HDFS相关进程:
- NameNode NameNode就是HDFS的Master架构,主要负责HDFS文件系统的管理工作
- DataNode DataNode就是负责存储数据的组件
- SecondaryNameNode 是定时对NameNode的数据snapshots进行备份,这样可尽量降低NameNode崩溃之后导致数据丢失的风险
- Yarn
- ResourceManager 负责协调集群上计算资源的分配。调度、启动每一个 Job 所属的 ApplicationMaster、另外监控 ApplicationMaster 的存在情况
- NodeManager 根据要求启动和监视集群中机器的计算容器container,负责 Container 状态的维护,并向 RM 保持心跳汇报该节点资源使用情况。
2.4 jps命令介绍
请参考jps命令原理
3、环境搭建
学习到这里仅仅尝试了本地模式和伪分布式部署。其他模式的部署待后续学习过程慢慢补充。
3.1 Hadoop本地模式部署
本地模式部署比较简单,不需要修改任何配置文件,简单说明一下步骤:
- 创建一个存放本地模式hadoop的目录
[hadoop@hadoop002 software]$ mkdir /opt/software
- 文件上传并解压hadoop文件
[hadoop@hadoop002 software]$ tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz
- 确保JAVA_HOME环境变量已经配置好
[hadoop@hadoop002 software]$ echo $JAVA_HOME
- 运行MapReduce程序,验证
hadoop自带的wordcount例子来在本地模式下测试跑mapreduce。
4.1. 准备mapreduce输入文件teddy.input
[hadoop@hadoop002 software]$ cat /opt/data/teddy.input
hadoop mysql hive
spark oracle storm
mysql hive
4.2. 运行hadoop自带的mapreduce Demo
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ bin/hadoop jar share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /opt/data/teddy.input output2
4.3. 查看输出结果
[hadoop@hadoop002 output2]$ pwd
/opt/software/hadoop-2.6.0-cdh5.7.0/output2
[hadoop@hadoop002 output2]$ ll
total 4
-rw-r--r--. 1 hadoop hadoop 49 Jun 3 17:43 part-r-00000
-rw-r--r--. 1 hadoop hadoop 0 Jun 3 17:43 _SUCCESS
输出目录中有_SUCCESS文件说明JOB运行成功,part-r-00000是输出结果文件。
查看输出结果
[hadoop@hadoop002 output2]$ cat part-r-00000
hadoop 1
hive 2
mysql 2
oracle 1
spark 1
storm 1
3.2 Hadoop伪分布式模式部署
- Hadoop所用的用户设置
1.1 创建hadoop用户
[root@hadoop002 data]# useradd hadoop
[root@hadoop002 data]# passwd hadoop
1.2 给hadoop用户sudo权限
[root@hadoop002 data]# vi /etc/sudoers
设置权限,学习环境可以将hadoop用户的权限设置的大一些,但是生产环境一定要注意普通用户的权限限制。
配置如下:
root ALL=(ALL) ALL
hadoop ALL=(root) NOPASSWD:ALL
注意:如果root用户无权修改sudoers文件,先手动为root用户添加写权限。
[root@hadoop002 ~]# chmod u+w /etc/sudoers
切换到hadoop用户
[root@hadoop002 ~]# su - hadoop
- 解压Hadoop目录文件
2.1 创建一个存放本地模式hadoop的目录
[hadoop@hadoop002 software]$ mkdir /opt/software
2.2 文件上传并解压hadoop文件
[hadoop@hadoop002 software]$ tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz
- 配置Hadoop
3.1 配置hadoop环境变量
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ vi /etc/profile
增加配置如下
export HADOOP_HOME=/opt/software/hadoop-2.6.0-cdh5.7.0
export PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$PATH
使配置文件生效
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ source /etc/profile
3.2 配置 hadoop-env.sh、mapred-env.sh、yarn-env.sh文件的JAVA_HOME参数
配置文件所在目录为:/opt/software/hadoop-2.6.0-cdh5.7.0/etc/hadoop
修改hadoop-env.sh
[hadoop@hadoop002 hadoop]$ vi hadoop-env.sh
修改为:
export JAVA_HOME=/usr/java/jdk1.8.0_45
依次修改三个文件。
3.3 配置core-site.xml
配置文件的路径是:/opt/software/hadoop-2.6.0-cdh5.7.0/etc/hadoop
[hadoop@hadoop002 hadoop]$ vi ${HADOOP_HOME}/etc/hadoop/core-site.xml
配置入下:
fs.defaultFS
hdfs://hadoop002:9000
hadoop.tmp.dir
/opt/data/tmp
其中
- fs.defaultFS参数配置的是HDFS的地址。
- hadoop.tmp.dir配置的是Hadoop临时目录,比如HDFS的NameNode数据默认都存放这个目录下。
注意:默认的hadoop.tmp.dir是/tmp/hadoop-${user.name},此时有个问题就是NameNode会将HDFS的元数据存储在这个/tmp目录下,如果操作系统重启了,系统会清空/tmp目录下的东西,导致NameNode元数据丢失,是个非常严重的问题,所有我们应该修改这个路径。
现在/opt/data/tmp/目录是不存在的,我们要创建它并将它的权限分配给hadoop用户。
[hadoop@hadoop002 hadoop]$ sudo mkdir -p /opt/data/tmp
[hadoop@hadoop002 hadoop]$ sudo chown –R hadoop:hadoop /opt/data/tmp
- 配置、格式化、启动HDFS
4.1 配置hdfs-site.xml
配置文件的路径是:/opt/software/hadoop-2.6.0-cdh5.7.0/etc/hadoop
[hadoop@hadoop002 hadoop]$ vi ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
配置如下:
dfs.replication
1
dfs.replication配置的是HDFS存储时的备份数量,因为这里是伪分布式环境只有一个节点,所以设置为1。
4.2 格式化hdfs
执行命令
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ $HADOOP_HOME/bin/hdfs namenode -format
格式化是对HDFS这个分布式文件系统中的DataNode进行分块,统计所有分块后的初始元数据的存储在NameNode中。格式化后,查看core-site.xml里hadoop.tmp.dir(本例是/opt/data目录)指定的目录下是否有了dfs目录,如果有,说明格式化成功。
[root@hadoop002 current]# pwd
/opt/data/tmp/dfs/name/current
[root@hadoop002 current]# ll
total 16
-rw-rw-r--. 1 hadoop hadoop 353 Jun 3 18:22 fsimage_0000000000000000000
-rw-rw-r--. 1 hadoop hadoop 62 Jun 3 18:22 fsimage_0000000000000000000.md5
-rw-rw-r--. 1 hadoop hadoop 2 Jun 3 18:22 seen_txid
-rw-rw-r--. 1 hadoop hadoop 207 Jun 3 18:22 VERSION
- fsimage是NameNode元数据在内存满了后,持久化保存到的文件。
- fsimage*.md5 是校验文件,用于校验fsimage的完整性。
- seen_txid 是hadoop的版本
- vession文件里保存:
- namespaceID:NameNode的唯一ID。
- clusterID:集群ID,NameNode和DataNode的集群ID应该一致,表明是一个集群。
[root@hadoop002 current]# cat VERSION
#Sun Jun 03 18:22:04 CST 2018
namespaceID=826949800
clusterID=CID-3e8c3f5c-6ff5-461f-ace1-e2be7de4b72c
cTime=0
storageType=NAME_NODE
blockpoolID=BP-1770757348-192.168.137.130-1528021323999
layoutVersion=-60
4.3 启动NameNode
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode
4.4 启动DataNode
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
4.5 启动SecondaryNameNode
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode
4.6 jps命令查看是否已经启动成功,有结果就是启动成功了。
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ jps
52035 SecondaryNameNode
51863 NameNode
51945 DataNode
52075 Jps
启动成功
- 配置、启动YARN
5.1 配置mapred-site.xml
默认没有mapred-site.xml文件,但是有个mapred-site.xml.template配置模板文件。复制模板生成mapred-site.xml。
[hadoop@hadoop002 hadoop]$ pwd
/opt/software/hadoop-2.6.0-cdh5.7.0/etc/hadoop
[hadoop@hadoop002 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[hadoop@hadoop002 hadoop]$ vi mapred-site.xml
增加配置如下:
mapreduce.framework.name
yarn
指定mapreduce运行在yarn框架上。
5.2 配置yarn-site.xml
[hadoop@hadoop002 hadoop]$ pwd
/opt/software/hadoop-2.6.0-cdh5.7.0/etc/hadoop
[hadoop@hadoop002 hadoop]$ vi yarn-site.xml
增加配置如下:
yarn.nodemanager.aux-services
mapreduce_shuffle
- yarn.nodemanager.aux-services配置了yarn的默认混洗方式,选择为mapreduce的默认混洗算法。
5.3 启动Resourcemanager
[hadoop@hadoop002 hadoop]$ ${HADOOP_HOME}/sbin/yarn-daemon.sh start resourcemanager
5.4 启动nodemanager
[hadoop@hadoop002 hadoop]$ ${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager
5.5 查看是否启动成功
[hadoop@hadoop002 hadoop]$ jps
52035 SecondaryNameNode
52294 ResourceManager
51863 NameNode
51945 DataNode
52413 NodeManager
52494 Jps
5.6 YARN的Web页面
YARN的Web客户端端口号是8088,通过http://主机ip:8088/可以查看。
- 在Yarn上运行MapReduce Job
hadoop自带的wordcount例子来在伪分布式下测试跑mapreduce。
6.1 创建测试用的Input文件
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ bin/hdfs dfs -mkdir -p /wordcountdemo/input
6.2 准备mapreduce输入文件teddy.input
[hadoop@hadoop002 software]$ cat /opt/data/teddy.input
hadoop mysql hive
spark oracle storm
mysql hive
6.3 上传文件到hdfs
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ bin/hdfs dfs -put /opt/data/teddy.input /wordcountdemo/input
6.4 运行mapreduce
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /wordcountdemo/input /wordcountdemo/output
完成结果如下:
[hadoop@hadoop002 hadoop-2.6.0-cdh5.7.0]$ bin/hdfs dfs -ls /wordcountdemo/output
Found 2 items
-rw-r--r-- 1 hadoop supergroup 0 2018-06-03 18:56 /wordcountdemo/output/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 49 2018-06-03 18:56 /wordcountdemo/output/part-r-00000