欢迎投稿

今日深度:

Hadoop,

Hadoop,


一.Hadoop
1.Hadoop是一个能够对大量数据进行分布式处理的软件框架。可以快速处理大量数据,可以存储大量数据,可以对大量数据进行分析
3.主要包括以下核心组件
HDFS: 分布式文件存储
YARN: 分布式资源管理
MapReduce: 分布式计算
Common: 为其他模块提供基础设施

二.常用组件
1.Hive 数据仓库系统
它以hdfs作为存储,依赖于数据库(mysql或oracle)存储表schema信息,并完成基于sql自动解析,创建mapreduce任务
2.Flume:日志收集
一种分布式、可靠的、可用的服务,其用于高效搜集、汇总、移动大量日志数据
3.Mahout[məˈhaʊt]:算法集
一种基于Hadoop的机器学习和数据挖掘的分布式计算框架算法集,实现了多重MapReduce模式的数据挖掘算法。
4.Storm:
一个分布式、容错的实时计算系统。
5.Hbase:分布式数据库
一种分布式、可伸缩的、大数据库存储库,支持随机、实施读/写访问。

三.HDFS 分布式文件存储系统
1.数据块
文件被分成一个个块存储到不同的机器上,默认大小为128M,块会被复制备份到多个不同的机器上,默认复制3份
2.NameNode
负责文件元数据的管理,运行时所有的数据都保存到内存,HDFS可以存储的文件大小取决于NameNode的内存大小,每个块在NameNode里面都会有一条记录
3.DataNode
保存具体的block数据,以及数据元信息,负责数据的读写操作和复制操作,DataNode启动时会向NameNode报告当前存储的数据块信息,后续也会定时报告修改信息,DataNode之间会进行通信,复制数据块,保证数据的冗余性
4.写文件
1).客户端将文件写入本地磁盘的临时文件中
2).当临时文件大小达到一个block大小时,HDFS client通知NameNode,申请写入文件
3).NameNode在HDFS的文件系统中创建一个文件,并把该block id和要写入的DataNode的列表返回给HDFS客户端
4).HDFS客户端收到这些信息后,将临时文件写入DataNodes
4.1 客户端将文件内容写入第一个DataNode(一般以4kb为单位进行传输)
4.2 第一个DataNode接收后,将数据写入本地磁盘,同时也传输给第二个DataNode
4.3 依此类推到最后一个DataNode,数据在DataNode之间是通过pipeline的方式进行复制的
4.4 后面的DataNode接收完数据后,都会发送一个确认给前一个DataNode,最终第一个DataNode返回确认给客户端
4.5 当客户端接收到整个block的确认后,会向NameNode发送一个最终的确认信息
4.6 如果写入某个DataNode失败,数据会继续写入其他的DataNode。然后NameNode会找另外一个好的DataNode继续复制,以保证冗余性
4.7 每个block都会有一个校验码,并存放到独立的文件中,以便读的时候来验证其完整性
5).文件写完后(客户端关闭),NameNode提交文件
5.读文件
[1]客户端向NameNode发送读取请求
[2]NameNode返回文件的所有block和这些block所在的DataNodes(包括复制节点)
[3]客户端直接从DataNode中读取数据,如果该DataNode读取失败(DataNode失效或校验码不对),则从复制节点中读取(如果读取的数据就在本机,则直接读取,否则通过网络读取)
6.可靠性
[1]DataNode会定时发送心跳到NameNode。如果在一段时间内NameNode没有收到DataNode的心跳消息,则认为其失效。此时NameNode就会将该节点的数据(从该节点的复制节点中获取)复制到另外的DataNode中
[2]无论是写入时还是硬盘本身的问题,只要数据有问题(读取时通过校验码来检测),都可以通过其他的复制节点读取,同时还会再复制一份到健康的节点中

四.YARN 分布式资源管理系统
1.基本概念
ResourceManager: 全局资源管理和任务调度
NodeManager: 单个节点的资源管理和监控
ApplicationMaster: 单个作业的资源管理和任务监控
Container: 资源申请的单位和任务运行的容器
2.YARN运行流程
当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:第一个阶段是启动ApplicationMaster;第二个阶段是由ApplicationMaster创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。
步骤1 用户向YARN中提交应用程序。
步骤2 ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信启动应用程序的ApplicationMaster。
步骤3 ApplicationMaster首先向ResourceManager注册以便直接通过ResourceManage查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
步骤4 ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
步骤5 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。
步骤6 NodeManager为任务设置好运行环境后,将任务启动命令写到一个脚本中,通过运行该脚本启动任务。
步骤7 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
步骤8 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。

五.MapReduce 分布式计算框架
Input:数据输入以及数据分片,定义如何从HDFS等存储系统中输入数据
Map:对每个数据片进行数据处理,并将处理后的数据按照业务代码规则输出
Shuffle:对Map的输出数据进行排序、分组等操作,供Reduce获取
Reduce:获取Map的输出数据,将获取的数据合并聚合,并将聚合结果输出
Output:定义如何将Reduce的输出值输出到HDFS等存储系统中

六.Hadoop IO
输入文件从HDFS进行读取.
输出文件会存入本地磁盘.
Reducer和Mapper间的网络I/O,从Mapper节点得到Reducer的检索文件.
使用Reducer实例从本地磁盘回读数据.
Reducer输出- 回传到HDFS

七.Spark
1.Spark在MapReduce基础上发展起来的计算框架,有以下优点
[1]Spark把中间数据放到内存中,迭代运算效率高。MapReduce中计算结果需要落地,保存到磁盘上,而Spark支持DAG图的分布式并行计算的编程框架,减少了迭代过程中数据的落地,提高了处理效率。
[2]Spark容错性高。Spark引进了RDD ,如果数据集一部分丢失,充许基于数据衍生过程对它们进行重建。另外在RDD计算时可以通过CheckPoint来实现容错
[3]Spark更加通用。不像Hadoop只提供了Map和Reduce两种操作,Spark提供的数据集操作类型有很多种,大致分为:Transformations和Actions两大类。Transformations包括Map、Filter、FlatMap、Sample、GroupByKey、ReduceByKey、Union、Join、Cogroup、MapValues、Sort和PartionBy等多种操作类型,同时还提供Count, Actions包括Collect、Reduce、Lookup和Save等操作2…Yarn-client 2.Driver运行在本地的客户端上
[1].client向ResouceManager申请启动ApplicationMaster,同时在SparkContext初始化中创建DAGScheduler和TaskScheduler
[2].ResouceManager收到请求后,在一台NodeManager中启动第一个Container运行ApplicationMaster
[3].Dirver中的SparkContext初始化完成后与ApplicationMaster建立通讯,ApplicationMaster向ResourceManager申请Application的资源
[4].一旦ApplicationMaster申请到资源,便与之对应的NodeManager通讯,启动Executor,并把Executor信息反向注册给Dirver
[5].Dirver分发task,并监控Executor的运行状态,负责重试失败的task
[6].运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己
3.spark核心组件
[1]Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的
[2]Spark SQL:提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。
[3]Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据
[4]MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
4.spark最常见运行模式
Hadoop Yarn集群运行在Yarn资源管理器上,资源管理交给YARN,Spark只负责进行任务调度和计算
6.spark里面的基本概念
ClusterManager:在Standalone模式中即为Master节点(主节点),控制整个集群,监控Worker.在YARN中为ResourceManager
Worker:从节点,负责控制计算节点,启动Executor或Driver。在YARN模式中为NodeManager,负责计算节点的控制。
Driver:运行Application的main()函数并创建SparkContect。
Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executor。
SparkContext:整个应用的上下文,控制应用的生命周期。
RDD:Spark的计算单元,一组RDD可形成执行的有向无环图RDD Graph。
TaskScheduler:将任务(Task)分发给Executor。
Task: 被送到某个Executor上的工作单元,调度和管理等是由TaskScheduler负责
Job: 包含多个Task组成的并行计算,往往由Spark Action触发生成, 一个Application中往往会产生多个Job
Stage: 每个Job会被拆分成多组Task, 作为一个TaskSet, 其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,
DAGScheduler: 根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TASkScheduler。 其划分Stage的依据是RDD之间的依赖的关系找出开销最小的调度方法
7.在本地开发环境运行spark程序的时候,因为必须使用spark相关的内容,所以需要将spark相关的jar文件添加到项目的classpath环境变量中。这个操作通过环境变量来进行控制给定,也就是通过环境变量中的SPARK_HOME。setMaster: 在本地环境运行必须给定,表示我的应用程序运行在哪个地方
8.提交到yarn上运行:
首先启动hdfs以及yarn的相关服务
再进入spark的根目录,将要运行的程序拷贝到根目录
最后执行下列命令
./bin/spark-submit
–master yarn
./spark_core_word_count_with_yarn.py(要运行的程序名)
9.spark编程流程
[1]设置spark配置信息sparkconf,通过配置创建sparkcontext上下文
[2]读取数据形成RDD(本地运行则在本地文件夹下读取,Yarn运行则从HDFS里面读取)
[3]根据业务需求对RDD根据相应的API进行处理
[4]结果输出(本地运行保存在本地文件,Yarn运行保存在HDFS里面)
[5]关闭上下文

