Hadoop是一个大数据的框架,当代大数据的痛点在于大量数据的采集、存储与计算。Hadoop解决了后两个问题,主要提供海量数据的存储与计算功能,所以备受青睐。
一、大数据的特点
大数据拥有“4V”的特点,不过我最近查到的资料说是已经有“5V”了。
-
大容量(Volume)
我们所说的大数据一般指数量级在PB(1024T)、EB(1024PB)、ZB(1024EB)等级的数据。 -
高增长速度(Velocity)
数据增长速度快,处理速度也快,时效性要求高。比如搜索引擎要求几分钟前的新闻能够被用户查询到,个性化推荐算法尽可能要求实时完成推荐。这是大数据区别于传统数据挖掘的显著特征。 -
数据多样性(Variety)
种类和来源多样化。包括结构化、半结构化和非结构化数据,具体表现为网络日志、音频、视频、图片、地理位置信息等等,多类型的数据对数据的处理能力提出了更高的要求。 -
低密度价值(Value)
数据量大,但有价值的数据很少,需要通过计算与处理来提取出有价值的部分。 -
真实性(Veracity)
数据的准确性和可信赖度,即数据的质量。
二、Hadoop简介
Hadoop基础信息
Hadoop是Apache基金会开发的分布式系统基础架构。
一个视频存储在一台电脑上叫单机存储,如果将视频分为三部分,分别存储在三台机器上,这就叫分布式存储。Hadoop主要解决了海量数据的存储与分析计算的问题。
广义上来说,Hadoop是指Hadoop生态圈,即围绕Hadoop框架来运行的其他程序所构成的一个生态系统。如HDFS、HBASE、HIVE、ZooKeeper等。
Hadoop的三大发行版
cloudera公司的CDH,是最先对开源Hadoop进行封装的发行版。
Hortonworks公司的HDP,第二个对开源Hadoop进行封装的发行版。
后来cloudera与Hortonworks收购合并,推出最新也最贵的CDP发行版。(单节点,一年一万美金)
不过我发现HDP是免费的啊,包括Ambari。我下载使用的时候也没管我要钱啊。
Hadoop的优势
- 高可靠性
数据在同集群的多台机器上存在多个副本,一块甚至多块硬盘损坏并不影响实际数据。3.0版本的Hadoop增加了纠删码机制,以前一个数据完全拷贝3次,磁盘使用率是⅓,现在多占用原始数据的40%磁盘存储校验码,原始数据在一定范围内的损坏都可以根据校验码还原,增加了磁盘使用率。 - 高扩展性
可以动态添加、删除机器。 - 高效性
在MapReduce的思想下,Hdaoop是并行工作的,以加快任务处理速度。 - 高容错性
Hadoop能够自动将失败的任务重新分配。
Hadoop的迭代与组成变化
-
Hadoop 1.x时代
MapReduce负责计算与资源调度、HDFS负责数据存储、Common是辅助工具。 -
Hadoop 2.x时代
MapReduce负责计算、Yarn负责资源调度、HDFS负责数据存储、Common是辅助工具。 -
Hadoop 3.x时代
在3.x时代,Hadoop的组成与2.x时代没有区别,但是增加了新的功能及特性,如纠删码,能配置多个NameNode等。
HDFS架构
-
HDFS(Hadoop Distributed File System)是分布式文件系统。
HDFS包含NameNode和DataNode,分布式存储时需要有一个节点负责记录每一个文件存储在哪个节点上,这个节点就是NameNode节点。而下面每一个存储真实数据的节点就是DataNode。
这种情况下如果NameNode节点死掉了,整个集群就无法对外提供服务了,因为谁也不知道数据存哪个节点上了,所以有一个2NN的节点,专门辅助NameNode。
NameNode存储元数据,如文件名、文件目录结构、文件属性(生成时间、文件权限、副本数等),以及每个块列表与块所在的DataNode。
DataNode在本地文件系统存储文件块数据,以及块数据的校验和。
SecondaryNameNode(2NN)负责每过一段时间对NameNode元数据备份。
-
YARN(Yet Another Resource Negotiator)负责资源调度
YARN主要负责资源调度,如CPU与内存。其中包含ResourceManager(RM)、NodeManager(NM)、ApplicationMastrt(AM)还有Container(容器)。
RM是整个集群的资源调度老大,NM是各个数据节点的资源调度老大,AM是单个任务的资源调度者,当多个客户端发起任务时RM会在数据节点上生成容器,容器中的资源由AM管理,同时AM会向RM申请资源,RM会根据NM的资源情况进行分配,如果当前节点资源不足,而AM依然申请更多资源的时候,RM会将任务分配到其他节点上运行,从而使用其他节点的空闲资源。当任务结束时,容器会被释放,资源归还给NM。
需要注意的是,客户端可以是多个,访问RM时会分配多个AM,一个数据节点上可以运行多个AM,每个NM上可以有多个容器在运行,容器默认的内存范围是1-8G,CPU默认最低1个。
-
MapReduce
MapReduce是大数据的计算部分,他分为Map和Reduce两个阶段。
Map阶段并行处理输入数据。
Reduce阶段对Map结果进行汇总。
具体运行逻辑比较复杂,暂时不细研究。
三、Hadoop简单部署与使用
1.环境准备
我准备的环境
三台虚拟机,每台虚拟机的配置为2C3G,硬盘50G,操作系统为centos7.6,无UI界面的最小安装。
需要jdk和hadoop环境,配置好hostname,以及hosts文件。
- 修改主机名
推荐使用hostnamectl去修改,他会一并修改配置文件与静态主机名。
[root@localhost /]# hostnamectl set-hostname hadoop101
- 修改hosts文件
hadoop集群中使用主机域名来通信,所以需要配置hosts,并指定全限定主机名
[root@hadoop101 /]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.163.101 hadoop101 hadoop101.nb
192.168.163.102 hadoop102 hadoop102.nb
192.168.163.103 hadoop103 hadoop103.nb
- 安装jdk
上传jdk的tar包到虚拟机/opt/package
目录下(其实路径随意),此步骤不予展示。
然后解压jdk包到/opt
下
[root@hadoop101 package]# tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt/
- 安装hadoop
上传hadoop的tar包到虚拟机/opt/package
目录下(其实路径随意),此步骤不予展示。
然后解压hadoop包到/opt
下
[root@hadoop101 package]# tar -zxvf hadoop-3.1.3.tar.gz -C /opt/
其中hadoop的bin目录中有一些后面重点学习会经常使用的命令,分别是hdfs,yarn和mapred。
还有常用的配置文件,在hadoop安装路径/etc/hadoop
文件夹中,重要配置有core-site.xml,hdfs-site.xml,mapred-site.xml和yarn-site.xml。
- 配置环境变量
将hadoop和jdk的环境变量配置到/etc/profile
中,并执行source /etc/profile
使其生效。
[root@hadoop103 opt]# tail -9 /etc/profile
#jdk环境变量
export JAVA_HOME=/opt/jdk1.8.0_221
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
#hadoop环境变量
export HADOOP_HOME=/opt/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
- 免密互信
hadoop环境内的三台机器最好都配置免密互信,可以是root用户,也可以是普通用户。教学视频上没说为什么一定要这样做,但是……做了吧。
这里我用一台机器举例子,首先需要创建这台机器自己的ssh密钥对,分公钥与私钥,然后将自己的公钥复制给其他机器。
先创建密钥对,执行命令后一路回车即可。
[eops@hadoop102 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:k3+EzQArxSszuVms1DnDt1AUCGRdVbQvj5m6car4NTQ root@hadoop102
The key's randomart image is:
+---[RSA 2048]----+
| .++o++o.oo |
| . .+o. . |
| .=.+. . |
| *.@..= . |
| . OS=..E . .|
| + o.o . * |
| . = = .|
| . o * |
| ..o.+. |
+----[SHA256]-----+
然后复制自己的公钥到其他机器上,三台机器互相都要做。
[eops@hadoop102 ~]$ ssh-copy-id 192.168.163.102
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.163.102 (192.168.163.102)' can't be established.
ECDSA key fingerprint is SHA256:YmdUMxmmKBnAqQEquZdNvfO5PKABYpzBIrSHiLHPBA8.
ECDSA key fingerprint is MD5:dd:99:1c:4e:89:84:14:fe:b0:a5:9d:69:2a:ad:ea:d9.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
eops@192.168.163.102's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.163.102'"
and check to make sure that only the key(s) you wanted were added.
最后可以登录验证一下,应该只需要输入一次yes
,我下面这次连yes都没让我输入,因为之前已经保存过主机信息了,以后连接时连yes也不用输入了。
[eops@hadoop102 ~]# ssh 192.168.163.102
Last failed login: Wed Nov 10 17:20:09 CST 2021 from hadoop102 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Wed Nov 10 17:18:05 2021
[eops@hadoop102 ~]#
- 防火墙配置
一般安装时都要求关闭防火墙,但是我偏不,因为在真实的生产环境中,一般都禁止关闭防火墙,防火墙是服务器防护的一道重要关卡,没了他服务器就是在裸奔,如果服务器是公网服务器,那你就完蛋了!
不过也可以关闭防火墙,毕竟练习嘛,无所谓,还能省去不少麻烦。
给三台机器都配置防火墙规则。
[root@hadoop101 ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.163.101" accept'
success
[root@hadoop101 ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.163.102" accept'
success
[root@hadoop101 ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.163.103" accept'
success
[root@hadoop101 ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.163.1" accept'
success
[root@hadoop101 ~]# firewall-cmd --reload
success
我是在虚拟机里配置的,所以除了集群内的三台,还要给宿主机开放访问权限,同时为了能用主机名访问url,我还更改了宿主机的hosts文件,就不展示了。
最后一定记得重新加载防火墙配置,否则不生效。
- 时间同步
时间同步这里先不说了,主要就是集群中挑选一台机器安装ntp,然后其他机器使用netdate定时向ntp服务同步时间。如果只是练习hadoop的话,这里暂时不配置也行。
2.hadoop运行方式
- 本地模式
也就是单机模式,数据存储在linux服务器本地,用来演示及测试官方案例。 - 伪分布式
本质也是单机运行,不过数据存储在HDFS上,同时具备集群的所有功能,用一台机器模拟一个分布式环境。 - 完全分布式
多台服务器组成的集群环境。
3.简单执行hadoop程序
hadoop的程序可以调用命令行简单执行并获取结果,比如对一个文本中的单词进行词频统计。
首先需要一个文档用来存储单词
[root@hadoop101 input]# pwd
/tmp/input
[root@hadoop101 input]# ls
test.txt
[root@hadoop101 input]# cat test.txt
aa hh
bb dd
cc ss
aa ff
ee
ff
ee
我创建了一个/tmp/input
文件夹,作为输入目录,其中存储数据本身,然后执行hadoop命令
[root@hadoop101 input]# hadoop jar /opt/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /tmp/input/test.txt /tmp/output/test1
命令中使用hadoop执行jar包,后面是jar包的全路径(相对路径也可以),然后执行此jar包中的wordcount程序,这个程序需要两个参数,输入路径与输出路径,其中输出路径必须不存在,否则会报错。
执行过程略,结果就是会在输出路径中生成两个文件。
[root@hadoop101 test1]# pwd
/tmp/output/test1
[root@hadoop101 test1]# ls
part-r-00000 _SUCCESS
[root@hadoop101 test1]# cat part-r-00000
aa 2
bb 1
cc 1
dd 1
ee 2
ff 2
hh 1
ss 1
文件夹中的_SUCCESS
为标志文件,只表示执行结果的成功与否,前面的part-r-00000
才是执行后的输出内容。
4.hadoop集群的搭建
现在三台机器上的环境都搭建好了,接下来说一下各个机器的组件分配情况。
hadoop101 | hadoop102 | hadoop103 | |
---|---|---|---|
HDFS | NameNode、DataNode | DataNode | SecondaryNameNode(2NN)、DataNode |
YARN | NodeManager | ResourceManager、NodeManager | NodeManager |
这里需要注意,NameNode与2NN不能安装在一台机器上,因为他们都很耗内存,放在一起会有资源抢夺的情况出现。
ResourceManager也比较耗内存,不要与NameDode和2NN装在一台机器上。
YARN的NodeManager是每台机器都要装的,而DateNode尽量每台都装,可以最大化机器资源的利用。
不过以上只是建议,执意全装一台机器上也没问题。
另外,我看的视频中提到过,2NN在NN失效时会自动切换,这是不对的,2NN不具备自动切换功能,他只是用于修复NN的工具,并不能在NN失效时代替NN维持集群运行。
4.1 修改配置文件
接下来需要按照上面的主机规划修改配置文件,修改集群内一台,然后将配置文件拷贝到其余主机上。让整个集群内的配置文件相同。
hadoop的所有配置文件均在安装目录下的etc/hadoop中
先修改核心配置文件core-site.xml
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:8020</value>
</property>
<!-- hdfs的数据存放路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hdfs/</value>
</property>
<!-- 配置hdfs网页登录时的静态用户为ovo -->
<!-- <property>
<name>hadoop.http.staticuser.user</name>
<value>ovo</value>
</property> -->
</configuration>
上面core-site.xml的配置中需要注意一点,被注释的部分为“配置hdfs网页登录时的静态用户”,我注释掉是因为这个要看你的实际需求。
正常使用任意用户向hdfs上传文件时,hdfs里的文件就所属于上传这个文件的用户,其他用户不能删除这个用户上传的文件。正常不配置这里的话,使用ovo用户启动hadoop集群之后,网页上是不可以删除文件的,会报权限不足的错误,如果不希望别人在网页端删除文件则不做配置即可。
如果配置了ovo用户,则ovo用户上传的文件可以在网页端删除。
然后是hdfs-site.xml,这里要注意下,2NN的地址配置的是dfs.namenode.secondary.http-address
,是http,不是https,如果写错了,2NN将在启动集群的那个节点上运行,配置就无效了。
<configuration>
<!-- NameNode的web访问地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop101:9870</value>
</property>
<!-- 2NN的地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:9868</value>
</property>
</configuration>
接下来是yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定mr走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 配置ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
<!-- 环境变量的继承,据说是个bug,升级版的hadoop中不需要配置这个 -->
<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_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
还有mapred-site.xml
<configuration>
<!-- 让mapreduce程序运行在yarn上,让其受yarn调度 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
最后是workers,这个文件要注意,它配置的是集群内的主机域名,每一行结尾都不能有空格,也不允许有空行。
hadoop101
hadoop102
hadoop103
别忘了分发配置文件到集群内所有主机上。
4.2 初始化NameNode
第一次启动集群时,需要在NameNode所在机器上执行初始化命令,该命令会生成新的集群ID,如果在集群运行中执行初始化命令,会导致NameNode与DataNode的集群ID不一致,从而造成集群找不到以往数据的严重问题。如果集群运行中出现故障,需要重新初始化,则必须先停止NameNode与DataNode进程,并且删除所有机器的data与logs目录,然后再进行初始化。
初始化NameNode,注意,要在规划中namenode所在机器上执行,不可以在其他机器上执行。
[ovo@hadoop101 ~]$ hdfs namenode -format
4.3 启动集群
这里我将hadoop的启动用户修改为了ovo,我将hadoop的文件夹与data文件夹的权限都修改了,整个初始化过程较长,不截图和复制了,如果报错会直接输出在终端。
然后启动集群。注意,要用hadoop文件的所属用户去启动集群。同时,在任意一台机器上执行启动命令都可以,与NameNode的初始化过程不同。
[ovo@hadoop101 sbin]$ pwd
/opt/hadoop-3.1.3/sbin
[ovo@hadoop101 sbin]$ ./start-dfs.sh
Starting namenodes on [hadoop101]
Starting datanodes
Starting secondary namenodes [hadoop103]
启动集群过程中可能会报错,我在启动时就报了一个找不到JAVA_HOME环境变量的错误,但实际上我的主机都配置好了jdk环境变量,只是hadoop无法获取到,经过简单的搜索之后发现缺少了一个配置。
需要修改/opt/hadoop-3.1.3/etc/hadoop/hadoop-env.sh
文件中大约第54行,export JAVA_HOME=
后面的值,该行默认是注释掉的,而且等号后是空。将其取消注释,并改成你的JAVA_HOME的值。
启动hadoop集群后可以通过jps
命令查看到正在运行的hadoop进程。该命令使用-v
的参数可以查看java进程的全路径。
hadoop101
[ovo@hadoop101 sbin]$ jps
7479 NameNode
7630 DataNode
7854 Jps
hadoop102
[ovo@hadoop102 hdfs]$ jps
5349 DataNode
5400 Jps
hadoop103
[ovo@hadoop103 hdfs]$ jps
4486 DataNode
4583 SecondaryNameNode
4617 Jps
4.4 启动Yarn
接着需要启动yarn,注意,ResourceManager规划在哪台机器上,就要在哪台机器上执行启动yarn的命令,这与NameNode的初始化方式相同,都必须在特定的机器上执行。
[ovo@hadoop102 sbin]$ ./start-yarn.sh
Starting resourcemanager
Starting nodemanagers
[ovo@hadoop102 sbin]$ jps
6626 Jps
5349 DataNode
6185 ResourceManager
6314 NodeManager
使用jps命令查看其他节点的NodeManager是否启动。
4.5 可视化网页
启动后的NameNode和Yarn都是可以在web页面访问的,路径就是配置文件中配置的。
NameNode访问url:http://hadoop101:9870
Yarn的ResourceManager:http://hadoop102:8088
如下图:
4.6 hdfs的web页面
hdfs就是一个文件系统,你可以把他当做linux的文件系统那样去理解,他也包含文件和文件夹,也有对应的权限认证。
注意,之后的所有命令都要使用hadoop的安装用户去操作,hdfs的权限认证与linux的权限认证是有相关性的。
下面就是创建文件夹,并且上传小文件与大文件的示例。
#创建文件夹
[ovo@hadoop101 hadoop]$ hadoop fs -mkdir /temp_input
[ovo@hadoop101 hadoop]$
#查看文件夹内容
[ovo@hadoop101 hadoop]$ hadoop fs -ls /
Found 1 items
drwxr-xr-x - ovo supergroup 0 2021-11-22 14:55 /temp_input
[ovo@hadoop101 hadoop]$
#上传小文件
[ovo@hadoop101 hadoop]$ hadoop fs -put /tmp/Heaven.txt /temp_input
2021-11-22 15:07:36,918 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
[ovo@hadoop101 hadoop]$
[ovo@hadoop101 hadoop]$ hadoop fs -ls /temp_input
Found 1 items
-rw-r--r-- 3 ovo supergroup 80 2021-11-22 15:07 /temp_input/Heaven.txt
[ovo@hadoop101 hadoop]$
#上传大文件
[ovo@hadoop101 package]$ hadoop fs -put /opt/package/jdk-8u221-linux-x64.tar.gz /
2021-11-22 15:24:25,088 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2021-11-22 15:24:27,704 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
[ovo@hadoop101 package]$
上传后可以在web页面上查看到路径下都有什么文件。
4.7 hdfs的文件位置及yarn查看任务调度
现在我们知道了如何在web页面查看文件,但文件本身还是存储在服务器上的,如果想要查看文件的具体位置,则需要进到一下目录查看。
存储文件的具体位置就在core-site.xml中配置的数据存放路径下,但是真实文件存放的位置要更深一些。
[root@hadoop101 subdir0]# pwd
/data/hdfs/dfs/data/current/BP-428193404-192.168.163.101-1637543150736/current/finalized/subdir0/subdir0
[root@hadoop101 subdir0]#
[root@hadoop101 subdir0]# ls
blk_1073741825 blk_1073741825_1001.meta blk_1073741826 blk_1073741826_1002.meta blk_1073741827 blk_1073741827_1003.meta
可以查看一下blk_1073741825这个文件,会发现他就是我上传到集群中的文本。
[root@hadoop101 subdir0]# cat blk_1073741825
Heaven
Heaven does not exist.
Over.
ps.Elohim, the scientist from the planet?
而另外两个blk_1073741826和blk_1073741827其实就是上传jdk压缩包,甚至可以拼成一个tar.gz的压缩文件(拼凑的文件后缀必须和上传时相同),然后再解压都行。
[root@hadoop101 subdir0]# ls
blk_1073741825 blk_1073741825_1001.meta blk_1073741826 blk_1073741826_1002.meta blk_1073741827 blk_1073741827_1003.meta
[root@hadoop101 subdir0]#
[root@hadoop101 subdir0]# cat blk_1073741826 >> jdk.tar.gz
[root@hadoop101 subdir0]# cat blk_1073741827 >> jdk.tar.gz
[root@hadoop101 subdir0]# tar -zxf jdk.tar.gz
[root@hadoop101 subdir0]# ls
blk_1073741825 blk_1073741825_1001.meta blk_1073741826 blk_1073741826_1002.meta blk_1073741827 blk_1073741827_1003.meta jdk1.8.0_221 jdk.tar.gz
还记得之前yarn的web页面吗,目前只是上传和下载了文件,没有对文件进行操作,所以不会有任务,web页面上也不会有记录,此时再次执行一下wordcount的命令,统计一下词频。
这次执行命令时使用的是hdfs集群的方式,所以输入路径与输出路径都要写hdfs的路径。
[ovo@hadoop101 ~]$ hadoop jar /opt/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /temp_input /temp_output
执行成功后能看到输出路径下多了相应的文件与内容。
同时还可以在yarn的任务调度页面查看到这个任务。
这次页面上就有任务了,横向拉倒最后有个需要注意的地方。
上图的History是任务历史,这里暂时点不开,因为没有配置历史服务器。
4.8 集群崩溃处理办法
hadoop集群不论多少台机器,多少个DateNode,对于上传的数据默认都是存储三份做冗余,只要有一台机器上的数据与DataNode都完好无损,则集群可以对外提供服务。如果A机器DataNode完好,但数据损坏,而B机器数据完好但DataNode未在运行,则该文件不可下载。
但如果数据与DataNode全损,且数据不重要,只需要集群立刻恢复功能的话,则可以停止集群所有进程,先停止yarn,然后停止hdfs集群,再删除集群内所有机器上的,配置文件中配置的数据存储路径下的全部内容,以及HDAOOP_HOME路径中logs的文件夹,然后重新在NameNode节点上执行初始化命令,再启动hdfs集群和yarn。
这样这个集群就是全新的。
4.9 配置历史服务器
修改mapred-site.xml
<configuration>
<!-- 让mapreduce程序运行在yarn上,让其受yarn调度 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器配置 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web访问地址 -->
<property>
<name>mapreduce.jobhistory.wabapp.address</name>
<value>hadoop102:19888</value>
</property>
</configuration>
配置中下面的web访问地址才是我们在浏览器上输入的地址。然后重新启动yarn进程。
[ovo@hadoop102 hadoop]$ /opt/hadoop-3.1.3/sbin/stop-yarn.sh
Stopping nodemanagers
hadoop103: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
hadoop102: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
Stopping resourcemanager
[ovo@hadoop102 hadoop]$ /opt/hadoop-3.1.3/sbin/start-yarn.sh
Starting resourcemanager
Starting nodemanagers
启动后会发现并没有history相关的进程,是因为这个历史服务器的进程需要手动开启。
执行命令:
[ovo@hadoop102 hadoop]$ mapred --daemon start historyserver
[ovo@hadoop102 hadoop]$ jps
12128 NodeManager
12787 JobHistoryServer
10537 DataNode
11998 ResourceManager
12846 Jps
然后之前点不开的那个History的按钮就可以点开了,页面如下:
或者可以直接访问浏览器页面。http://hadoop102:19888/
4.10 配置日志聚合
如果想查看任务执行的日志,可以点击如下位置查看,但在没有配置日志聚集的情况下是无法在这里查看日志的。
为了查看任务执行过程,我们需要配置日志聚集,将分散在多个服务器上的日志收集到一起方便用户查看。
需要修改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>
<!-- 设置日志保留时间,单位秒 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
然后停止历史服务器,并重启yarn相关的所有进程。
[ovo@hadoop102 hadoop]$ mapred --daemon stop historyserver
[ovo@hadoop102 hadoop]$ /opt/hadoop-3.1.3/sbin/stop-yarn.sh
Stopping nodemanagers
hadoop102: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
Stopping resourcemanager
[ovo@hadoop102 hadoop]$ jps
14130 Jps
10537 DataNode
[ovo@hadoop102 hadoop]$ /opt/hadoop-3.1.3/sbin/start-yarn.sh
Starting resourcemanager
Starting nodemanagers
[ovo@hadoop102 hadoop]$ mapred --daemon start historyserver
旧任务的日志是没有了,但是配置好之后的新任务会有日志,所以再次执行一个wordcount的命令,让其产生一个新的任务,然后再查看。这个命令上面执行过两次了,就不演示了,直接放任务的日志。
四、小知识
1.块(block)
hadoop对数据的存储有个单位,叫做“块”(block),默认情况下一个block的大小是128M。
当存储的文件小于128M时,他占用的实际内存就是文件大小,他只用了一个块中的一部分。
当存储的文件大于128M时,他将先占用满一个block,剩余部分再继续占用另外一个块。
2.hadoop常用端口(均可自定义)
端口 | hadoop 2.X | hadoop 3.X |
---|---|---|
NameNode内部通讯端口 | 8020/9000 | 8020/9000/9820 |
NameNode Web页面端口 | 50070 | 9870 |
MapReduce查看任务执行端口 | 8088 | 8088 |
历史服务器通信端口 | 19888 | 19888 |
五、结语
hadoop的入门就到这里,简单的使用与搭建部署就算入门了,之后还会有对各个部分具体详细的文章,不过先让我把入门的这部分练习好,环境搭建和对配置文件的更改要多做多练习,不然忘得很快的。