Hadoop部署模式有:本地模式、伪分布模式、完全分布式模式、HA完全分布式模式。区分的依据是NameNode、DataNode、ResourceManager、NodeManager等模块运行在几个JVM进程、几个机器。
模式名称 | 各个模块占用的JVM进程数 | 各个模块运行在几个机器数上 |
---|---|---|
本地模式 | 1个 | 1个 |
伪分布式模式 | N个 | 1个 |
完全分布式模式 | N个 | N个 |
HA完全分布式模式 | N个 | N个 |
安装前提:JDK1.8环境,机器配置免密登录
本地模式部署
节点规划
主机 | 安装软件 |
---|---|
192.168.199.119 | ALL IN ONE |
下载地址:http://hadoop.apache.org/releases.html
我这里下载的是hadoop-3.2.2.tar.gz
创建文件夹并解压安装包
mkdir -p /data/hadoop && cd /data/hadoop
tar -zxvf hadoop-3.2.2.tar.gz
验证mapreduce程序
vi wc.input
hadoop mapreduce hive
hbase spark storm
sqoop hadoop hive
spark hadoop
运行hadoop自带的mapreduce Demo
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /data/hadoop/wc.input output2
这里可以看到job ID中有local字样,说明是运行在本地模式下的
查看输出文件
[root@yfm19 hadoop-3.2.2]# ll output2/
total 4
-rw-r--r-- 1 root root 60 Mar 23 22:07 part-r-00000
-rw-r--r-- 1 root root 0 Mar 23 22:07 _SUCCESS
[root@yfm19 hadoop-3.2.2]# cat output2/part-r-00000
hadoop 3
hbase 1
hive 2
mapreduce 1
spark 2
sqoop 1
storm 1
伪分布模式
节点规划
主机 | 安装软件 |
---|---|
192.168.199.119 | ALL IN ONE |
创建一个名字为hadoop的普通用户并且授权sudo权限
[root@yfm19 hadoop-3.2.2]# useradd hadoop
[root@yfm19 hadoop-3.2.2]# passwd hadoop
Changing password for user hadoop.
New password: 123456
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
给hadoop用户sudo权限
vim /etc/sudoers
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL
切换到hadoop用户
su hadoop
创建存放hadoop文件的目录, 将hadoop文件夹的所有者指定为hadoop用户
sudo mkdir hadoop-pretend
sudo chown -R hadoop:hadoop hadoop-pretend/
cd hadoop-pretend/ && cp ../hadoop/hadoop-3.2.2.tar.gz .
配置Hadoop环境变量
vim /etc/profile
export HADOOP_HOME=/data/hadoop-pretend/hadoop-3.2.2
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
source /etc/profile
配置 hadoop-env.sh、mapred-env.sh、yarn-env.sh文件的JAVA_HOME参数
vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/data/jdk/jdk1.8.0_271
添加hosts变量
vi /etc/hosts
192.168.199.119 bigdata-01.hadoop.com
配置core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata-01.hadoop.com:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop-pretend/tmpdata</value>
</property>
</configuration>
fs.defaultFS参数配置的是HDFS的地址
hadoop.tmp.dir配置的是Hadoop临时目录,比如HDFS的NameNode数据默认都存放这个目录下,查看*-default.xml等默认配置文件,就可以看到很多依赖${hadoop.tmp.dir}的配置。
默认的hadoop.tmp.dir是/tmp/hadoop-${user.name},此时有个问题就是NameNode会将HDFS的元数据存储在这个/tmp目录下,如果操作系统重启了,系统会清空/tmp目录下的东西,导致NameNode元数据丢失,是个非常严重的问题,所有我们应该修改这个路径
配置hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
dfs.replication配置的是HDFS存储时的备份数量,因为这里是伪分布式环境只有一个节点,所以这里设置为1
格式化hdfs
bin/hdfs namenode -format
格式化是对HDFS这个分布式文件系统中的DataNode进行分块,统计所有分块后的初始元数据的存储在NameNode中
格式化后,查看core-site.xml里hadoop.tmp.dir(本例是/opt/data目录)指定的目录下是否有了dfs目录,如果有,说明格式化成功
[hadoop@yfm19 hadoop-pretend]$ tree /data/hadoop-pretend/tmpdata/
/data/hadoop-pretend/tmpdata/
└── dfs
└── name
└── current
├── fsimage_0000000000000000000
├── fsimage_0000000000000000000.md5
├── seen_txid
└── VERSION
3 directories, 4 files
fsimage是NameNode元数据在内存满了后,持久化保存到的文件
fsimage*.md5 是校验文件,用于校验fsimage的完整性。
seen_txid 是hadoop的版本
[hadoop@yfm19 hadoop-pretend]$ cat /data/hadoop-pretend/tmpdata/dfs/name/current/VERSION
#Tue Mar 23 23:59:26 CST 2021
namespaceID=854029650
clusterID=CID-84b02527-19ee-4be3-9568-9c44a0c58da2
cTime=1616515166637
storageType=NAME_NODE
blockpoolID=BP-2130542932-192.168.199.119-1616515166637
layoutVersion=-65
vession文件里保存:
namespaceID:NameNode的唯一ID。
clusterID:集群ID,NameNode和DataNode的集群ID应该一致,表明是一个集群。
启动NameNode
${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode
启动DataNode
${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
启动SecondaryNameNode
${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode
查看是否启动成功
[hadoop@yfm19 logs]$ jps
14228 DataNode
14391 SecondaryNameNode
14439 Jps
13902 NameNode
[hadoop@yfm19 logs]$ pwd
/data/hadoop-pretend/hadoop-3.2.2/logs
[hadoop@yfm19 logs]$ tree .
.
├── hadoop-hadoop-datanode-yfm19.log
├── hadoop-hadoop-datanode-yfm19.out
├── hadoop-hadoop-namenode-yfm19.log
├── hadoop-hadoop-namenode-yfm19.out
├── hadoop-hadoop-secondarynamenode-yfm19.log
├── hadoop-hadoop-secondarynamenode-yfm19.out
└── SecurityAuth-hadoop.audit
HDFS上测试创建目录、上传、下载文件
${HADOOP_HOME}/bin/hdfs dfs -mkdir /demo1
上传本地文件到HDFS上
${HADOOP_HOME}/bin/hdfs dfs -put ${HADOOP_HOME}/etc/hadoop/core-site.xml /demo1
读取HDFS上的文件内容
${HADOOP_HOME}/bin/hdfs dfs -cat /demo1/core-site.xml
从HDFS上下载文件到本地
${HADOOP_HOME}/bin/hdfs dfs -get /demo1/core-site.xml
配置、启动YARN
vi etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
指定mapreduce运行在yarn框架上。
配置yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata-01.hadoop.com</value>
</property>
</configuration>
yarn.nodemanager.aux-services配置了yarn的默认混洗方式,选择为mapreduce的默认混洗算法。
yarn.resourcemanager.hostname指定了Resourcemanager运行在哪个节点上。
启动Resourcemanager
${HADOOP_HOME}/sbin/yarn-daemon.sh start resourcemanager
启动nodemanager
${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager
查看是否启动成功
[hadoop@yfm19 logs]$ jps
16017 ResourceManager
14228 DataNode
14391 SecondaryNameNode
16359 Jps
16329 NodeManager
13902 NameNode
访问YARN的Web页面,http://192.168.199.119:8088/
运行MapReduce Job
创建测试用的Input文件,创建输入目录
${HADOOP_HOME}/bin/hdfs dfs -mkdir -p /wordcountdemo/input1
将之前创建的wc.input拷贝到${HADOOP_HOME}
将wc.input文件上传到HDFS的/wordcountdemo/input目录中:
[hadoop@yfm19 hadoop-pretend]$ ${HADOOP_HOME}/bin/hdfs dfs -put /data/hadoop-pretend/wc.input /wordcountdemo/input1
[hadoop@yfm19 hadoop-pretend]$ ${HADOOP_HOME}/bin/hdfs dfs -ls /wordcountdemo/input1
Found 1 items
-rw-r--r-- 1 hadoop supergroup 71 2021-03-29 05:21 /wordcountdemo/input1/wc.input
运行WordCount MapReduce Job
[hadoop@yfm19 hadoop-3.2.2]$ ${HADOOP_HOME}/bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /wordcountdemo/input1 /wordcountdemo/output1
2021-03-29 05:29:48,194 INFO client.RMProxy: Connecting to ResourceManager at bigdata-01.hadoop.com/192.168.199.119:8032
2021-03-29 05:29:58,720 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/hadoop/.staging/job_1616966245338_0002
2021-03-29 05:29:58,859 INFO input.FileInputFormat: Total input files to process : 1
2021-03-29 05:29:59,302 INFO mapreduce.JobSubmitter: number of splits:1
2021-03-29 05:29:59,798 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1616966245338_0002
2021-03-29 05:29:59,799 INFO mapreduce.JobSubmitter: Executing with tokens: []
2021-03-29 05:29:59,896 INFO conf.Configuration: resource-types.xml not found
2021-03-29 05:29:59,897 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2021-03-29 05:29:59,939 INFO impl.YarnClientImpl: Submitted application application_1616966245338_0002
2021-03-29 05:29:59,967 INFO mapreduce.Job: The url to track the job: http://bigdata-01.hadoop.com:8088/proxy/application_1616966245338_0002/
2021-03-29 05:29:59,967 INFO mapreduce.Job: Running job: job_1616966245338_0002
2021-03-29 05:30:30,160 INFO mapreduce.Job: Job job_1616966245338_0002 running in uber mode : false
2021-03-29 05:30:30,161 INFO mapreduce.Job: map 0% reduce 0%
2021-03-29 05:30:44,248 INFO mapreduce.Job: map 100% reduce 0%
2021-03-29 05:30:58,350 INFO mapreduce.Job: map 100% reduce 100%
2021-03-29 05:31:15,441 INFO mapreduce.Job: Job job_1616966245338_0002 completed successfully
查看输出结果目录
[hadoop@yfm19 hadoop-3.2.2]$ ${HADOOP_HOME}/bin/hdfs dfs -ls /wordcountdemo/output1
Found 2 items
-rw-r--r-- 1 hadoop supergroup 0 2021-03-29 05:30 /wordcountdemo/output1/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 60 2021-03-29 05:30 /wordcountdemo/output1/part-r-00000
output目录中有两个文件,_SUCCESS文件是空文件,有这个文件说明Job执行成功。
part-r-00000文件是结果文件,其中-r-说明这个文件是Reduce阶段产生的结果,mapreduce程序执行时,可以没有reduce阶段,但是肯定会有map阶段,如果没有reduce阶段这个地方有是-m-。
一个reduce会产生一个part-r-开头的文件。
查看输出文件内容
[hadoop@yfm19 hadoop-3.2.2]$ ${HADOOP_HOME}/bin/hdfs dfs -cat /wordcountdemo/output1/part-r-00000
hadoop 3
hbase 1
hive 2
mapreduce 1
spark 2
sqoop 1
storm 1
结果是按照键值排好序的。
停止Hadoop
${HADOOP_HOME}/sbin/hadoop-daemon.sh stop namenode
${HADOOP_HOME}/sbin/hadoop-daemon.sh stop datanode
${HADOOP_HOME}/sbin/yarn-daemon.sh stop resourcemanager
${HADOOP_HOME}/sbin/yarn-daemon.sh stop nodemanager
Hadoop各个功能模块的理解
1、 HDFS模块
HDFS负责大数据的存储,通过将大文件分块后进行分布式存储方式,突破了服务器硬盘大小的限制,解决了单台机器无法存储大文件的问题,HDFS是个相对独立的模块,可以为YARN提供服务,也可以为HBase等其他模块提供服务。
2、 YARN模块
YARN是一个通用的资源协同和任务调度框架,是为了解决Hadoop1.x中MapReduce里NameNode负载太大和其他问题而创建的一个框架。
YARN是个通用框架,不止可以运行MapReduce,还可以运行Spark、Storm等其他计算框架。
3、 MapReduce模块
MapReduce是一个计算框架,它给出了一种数据处理的方式,即通过Map阶段、Reduce阶段来分布式地流式处理数据。它只适用于大数据的离线处理,对实时性要求很高的应用不适用
历史服务介绍
Hadoop开启历史服务可以在web页面上查看Yarn上执行job情况的详细信息。可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。
开启历史服务
[hadoop@bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh start historyserver
需要在windows机器添加hosts环境变量
开启后,可以通过Web页面查看历史服务器:
http://bigdata-01.hadoop.com:19888/jobhistory
Web查看job执行历史
1、 运行一个mapreduce任务
[hadoop@yfm19 hadoop-3.2.2]$ ${HADOOP_HOME}/bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /wordcountdemo/input1 /wordcountdemo/output2
历史服务器的Web端口默认是19888,可以查看Web界面。
但是在上面所显示的某一个Job任务页面的最下面,Map和Reduce个数的链接上,点击进入Map的详细信息页面,再查看某一个Map或者Reduce的详细日志是看不到的,是因为没有开启日志聚集服务
开启日志聚集
日志聚集介绍
MapReduce是在各个机器上运行的,在运行过程中产生的日志存在于各个机器上,为了能够统一查看各个机器的运行日志,将日志集中存放在HDFS上,这个过程就是日志聚集。
配置日志聚集功能
Hadoop默认是不启用日志聚集的。在yarn-site.xml文件里配置启用日志聚集。
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>106800</value>
</property>
重启Yarn进程
${HADOOP_HOME}/sbin/stop-yarn.sh
${HADOOP_HOME}/sbin/start-yarn.sh
重启HistoryServer进程
${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh stop historyserver
${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh start historyserver