八.RDD弹性(表示数据可以保存在磁盘,也可保存在内存)分布式数据集
1.可以简单看成是一个数组。和普通数组的区别是,RDD中的数据是分区存储的,这样不同分区的数据就可以分布在不同的机器上,同时可以被并行处理。因此,Spark应用程序所做的就是把需要处理的数据转换为RDD,然后对RDD进行一系列的变换和操作从而得到结果
2.针对RDD数据的操作/函数有两种类型:转换(transformation)和动作(action)。
transformation类型:从一个RDD转化到另一个RDD的函数。
action类型:数据执行部分。
3.特点
[1]每个RDD都有一个分片列表,每个分片都会被一个计算任务处理
[2]RDD的计算是以分片为单位的
[3]RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算
[4]分片函数
[5]存储每个分片的优先位置的列表
Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置
4.RDD的运行流程
[1]创建RDD对象;
[2]SparkContext负责计算RDD之间的依赖关系,构建DAG;
[3]DAGScheduler负责把DAG图分解成多个阶段,每个阶段中包含了多个任务,每个任务会被任务调度器分发给各个工作节点(Worker Node)上的Executor去执行
5.惰性调用
RDD采用了惰性调用,即在RDD的执行过程中,真正的计算发生在RDD的“行动”操作,对于“行动”之前的所有“转换”操作,Spark只是记录下“转换”操作应用的一些基础数据集以及RDD生成的轨迹,即相互之间的依赖关系,而不会触发真正的计算,防止每次执行action需要重头开始计算可以使用cache,将RDD进行缓存
6.RDD中的依赖关系
[1]窄依赖:父RDD与子RDD的分片关系是一对一。窄依赖典型的操作包括map、filter、union等
[2]宽依赖:父RDD与子RDD的分片关系是一对多,宽依赖典型的操作包括groupByKey、sortByKey等
7.阶段的划分
Spark通过分析各个RDD的依赖关系生成了DAG,再通过分析各个RDD中的分区之间的依赖关系来决定如何划分阶段。具体做法为:在DAG中进行反向解析,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到当前的阶段中;将窄依赖尽量划分在同一个阶段中,可以实现流水线计算
8.RDD常见API
[1]parallelize 将数组中的元素转化为RDD,并存储在分区上
[2]sc.textFile 通过本地文件或HDFS创建,以行为单位读取数据,转化为RDD
[3]aggrate 聚合函数 第一个函数作用于各个分区,第二个函数用于各个分区结果的聚合
[4]aggregateByKey 先在每个分区里面按照key对value进行聚合,最后每个分区聚合时也按照key进行合并
[5]collect()函数将这个RDD对象转化为了一个List列表。
[6]glom()函数就是要显示出RDD对象的分区情况
[7]map 通过对这个RDD的每个元素应用一个函数来返回一个新的RDD
[8]reduce将RDD中元素前两个传给输入函数,产生一个新的return值,新产生的return值与RDD中下一个元素(第三个元素)组成两个元素,再被传给输入函数,直到最后只有一个值为止
[9]union()求两个RDD的并集,不去重
[10]intersection()求两个RDD的交集
[11]filter()过滤
[12]distinct 去重
[13]reducebykey 接受函数参数,会先在本地根据key进行聚合,然后再将聚合函数作用于分区之间
[14]groupbykey 不接受函数参数,本地无法聚合,只能将所有的键值对都移动到一起再进行计算,导致节点之间的开销大
[15]join 两个键值对的RDD按照键进行连接
[16]flatmap() 与map相似,但是返回的元素数量不一定和原来的RDD一致

www.htsjk.Com true http://www.htsjk.com/Hadoop/38557.html NewsArticle Hadoop, 一.Hadoop 1.Hadoop是一个能够对大量数据进行分布式处理的软件框架。可以快速处理大量数据,可以存储大量数据,可以对大量数据进行分析 3.主要包括以下核心组件 HDFS: 分布式文...
相关文章
    暂无相关文章
评论暂时关闭