概述
Hadoop概述
Hadoop是什么
- Hadoop是一个由Apache基金会开发的分布式系统基础架构
- Hadoop主要解决:海量数据的存储、海量数据的分析计算
- 广义来说,Hadoop是指Hadoop生态圈,还包括HBase、Hive等
Hadoop发展历史
- Hadoop的创始人是Doug Cutting,为了实现与Google类似的全文搜索功能,他在Lucene框架基础上进行优化升级,查询引擎和索引引擎。
- Lucene模仿谷歌开发出了微型版Nutch。
- 2003-2004年,Google开源部分GFS和MapReduce思想细节,以此为基础Doug Cutting等人用两年业余时间实现了HDFS和MapReduce,使Nutch性能飙升。
- 2005年,Hadoop作为Lucene的子项目Nutch的一部分正式引入Apache基金会。
- 2006 年 3 月份,Map-Reduce和Nutch Distributed File System(NDFS)分别被纳入到 Hadoop 项目中,Hadoop就此正式诞生,标志着大数据时代来临。
Hadoop三大发行版本
Hadoop的三大发行版本:Apache、Cloudera、Hortonworks。
Apache是最原始的版本,对于入门学习最友好。
Cloudera集成了多个大数据框架,对应产品CDH。
Hortonworks文档较好,对应产品HDP。
Hortonworks已经被Cloudera公司收购,推出新品牌CDP。
Hadoop的优势
- 高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
- 高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点,这里需要强调的是动态的增删服务器。
- 高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
- 高容错性:能够自动将失败的任务重新分配。
Hadoop的组成
在Hadoop 1.x中
MapReduce:计算、资源调度
HDFS:数据存储
Common:辅助工具
在Hadoop 2.x中
MapReduce:计算
Yarn:资源调度
HDFS:数据存储
Common:辅助工具
在Hadoop 3.x中,组成上和Hadoop 2.x没有变化,在细节上有所优化。
HDFS架构概述
HDFS:Hadoop Distributed File System,是一个分布式文件系统。包括三部分:NameNode、DataNode、Secondary NameNode。
NameNode(nn):存储文件的元数据,如文件名、文件目录结构、文件属性、每个文件的块列表和块所在的NameNode。
DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和。
Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份。
这里,可以把NameNode比作一本书的目录,把DataNode比作一本书的正文,Secondary NameNode就是对目录的一个备份。
YARN架构概述
YARN:Yet Another Resource Negotiator,是Hadoop的资源管理器。包括ResourceManager、NodeManager、ApplicationMaster、Container。
ResourceManager:整个集群资源(内存、CPU等)的总管理者
NodeManager:单个结点服务器资源的管理者
ApplicationMaster:单个任务的管理者
Container:相当于一台独立的服务器,封装了任务运行需要的资源
MapReduce架构概述
MapReduce将计算过程分为两个阶段:Map和Reduce。
Map:负责并行处理输入数据
Reduce:负责将Map的结果进行汇总
HDFS、YARN、MapReduce三者关系
大数据技术生态体系
- Sqoop:Sqoop是一款开源的工具,主要用于在Hadoop、Hive与传统的数据库(MySQL)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL,Oracle 等)中的数据导进到Hadoop的HDFS中,也可以将 HDFS的数据导进到关系型数据库中。
- Flume:Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据。
- Kafka:Kafka是一种高吞吐量的分布式发布订阅消息系统。
- Spark:Spark是当前最流行的开源大数据内存计算框架。可以基于 Hadoop上存储的大数据进行计算。
- Flink:Flink是当前最流行的开源大数据内存计算框架。用于实时计算的场景较多。
- Oozie:Oozie是一个管理Hadoop作业(job)的工作流程调度管理系统。
- Hbase:HBase是一个分布式的、面向列的开源数据库。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。
- Hive:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
- ZooKeeper:它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
推荐系统架构图
数据分为结构化数据、半结构化数据、非结构化数据。
结构化数据使用Sqoop处理,半结构化数据使用Flume处理,非结构化数据使用Kafka处理。
处理完成之后,结构化和半结构化使用HDFS进行存储,非结构化使用Kafka进行存储。
通过YARN对任务进行资源分配。
通过Hive、Spark、Flink进行计算,Hive的计算发生在硬盘,Spark的计算发生在内存和硬盘,Flink是实时计算框架。
如果有多个任务存在依赖关系的时候,在任务调度层进行控制。
Hadoop运行环境搭建
模板虚拟机环境准备
VMware Workstation 16 Pro最小化安装CentOS 7
修改主机映射:vim /etc/hosts,加上如下内容,在物理机的hosts也加入这个配置,重启服务器
192.168.216.100 hadoop100
192.168.216.101 hadoop101
192.168.216.102 hadoop102
192.168.216.103 hadoop103
192.168.216.104 hadoop104
192.168.216.105 hadoop105
192.168.216.106 hadoop106
192.168.216.107 hadoop107
192.168.216.108 hadoop108
在/opt下创建module和software文件夹。
克隆虚拟机
将前面创建好的虚拟机进行克隆,克隆后,修改ip地址,主机名称即可。
关闭Hadoop100虚拟机,在Hadoop100上右键,选择“管理”-“克隆”。
在选择克隆类型的时候,一定要选择完整克隆,链接克隆类似于快捷方式。
分别克隆出Hadoop102、Hadoop103、Hadoop104,Hadoop101有其他用途,所以,这里跳过Hadoop101。
修改Hadoop102、Hadoop103、Hadoop104的ip信息和hostname。
[root@hadoop102 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@hadoop102 ~]# vim /etc/hostname
在Hadoop102上安装JDK
# 将JDK拷贝到Hadoop102上,解压缩
[root@hadoop102 software]# tar -zxvf jdk-8u231-linux-x64.tar.gz -C /opt/module/
# 创建一个自定义的环境变量文件
[root@hadoop102 profile.d]# cd /etc/profile.d
[root@hadoop102 profile.d]# vim my_env.sh
my_env.sh文件如下
# JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_231/
export PATH=$PATH:$JAVA_HOME/bin
# 使my_env.sh生效
[root@hadoop102 profile.d]# source /etc/profile
# 测试JAVA_HOME是否生效
[root@hadoop102 profile.d]# java -version
在Hadoop102上安装Hadoop
# 将Hadoop拷贝到Hadoop102上,解压缩
[root@hadoop102 software]# tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
# 修改my_env.sh,把Hadoop加到环境变量中
[root@hadoop102 module]# vim /etc/profile.d/my_env.sh
在my_env.sh里增加如下内容
# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
Hadoop目录结构
[root@hadoop102 hadoop-3.1.3]# ll
总用量 176
drwxr-xr-x. 2 1000 1000 183 9月 12 2019 bin
drwxr-xr-x. 3 1000 1000 20 9月 12 2019 etc
drwxr-xr-x. 2 1000 1000 106 9月 12 2019 include
drwxr-xr-x. 3 1000 1000 20 9月 12 2019 lib
drwxr-xr-x. 4 1000 1000 288 9月 12 2019 libexec
-rw-rw-r--. 1 1000 1000 147145 9月 4 2019 LICENSE.txt
-rw-rw-r--. 1 1000 1000 21867 9月 4 2019 NOTICE.txt
-rw-rw-r--. 1 1000 1000 1366 9月 4 2019 README.txt
drwxr-xr-x. 3 1000 1000 4096 9月 12 2019 sbin
drwxr-xr-x. 4 1000 1000 31 9月 12 2019 share
- bin:存放Hadoop相关的服务(HDFS,YARN,MapReduce)操作脚本
- etc:存放Hadoop配置文件
- lib:存放Hadoop本地库,对数据进行压缩和解压缩的功能
- sbin:存放启动或通知Hadoop相关服务的命令
- share:存放Hadoop依赖jar包、文档、官方案例
Hadoop运行模式
Hadoop的运行模式包括:本地模式、伪分布式模式、完全分布式模式。
- 本地模式:单机运行,用于测试
- 伪分布式模式:也是单机运行,但是具备Hadoop集群的所有功能,用一台服务器模拟一个分布式环境
- 完全分布式模式:多台服务器组成分布式环境
本地运行模式
# 进入Hadoop目录
[root@hadoop102 /]# cd /opt/module/hadoop-3.1.3/
# 创建一个wcinput文件夹
[root@hadoop102 hadoop-3.1.3]# mkdir wcinput
[root@hadoop102 hadoop-3.1.3]# cd wcinput/
# 在wcinput文件夹新建一个word.txt文本文件
[root@hadoop102 wcinput]# vim word.txt
[root@hadoop102 wcinput]# cd /opt/module/hadoop-3.1.3/
# 运行本地jar:hadoop-mapreduce-examples-3.1.3.jar,调用MapReduce的WordCount方法,输入路径是wcinput,输出路径是wcoutput
[root@hadoop102 hadoop-3.1.3]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
# 查看输出结果
[root@hadoop102 hadoop-3.1.3]# cat wcoutput/part-r-00000
完全分布式运行模式
虚拟机准备
编写集群分发脚本xsync.sh
先来介绍两个命令:scp和rsync。
# scp:secret copy命令:安全拷贝命令
# -r:递归操作
# $pdir/$fname:源路径/源文件名称
# $user@$host:$pdir/$fname:目的用户名@主机地址:目的路径/目的文件名称
scp -r $pdir/$fname $user@$host:$pdir/$fname
# 将当前服务器的/opt/module/jdk1.8.0_231/拷贝到hadoop103服务器的/opt/module/目录
[root@hadoop102 ~]# scp -r /opt/module/jdk1.8.0_231/ root@hadoop103:/opt/module/
# 在hadoop103上,将hadoop102服务器的/opt/module/目录的文件,拷贝到hadoop104的/opt/module/目录
[root@hadoop103 ~]# scp -r root@hadoop102:/opt/module/* root@hadoop104:/opt/module/
# rsync:rsync命令:同步命令
# -a:归档拷贝
# -v:显示复制过程
# $pdir/$fname:源路径/源文件名称
# $user@$host:$pdir/$fname:目的用户名@主机地址:目的路径/目的文件名称
rsync -av $pdir/$fname $user@$host:$pdir/$fname
# 先在hadoop104上删除wcinput和wcoutput文件夹
[root@hadoop104 hadoop-3.1.3]# rm -rf wc*
# 如果出现rsync: 未找到命令,需要先按照rsync
[root@hadoop102 hadoop-3.1.3]# yum -y install rsync
# 回到Hadoop102,将hadoop102上的hadoop-3.1.3同步到hadoop104的hadoop-3.1.3,也就是将hadoop102上的wcinput和wcoutput同步过去
[root@hadoop102 hadoop-3.1.3]# rsync -av /opt/module/hadoop-3.1.3/ root@hadoop104:/opt/module/hadoop-3.1.3/
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
现在需要编写一个脚本,实现循环复制文件到所有节点的相同目录下。
[root@hadoop102 /]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_231/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/root/bin
# 为了让xsync.sh在任何路径下都能运行,将xsync.sh放在/usr/local/bin下
[root@hadoop102 /]# cd /usr/local/bin/
[root@hadoop102 bin]# vim xsync.sh
# 给xsync.sh赋运行权限
[root@hadoop102 bin]# chmod 777 xsync.sh
# 测试同步效果,将/etc/profile.d/my_env.sh文件同步到集群的所有机器上
[root@hadoop102 bin]# xsync.sh /etc/profile.d/my_env.sh
xsync.sh的内容如下所示。
#!/bin/bash
# 判断参数个数
if [ $# -lt 1 ]
then
echo "Not Enough Argument!"
exit;
fi
# 遍历集群里所有的机器
for host in hadoop102 hadoop103 hadoop104
do
echo "######## $host ########"
# 遍历所有目录
for file in $@
do
# 判断文件是否存在
if [ -e $file ]
then
# 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
# 获取当前文件的名称
filename=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$filename $host:$pdir
else
echo "$file does not exists!"
fi
done
done
SSH免密登录配置
使用ssh命令可以连接另一台服务器,首次链接的时候,会有一个提示信息:Are you sure you want to continue connecting (yes/no)?
# ssh连接到hadoop103
[root@hadoop102 ~]# ssh hadoop103
# 从hadoop103退出
[root@hadoop103 ~]# exit
首先,生成公钥和私钥
[root@hadoop102 .ssh]# pwd
/root/.ssh
# 生成公钥和私钥
[root@hadoop102 .ssh]# ssh-keygen -t rsa
# 敲3下回车,就可以生成公钥和私钥了,分别对应id_rsa.pub和id_rsa
# 将公钥拷贝到免密登陆的机器上
[root@hadoop102 .ssh]# ssh-copy-id hadoop102
[root@hadoop102 .ssh]# ssh-copy-id hadoop103
[root@hadoop102 .ssh]# ssh-copy-id hadoop104
在/root/.ssh目录下,有几个文件:
- authorized_keys:存放授权过免密登陆的公钥
- id_rsa:生成的私钥
- id_rsa.pub:生成的公钥
- konwn_hosts:记录ssh访问过的公钥
集群配置
按照如下配置进行部署。
hadoop102 | hadoop103 | hadoop104 | |
---|---|---|---|
HDFS | NameNode、DataNode | DataNode | SecondaryNameNode、DataNode |
YARN | NodeManager | ResourceManager、NodeManager | NodeManager |
Hadoop的配置文件分为默认配置文件和自定义配置文件,我们需要修改自定义配置文件。默认配置文件在hadoop-common-3.1.3.jar里,有core-default.xml、hdfs-default.xml、yarn-default.xml、mapred-default.xml。自定义配置文件在$HADOOP_HOME/etc/hadoop下,有:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml。 | |||
core-site.xml |
<configuration>
<!--指定NameNode地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!--指定Hadoop数据存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!--配置HDFS网页登录静态用户,这里的value要和后面操作时候的用户名一致,否则会提示没有权限-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<!--nn web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!--2nn web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<!--指定 MR 走 shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!--环境变量的继承-->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<!--指定 MapReduce 程序运行在 Yarn 上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
最后,使用xsync将配置分发到hadoop103和hadoop104上。
群起集群
# 配置workers
[root@hadoop102 hadoop]# pwd
/opt/module/hadoop-3.1.3/etc/hadoop
[root@hadoop102 hadoop]# vim workers
# 注意不要有多余的空格和空行
[root@hadoop102 hadoop]# cat workers
hadoop102
hadoop103
hadoop104
# 同步到hadoop102,hadoop103,hadoop104
[root@hadoop102 hadoop]# xsync.sh workers
集群第一次启动,需要在hadoop102上格式化NameNode,格式化NameNode会产生新的集群id,导致NameNode和DataNode的集群id不一致,导致集群找不到以往数据。如果集群在运行中报错,需要重新格式化NameNode的话,先停止NameNode和DataNode进程,删除所有机器上的data和logs目录,再进行格式化。
# NameNode格式化,在hadoop-3.1.3目录下会产生data文件夹和logs文件夹
[root@hadoop102 hadoop-3.1.3]# hdfs namenode -format
# 启动HDFS,这里我用的root用户启动,结果报错了
[root@hadoop102 hadoop-3.1.3]# sbin/start-dfs.sh
Starting namenodes on [hadoop102]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [hadoop104]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
# 为了解决报错,修改hadoop-env.sh
[root@hadoop102 hadoop-3.1.3]# cd etc/hadoop/
[root@hadoop102 hadoop]# vim hadoop-env.sh
# 添加如下内容
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
# 同步给hadoop102,hadoop103,hadoop104
[root@hadoop102 hadoop]# xsync.sh hadoop-env.sh
# 再次启动HDFS
[root@hadoop102 hadoop-3.1.3]# sbin/start-dfs.sh
# 分别查看hadoop102,hadoop103,hadoop104的进程
[root@hadoop102 hadoop-3.1.3]# jps
56288 DataNode
56130 NameNode
56652 Jps
[root@hadoop103 hadoop]# jps
2850 Jps
2772 DataNode
[root@hadoop104 ~]# jps
1700 DataNode
1860 Jps
1773 SecondaryNameNode
启动成功后,访问http://hadoop102:9870/可以看到HDFS存储的数据信息。最常用的功能是Utilities/Browse the file system。
# 在配置了ResourceManager的服务器上(这里是hadoop103)启动YARN
[root@hadoop103 hadoop-3.1.3]# sbin/start-yarn.sh
# 查看进程
[root@hadoop103 hadoop-3.1.3]# jps
3568 ResourceManager
2772 DataNode
3732 NodeManager
4126 Jps
启动成功后,访问http://hadoop103:8088/可以看到YARN上运行的job信息。
测试HDFS上传文件。
# 在HDFS上创建一个目录,创建成功后,可以在browse directory里看到
[root@hadoop102 ~]# hadoop fs -mkdir /wcinput
# 把本地的/opt/module/hadoop-3.1.3/wcinput/word.txt文件,上传到HDFS的/wcinput下
[root@hadoop102 ~]# hadoop fs -put /opt/module/hadoop-3.1.3/wcinput/word.txt /wcinput
实际上,数据存储在/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1505060178-192.168.216.102-1624977421765/current/finalized/subdir0/subdir0/路径下。
# 把HDFS上的/wcinput/word.txt文件,下载到当前路径
[root@hadoop102 ~]# hadoop fs -get /wcinput/word.txt ./
# 对集群中/wcinput执行wordcount程序,输出结果到/wcoutput下,在执行过程中,可以在YARN上看到一条记录
[root@hadoop102 ~]# cd /opt/module/hadoop-3.1.3/
[root@hadoop102 hadoop-3.1.3]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
执行完成后,在HDFS上的/output目录下,可以看到part-r-00000文件,文件内容就是wordcount的结果。
集群崩溃处理办法
- 把jps命令里的进程全部杀掉
- 删除集群上每个结点的data和logs
- 在Hadoop102上执行命令格式化:hdfs namenode -format
配置历史服务器
在没有配置历史服务器的时候,通过yarn的可视化界面点击History,是无法查看历史信息的,为了能查看历史信息,需要配置历史服务器。
[root@hadoop102 hadoop]# pwd
/opt/module/hadoop-3.1.3/etc/hadoop
[root@hadoop102 hadoop]# vim mapred-site.xml
# 在configuration结点里添加如下内容
<!--历史服务器端地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!--历史服务器 web 端地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
# 分发配置文件
[root@hadoop102 hadoop]# xsync.sh mapred-site.xml
# 在Hadoop102上启动历史服务器
[root@hadoop102 hadoop]# mapred --daemon start historyserver
# 查看是否启动成功
[root@hadoop102 hadoop]# jps
2656 NodeManager
1987 DataNode
4691 Jps
1829 NameNode
4602 JobHistoryServer
[root@hadoop102 hadoop-3.1.3]# pwd
/opt/module/hadoop-3.1.3
# 执行一个wordcount命令,如果提示wcoutput已存在,先把wcoutput删除掉
[root@hadoop102 hadoop-3.1.3]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
访问http://hadoop103:8088/cluster,点击刚刚任务的History,可以看到MapReduce执行的信息,现在还看不懂。
配置日志的聚集功能
进入MapReduce的job详情界面,右侧有一个logs,点击后会提示,我们没有开启日志聚集功能。
日志聚集功能:应用运行完成后,将运行日志上传到HDFS系统,开启日志聚集功能后,HDFS就给服务器提供访问日志的接口,更方便的查看日志,开启日志聚集功能,需要重新启动NodeManager、ResourceManager、HistoryServer。
[root@hadoop102 hadoop]# pwd
/opt/module/hadoop-3.1.3/etc/hadoop
# 修改yarn-site.xml
[root@hadoop102 hadoop]# vim yarn-site.xml
# 在configuration结点里添加如下内容
<!--开启日志聚集功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--设置日志聚集服务器地址-->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!--设置日志保留时间为 7 天-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
# 分发配置
[root@hadoop102 hadoop]# xsync.sh yarn-site.xml
# 关闭NodeManager、ResourceManager、HistoryServer
[root@hadoop103 sbin]# ./stop-yarn.sh
[root@hadoop102 hadoop]# mapred --daemon stop historyserver
# 启动NodeManager、ResourceManager、HistoryServer
[root@hadoop103 sbin]# ./start-yarn.sh
[root@hadoop102 hadoop]# mapred --daemon start historyserver
# 先在HDFS上删除wcoutput,再执行wordcount命令
[root@hadoop102 hadoop-3.1.3]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
回到http://hadoop103:8088/cluster,点击History,再点击logs,此时就可以看到MapReduce的log了。
通过http://hadoop102:19888/jobhistory可以看到历史任务信息。
集群的启动、停止方式
# 整体启动HDFS
[root@hadoop102 hadoop-3.1.3]# sbin/start-dfs.sh
# 整体停止HDFS
[root@hadoop102 hadoop-3.1.3]# sbin/stop-dfs.sh
# 整体启动YARN
[root@hadoop103 hadoop-3.1.3]# sbin/start-yarn.sh
# 整体停止YARN
[root@hadoop103 hadoop-3.1.3]# sbin/stop-yarn.sh
# 各个服务组件单独启动/停止
[root@hadoop102 hadoop]# hdfs --daemon start/stop namenode/datanode/secondarynamenode
# 启动停止YARN
[root@hadoop103 hadoop]# yarn --daemon start/stop resourcemanager/nodemanager
如果集群里服务器比较多,每台服务器执行命令就会非常麻烦,所以写一个脚本,来完成Hadoop集群的启动和停止。
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Argument Input"
exit
fi
case $1 in
"start")
echo "启动Hadoop集群"
echo "启动HDFS"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo "启动YARN"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo "启动HistoryServer"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo "关闭Hadoop集群"
echo "关闭HistoryServer"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/mapred --daemon stop historyserver"
echo "关闭YARN"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo "关闭HDFS"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/stop-dfs.sh"
;;
*)
echo "Input Argument Error"
;;
esac
为了方便查看每台机器的jps返回值,也写一个脚本。
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo "------$host------"
ssh $host jps
done
[root@hadoop102 bin]# cd /usr/local/bin/
# 编写好脚本之后,赋予最高权限并分发
[root@hadoop102 bin]# chmod 777 *.sh
[root@hadoop102 bin]# xsync.sh *.sh
# 进行测试
[root@hadoop102 bin]# ./myhadoop.sh start
[root@hadoop102 bin]# ./jpsall
[root@hadoop102 bin]# ./myhadoop.sh stop
Hadoop常用端口号和配置文件
在Hadoop 3.x中
HDFS-NameNode内部通信端口:8020/9000/9820
HDFS-NameNode对用于开放的查询端口:9870
YARN端口:8088
历史服务器端口:19888
在Hadoop 2.x中
HDFS-NameNode内部通信端口:8020/9000
HDFS-NameNode对用于开放的查询端口:50070
YARN端口:8088
历史服务器端口:19888
在Hadoop 3.x中,常用的配置文件:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、workers。
在Hadoop 2.x中,常用的配置文件:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、slaves。
集群时间同步
如果集群中的服务器不能连接外网,就需要做时间同步,但是这种情况非常少,了解一下即可。
首先确定一个结点为主结点(这里选hadoop102为主结点),其他结点的时间都和这个主结点同步。
# 查看ntpd状态
[root@hadoop102 ~]# systemctl status ntpd
# 启动ntpd服务
[root@hadoop102 ~]# systemctl start ntpd
# 查看ntpd是否开机自启
[root@hadoop102 ~]# systemctl is-enabled ntpd
# 修改hadoop102的ntp.conf配置文件
[root@hadoop102 ~]# vim /etc/ntp.conf
修改如下
# 授权 192.168.10.0-192.168.10.255 网段上的所有机器可以从这台机器上查询和同步时间:取消注释
restrict 192.168.10.0 mask 255.255.255.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
# 修改hadoop102的/etc/sysconfig/ntpd文件
[root@hadoop102 ~]# vim /etc/sysconfig/ntpd
# 增加以下内容,让硬件时间与系统时间一起同步
SYNC_HWCLOCK=yes
# 重新启动ntpd服务
[root@hadoop102 ~]# systemctl start ntpd
# 设置开机自启
[root@hadoop102 ~]# systemctl enable ntpd
修改其他机器的配置。
# 关闭ntpd服务
[root@hadoop103 ~]# systemctl stop ntpd
# 禁用ntpd服务
[root@hadoop103 ~]# systemctl disable ntpd
# 关闭ntpd服务
[root@hadoop104 ~]# systemctl stop ntpd
# 禁用ntpd服务
[root@hadoop104 ~]# systemctl disable ntpd
# 添加定时任务,每分钟和主结点同步时间信息
[root@hadoop103 ~]# crontab -e
# 添加如下内容,对应hadoop104也是如此
*/1 * * * * /usr/sbin/ntpdate hadoop102
# 做测试:将从结点时间改掉,等一分钟再看时间是否从hadoop102上同步
常见问题总结
- 防火墙没关闭或没有启动YARN:INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
- 主机名称配置错误
- IP地址配置错误
- ssh配置错误
- root用户和普通用户启动集群不统一
- 配置文件修改错误
- 主机名称不识别:UnknownHostException,在/etc/hosts中添加ip和主机名的对应关系,比如192.168.216.100 hadoop100,主机名不要起特殊名称
- DataNode和NameNode只能工作一个,先停掉所有进程,删除所有集群上的data和logs,重新启动,参考“集群崩溃处理办法”。
- 命令不生效,检查里面有没有特殊字符,不行就重新敲一遍
- jps已经没有了,但是重启提示进程已经开启,需要在/tmp目录下将集群相关的进程删掉,再重启集群
- jps不生效,全局hadoop java没生效,需要source /etc/profile一下
- 8088端口连接不上,注释掉/etc/hosts里如下代码
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 hadoop102
最后
以上就是大力小伙为你收集整理的Hadoop笔记01-Hadoop-入门Hadoop概述Hadoop运行环境搭建Hadoop运行模式的全部内容,希望文章能够帮你解决Hadoop笔记01-Hadoop-入门Hadoop概述Hadoop运行环境搭建Hadoop运行模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复