情感测试
情感测试

您现在的位置: 情感测试简介_情感测试玩法 > 情感测试玩法 > 一起挑战极限Hadoop疯狂的技术体系全

一起挑战极限Hadoop疯狂的技术体系全

发布时间:2021-8-23 17:07:23   点击数:

往期经典:

企业数字化转型战略完整指南

战略笔记:数字化转型的生态建设指南

战略笔记:数字化转型中的低代码评估与决策指南

好,文章就这么简简单单、

清清爽爽的开始了

请开始这次旅行!

Hadoop是耳熟能详的卓越开源分布式文件存储及处理框架,

它能让用户轻松地开发处理海量数据的应用程序,其主要优点有:

Hadoop.0由HDFS、MapReduce和YARN三个系统组成,其中YARN是一个资源管理系统,负责集群资源管理和调度,.0中YAR允许每个节点(NodeManager)配置可用的CPU和内存资源总量,而中央调度器则会根据这些资源总量分配给应用程序。

HDFS

HDFS(HadoopDistributedFileSystem),Hadoop上的分布式文件系统,适合PB级大量数据的存储,扩展性强,容错性高(默认副本)。

如图所示HDFS是Master/Slave结构,有NameNode、SecondaryNameNode、DataNode这几个角色,理解其架构及工作原理需要弄清的概念:

NameNode:Master节点,管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;

SecondaryNameNode:分担namenode工作量;是NameNode的冷备份;合并fsimage和fsedits然后再发给namenode。

DataNode:Slave节点,负责存储client发来的数据块block;执行数据块的读写操作。

热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。

冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。

Fsimage:元数据镜像文件(文件系统的目录树。)

edits:元数据的操作日志(针对文件系统做的修改操作记录)

机架:HDFS集群由分布在多个机架上的大量DataNode组成,不同机架之间节点通过交换机通信,HDFS通过机架感知策略,使NameNode能够确定每个DataNode所属的机架ID,使用副本存放策略,来改进数据的可靠性、可用性和网络带宽的利用率。

数据块(block):HDFS最基本存储单元,默认18M,用户可自行设置。

元数据:指HDFS文件系统中,文件和目录的属性信息。HDFS实现时采用镜像文件(Fsimage)+日志文件(EditLog)的备份机制。

1)文件的镜像文件中内容包括:修改时间、访问时间、数据块大小、组成文件的数据块的存储位置信息。

)目录的镜像文件内容包括:修改时间、访问控制权限等信息。

)日志文件记录的是:HDFS的更新操作。NameNode启动的时候,会将镜像文件和日志文件的内容在内存中合并。把内存中的元数据更新到最新状态。

HDFS读文件

1)客户端显式调用open()函数打开文件。

)后台通过RPC调用NN服务,获取欲打开文件的文件块信息和文件所在的数据节点。

)客户端显式调用read()函数,从第一个数据块开始读取数据,并选择离客户端最近的那个副本。

4)选择离客户端最近的副本后,客户端直接从DN读取数据。

5)当前数据块读完后继续连接此文件下一个数据块最近副本所在的DN。

6)读完数据时,客户端显式调用close()函数。相对于读取本地文件系统数据,HDFS读取数据流程较复杂,但对客户端而言,需显式调用的函数仅为open()、read()和close(),与读取本地文件系统数据的方法基本相同。

HDFS写文件

1)客户端调用create()来创建文件。

)后台通过RPC调用NN服务,在文件系统的命名空间中创建新文件。

)客户端开始写入数据。先将数据写到本地临时文件中,当累积到1个数据块大小时,客户端会从NN获取1个DN列表,同时后台会将该文件块切分成多个数据包(packet)。

4)每个packet以流水线方式写入到NN返回的DN。

5)最后一个DN针对每个packet,朝着写入流水线的反方向返回ACK,确认packet成功写入所有DN。

6)客户端调用close()函数关闭文件,剩余所有数据将写入DN,并关闭与DN的连接。

7)通知NN写入完毕。

Mapreduce

MapReduce非常简单,易于实现且扩展性强。可以通过它轻易地编写出同时在多台主机上运行的程序,可以使用Ruby、Python、PHP和C++等非Java类语言编写map和reduce程序。MapReduce适合于处理大量的数据集,因为它会同时被多台主机一起处理,这样通常会有较快的速度。

Hadoop中数据处理核心是MapReduce程序设计模型。一个Map/Reduce作业(job)通常会把输入的数据集切分为若干数据块,对于独立的数据块,由map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序,然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。因此,编程主要是mapper阶段和reducer阶段。

图.MapReduce控制流和数据流

图.MapReduce数据流

单词计数

计算出文件中各个单词的频数。输出结果按照单词的字母顺序进行排序。

数据去重

file1.txt

file.txt

MapReduce去重后的结果

-1-9a

-1-9b

-1-9a

-1-10b

-1-10a

-1-9b

-1-11c

-1-11b

-1-10a

-1-1d

-1-1d

-1-10b

-1-1a

-1-1a

-1-11b

-1-14b

-1-14c

-1-11c

-1-15c

-1-15d

-1-1d

-1-11c

-1-11c

-1-1a

-1-14b

-1-14c

-1-15c

reduce的输入应该以数据作为key,而对value-list则没有要求。当reduce接收到一个key,value-list时就直接将key复制到输出的key中,并将value设置成空值。

所以map阶段要完成的任务就是在采用Hadoop默认的作业输入方式之后,将value设置成key,并直接输出(这里输出中的value为空值)。

单表关联

输入数据

输出数据

child

parent

grandchild

grandparent

Tom

Lucy

Tom

Jesse

Tom

Jack

Tom

Alice

Jone

Lucy

Jone

Jesse

Jone

Jack

Jone

Alice

Lucy

Mary

Jone

Ben

Lucy

Ben

Jone

Mary

Jack

Alice

Tom

Ben

Jack

Jesse

Tom

Mary

Terry

Alice

Philip

Alice

Terry

Jesse

Philip

Jesse

Philip

Terry

Mark

Alice

Philip

Alma

Mark

Jesse

Mark

Terry

需求:根据child和parent关系找到相应的祖孙关系

Mark

Alma

眼睛是不是已经花了?

看表结构就好了,不必纠结具体符号了

在Map阶段,将父子关系与相反的子父关系,同时在各个value前补上前缀-与+标识此key-value中的value是正序还是逆序产生的,之后进入context。MapReduce会自动将同一个key的不同的value值,组合在一起,推到Reduce阶段。在value数组中,根据前缀,我们可以轻松得知,哪个是grandparent,哪个是child。

多表关联

输入数据

输出数据

table1

table

id

name

id

statyear

num

key

value

1

北京

1

1

北京

天津

1

1

北京

河北

天津

4

山西

天津

5

内蒙古

4

4

山西59

6

辽宁

4

59

4

山西

7

吉林

9

0

需求:就是以id为key做join操作

8

黑龙江

9

47

在Map阶段,把所有数据标记成key,value的形式,其中key是id,value则根据来源不同取不同的形式:来源于A的记录,value的值为"a#"+name;来源于B的记录,value的值为"b#"+score。

在reduce阶段,先把每个key下的value列表拆分为分别来自表A和表B的两部分,分别放入两个向量中。然后遍历两个向量做笛卡尔积,形成一条条最终的结果。

Hadoop流

Hadoop流提供给了API允许用户使用任何脚本语言编写map函数或reduce函数。Hadoop流的关键是,它使用UNIX标准流作为程序与Hadoop之间的接口。

因此,任何程序只要可以从标准输入流中读取数据,并且可以写入数据到标准输出流,那么就可以通过Hadoop流使用其他语言编写MapReduce程序的map函数或reduce函数。

bin/Hadoopjarcontrib/streaming/Hadoop-0.0.-streaming.jar–inputinput–outputoutput–mapper/bin/cat–reducerusr/bin/wc

从这个例子中可以看到,Hadoop流引入的包是Hadoop-0.0.-streaming.jar,并且具有如下命令:

-input指明输入文件路径

-output指明输出文件路径

-mapper制定map函数

-reducer指定reduce函数

Hadoop流的工作原理

当一个可执行文件作mapper时,每一个map任务会以一个独立的进程启动这个可执行文件,然后在map任务运行时,会把输入切分成行提供给可执行文件,并作为它的标准输入(stdin)内容。

当可执行文件运行出结果时,map从标准输出(stdout)中收集数据,并将其转化为key,value对,作为map输出。

reduce与map相同,如果可执行文件作为reducer时,reduce任务会启动这个可执行文件,并且将key,value转化为行来作为这个可执行文件的标准输入(stdin)。

然后reduce会收集这个可执行文件的标准输出(stdout)内容,并把每一行转化为key,value对,作为reduce输出。

map与reduce将输出转化为key,value的默认方法是,将每行的第一个tab符号(制表符)之前的内容作为key,之后的内容作为value。如果没有tab符号,那么这一行的所有内容作为key,而value值为null,可以更改。

Hadoop流的命令

Hadoop流命令的具体内容如下表所示:

参数

可选/必选

参数解释

-inputpath

必选

输入数据路径。指定作业输入,path可以是文件或者目录,可以使用*通配符,-input选项可以使用多次指定多个文件或目录作为输入。

-outputpath

必选

输出数据路径。指定作业输出目录,path必须不存在,而且执行作业的用户必须有创建该目录的权限,-output只能使用一次。

-mapper

必选

mapper可执行程序或Java类,必须指定且唯一。

-reducer

必选

reducer可执行程序或Java类,必须指定且唯一。

-filefile

可选

分发本地文件

-cacheFilefile

可选

分发HDFS文件

-cacheArchivefile

可选

分发HDFS压缩文件

-numReduceTasksnum

可选

指定reduce任务个数。如果设置-numReduceTasks0或者-reducerNONE则没有reducer程序,mapper的输出直接作为整个作业的输出。

-jobconf

-DNAME=VALUE

可选

作业配置参数。指定作业参数,NAME是参数名,VALUE是参数值,可以指定的参数参考hadoop-default.xml。特别建议用-jobconfmapred.job.name=MyJobName设置作业名,使用-jobconfmapred.job.priority=VERY_HIGH

HIGH

NORMAL

LOW

VERY_LOW设置作业优先级,使用-jobconfmapred.job.map.capacity=M设置同时最多运行M个map任务,使用-jobconfmapred.job.reduce.capacity=N设置同时最多运行N个reduce任务。

-

转载请注明:http://www.zmax-alibaba.com/qgwf/138036.html

网站简介 | 发布优势 | 服务条款 | 隐私保护 | 广告合作 | 合作伙伴 | 版权申明 | 网站地图

当前时间: