赞
踩
目录
HDFS(Hadoop Distribute File System)
Hadoop(英译: 大数据分析/云计算/分布式计算) 框架图,借助Hadoop框架及云计算核心技术MapReduce来实现数据的计算和存储,并且将HDFS分布式文件系统和HBASE分布式数据库很好地融入到云计算框架中,从而实现了云计算的分布式、并行计算和存储,并且得以实现很好的处理大规模数据的能力。
逻辑上来看,Hadoop系统的基本组成架构包含两个部分:分布式存储和并行计算。
为了实现Hadoop设计的本地化计算,数据节点DN和计算节点TaskTracker应放在同个节点,每个从节点也的DN和TaskTracker也应放在同个服务器,从而让每个Tracker尽量处理存储在本地DataNode上的数据。
数据主控节点NN与作业执行节点JobTracker可以设置在同一个节点,也可以考虑负载较高时分散两个节点。
HDFS(Hadoop Distribute File System Hadoop 分布式文件系统) 是一个分布式文件系统。HDFS具有容错性、可伸缩和易扩展等优点。
其如下:
1)HDFS适合存储大量文件(PB、EB级别);
2)支持流式文件访问文件一次写入多次读取,支持追加操作但已写入的数据不支持更改;
3)对硬件要求不高,相对廉价的商用硬件即可实现HDFS存储,当系统中某几台服务器故障时系统仍可用并且能保持数据完整。
总的来说,HDFS是一个分布式存储的Hadoop应用程序,他提供了更接近数据的接口。
HDFS架构包含NameNode(NN)、DataNode(DN)和SecondaryNameNode(SNN)三个节点信息。属于主从架构模型。另外还有HdfsClient作为客户端与NN通信,并提供一些接近数据的手段如API、shell命令。
分而治之。
为各类分布式运算框架如 Hadoop MapReduce、Spark、Tez、Flink等,提供数据存储服务。
NameNode工作机制
职责
元数据存储形式
自最后一次监察点之前HDFS文件系统中所有目录和文件的序列化信息。
checkpoint
4.chechpoint 配置如下
dfs.namenode.checkpoint.check.period=60 #检查触发条件是否满足的频率,60秒 dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary #以上两个参数做checkpoint操作时,secondary namenode的本地工作目录 dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir} dfs.namenode.checkpoint.max-retries=3 #最大重试次数 dfs.namenode.checkpoint.period=3600 #两次checkpoint之间的时间间隔3600秒 dfs.namenode.checkpoint.txns=1000000 #两次checkpoint之间最大的操作记录
优点:
ps:
缺点:
Apache YARN(Yet Another Resource Negotiator,另一种资源协调者), Hadoop 的资源管理器。
从Hadoop2.x引入,最初为了改产MR的实现,但是它具有通用性,可以同时执行其他分布式计算框架 。
一个全局的资源管理器ResourceManager和每个应用对应的ApplicationMaster,ResourceManage和NodeManager组成全新的通用系统,以分布式的方式管理应用程序。
Yarn整体上属于主/从架构,三个核心组件(下述 1)2)3)为三个核心组件,4)5)为更细粒度的角色)来实现功能。
1)ResourceManager(RM) 集群资源控制者 。
2)NodeManager (NM) 管理节点上的用户作业和工作流。
3)ApplicationMaster (AM) 用户作业生命周期管理者。
4)Container 容器
5)Client 客户端
简述流程:
Client --> 发送请求 --> RM接收请求 --> 指定任意一个NM启动一个AM --> AM确认作业,拆解Task,准备Container资源清单 --> RM分配资源 --> NM创建资源(Containers),运行Task --> Task运行完毕通知AM --> AM向RM申请注销资源,释放容器空间
MapReduce2.x 采用分而治之的思想。将HDFS海量数据切分成若干块,将每个块的数据分给集群上的节点并行计算。然后整合各节点的中间结果,得到最终结果。
1)Map和Reduce函数。这两个函数定义了 任务本身。
2)MR整体执行过程,下图是整个MR执行时各角色的职责体现。如下图:
3)作业执行流程
总体上分三阶段:准备(PREP)、运行(RUNNING)、结束(FINISHED);并且在各个状态下,作业有可能被主动杀死,进入到KILLED状态或执行中遇到失败,进入FAILED状态。
4)任务执行流程
任务时MR框架并行计算的基本单位,任务是一个逻辑概念,在MR的实现中,分布于JobTracker和TaskTracker上,对应TaskInProgress和TaskTracker.TaskInProgress对象。
5)组件和组件的执行流程
执行MR时涉及到的组件有10种,流程如下图:
基础类之一,是一个抽象类,描述了MapReduce作业数据的输入形式和格式。InputFormat可以验证作业数据的输入形式和格式;将输入数据分割为若干个逻辑意义上的InputSplits;提供一个RecordReader。
hadoop提供了功能丰富的InputFormat类,实现从特定数据源或特殊目的的输入要求。常用的有:TextInputFormat、KeyValueInputFormat、NLineInputFormat、CombineFileInputFormat、SequenceFileInputFormat、DBInputFormat等等。
基础类之一。一个InputSplit将单独作为一个Mapper的输入,有多少个InputSplit就有多少个Mapper。用户无法自主选定InputSplit的类型,而是在选择某个InputFormat后就决定了对应的InputSplit。InputSplit默认将文件分为64MB的大小,hadoop-site.xml中的mapred.min.split.size参数控制这个大小。
InputSplit定义了一项工作的大小,但是没有定义如何读取数据 。RecordReader即是负责从数据分块中读取数据记录转化为键值对的类。它将数据输出到Mapper类中 。
每个Mapper对象会生成一个java进程。程序员继承此类,用于实现Map任务。
用于合并相同key的键值对,减少partitioner时候的数据通信开销。
为了避免在Reduce计算过程中不同Reduce节点间存在相关性,需要一个Partition过程。
传输到每一个节点上的所有的Reduce函数接收到得Key,value对会被Hadoop自动排序;
程序员继承此类,用于执行Reduce任务。
它是用于描述MapReduce作业的数据输出格式和规范的抽象类。写入到HDFS的所有OutputFormat都继承自FileOutputFormat 。其中常用的OutputFormat有:TextOutFormat、SequenceOutFormat、NullOutFormat、DBOutFormat等,太多。
对于一个文件输出格式,都需要一个对应的数据记录输出RecordWriter,以便系统明确输出结果写入到文件中的具体格式。如TextOutputFormat实现了默认的LineRecordWriter,以“key/value”的形式输出一行结果。
HBase(英译:数据仓库)是一个提供高可靠性、高性能、可伸缩、实施读写、面向列(面向列族)的分布式数据库,一般采用HDFS作为其底层数据存储。HBase是针对谷歌BigTable的开源实现,二者都采用了相同的数据模型,具有强大的存储能力。HBase与RDBMS的一个重要区别是,前者采用基于列的存储,而后者采用基于行的存储。HBase具有良好的横向扩展力,可以通过不断增加廉价的商用服务器来增加存储能力。
HBase不是关系型数据库,他是NoSQL数据库的一个典型代表,并不支持SQL查询,它所使用的是基于键值的一种特殊语法,也可以成为HQL。
数据被存放在带有标签的表中,表由行和列组成,行和列交叉确定一个单元格,单元格有版本号,版本号为数据插入该单元格时的时间戳。单元格的内容没有数据类型,所有数据均被视为未解释的字节数组。
表中每一行有一个行键(也是字节数组,任何形式的数据都可以表示成字符串,比如数据结构进行序列化之后),整个表根据行键的字节序来排序,所有对表的访问必须通过行键。
表中的列又划分为多个列族(column family),同一个列族的所有成员具有相同的前缀,具体的列由列修饰符标识,因此,列族和列修饰符合起来才可以标识某一列,例如 info:format、contents:image。
在创建表时,列族必须作为模式定义的一部分预先给出,而列族是支持动态扩展的,也就是列族成员可以随后按需加入。物理上,所有列族成员一起存放在文件系统上,所以实际上说HBase是面向列的数据库,更准确地应该是面向列族,调优和存储都是在这个列族层次上进行的。一般情况下,同一个列族的成员最后具有相同的访问模式和大小特征。
总结来说,HBase表和熟知的RDBMS(关系型数据库)很像,不同之处在于:行按行键排序,列划分为列族,单元格以时间戳作为版本号,没有数据类型。
HBase中根据行键、列族、列限定符和时间戳来确定一个单元格。因此,可以视为一个“四维坐标”,即[行键、列族、列表标识符、时间戳]。
以上图的HBase表为例,其数据坐标举例如下:
键 | 值 |
[“201505003”, “Info”, “email”, 1174184619081] | “xie@qq.com” |
[“201505003”, “Info”, “email”, 1174184620720] | “you@163.com” |
HBase自动把表水平划分为区域(Region),每个区域都偶遇若干连续行构成,一个区域由所属的表、起始行、终止行(不包括这行)三个要素表示。
一开始,一个表只有一个区域,但是随数据量扩增,区域逐渐变大。直到超出设定的阈值大小,就会在某行的边界上进行拆分,分成两个大小基本相同的区域。然后随着数据的继续增加,区域就不断地增加,如果超出单台服务器的容量,就可以把一些区域放到其他节点上去,构成一个集群。
总结来说 ,集群中的每个节点(Region Server)管理整个表的若干个区域。所以,可以这么理解:区域是HBase集群上分布数据的最小单位。
Hive(英译:蜂巢)是基于Hadoop的一个数据仓库工具,可以将结构化的数据映射为一张数据表,并提供类SQL查询功能。
Hive是对MapReduce的一个封装,底层就是MR程序。
Hive没有服务端,它本质上是Hadoop或者说是HDFS的一个客户端,对HDFS的数据和Meta store的元数据进行操作。
主要用于时效性不高的海量数据的处理,对于数据量不大反而没有优势,主要用在数据仓库上。
Hive是基于Hadoop来工作的。它处理的数据实际存放在HDFS中;分析数据的底层实现还是MapReduce程序;调度资源时,用的是Yarn框架;并且,在服务器中运行Hive之前需要启动HDFS和YARN。
工作流程(见下图):
1)实现将常用SQL操作封装成MR模板存放于Hive中。
2)Client依据实际需求写SQL语句,匹配对应的MR模板,然后运行对应的MR程序。
3)生成响应的分析结果,返回给Client。
优点:
缺点:
Apache Pig是一个高级过程语言,可以通过Pig编写的脚本,转换成Hadoop的MapReduce任务,简化的Hadoop的操作。
Pig是Hadoop数据操作的一个客户端、一个数据分析引擎,采用了一定的语法操作HDFS中的数据。它的语言风格比较像Shell脚本,可以嵌入Hadoop的JAVA程序中,从而简化开发。
Pig所编写的脚本叫Pig Latin,PigLatin语句被Pig引擎翻译成MapReduce程序,可完成排序、过滤、求和、分组、关联等操作,支持自定义函数。
Mahout(英译:机器学习库)是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括被称为Taste的分布式协同过滤的实现、分类、聚类等。
ZooKeeper(英译:动物园管理员)一套高吞吐的分布式协调系统。主要解决分布式应用经常遇到的数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
(Zookeeper 作为 Hadoop 项目中的一个子项目,是 Hadoop 集群管理的一个必不可少的模块,它主要用来控制集群中的数据,如它管理 Hadoop 集群中的 NameNode,还有 Hbase 中 Master Election、Server 之间状态同步等。)
Sqoop(发音 skup),一款开源的工具。主要用于Hadoop(Hive)和传统数据库间进行数据的传递,可以将一个关系型数据库(如 Mysql、Oracle、Pg等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库。
一种关系型数据库 ⇒ hbase,hive ⇒ 另外一种关系型数据库
利用MR加快数据传输速度。也就是说Sqoop的导入和导出功能是通过MapReduce作业实现的。
所以它是一种批处理方式进行数据传输,难以实现实时的数据进行导入导出。
Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应、管理和监控。Ambari已支持大多数Hadoop组件、包括HDFS、MapReduce、Hive、Pig、Zookeeper、Sqoop、Hcatalog等
优点:
缺点:
Flume(英译:水槽)是Cloudera提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时Flume提供对数据的简单处理,并写到各种数据接受方的能力。
优点:
缺点:
Impala可以对Hadoop中大多数格式的文件进行查询。它能通过create table和insert的方式将一部分格式的数据加载到table中,但值得注意的是,有一些格式的数据它是无法写入的(write to)。对于Impala无法写入的数据格式,我们只能通过Hive建表,通过Hive进行数据的写入,然后使用Impala来对这些保存好的数据执行查询操作。
Spark(英译:火花)是一种快速、通用、可扩展的大数据分析引擎。是UC Berkeley AMP lab(加州大学博客利分校AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,专门用于大规模数据的迭代式计算,是为了跟Hadoop配合而开发出来的,不是为了取代Hadoop。
Spark是基于内存计算的大数据并行计算框架。除了扩展了广泛使用的MR计算模型,而且高效地支持更多计算模式,包括交互式查询和流处理。Spark适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理。
数据科学应用和数据处理应用,所以相对应的产生了对应的两种研究人群:数据科学家和工程师。
优点:
缺点:
Apache Flink是一个开源的分布式、高性能、高可用、准确的流处理框架,主要由Java代码实现,支持实时流(stream)处理和批(batch)处理,批数据只是流数据的一个极限的特例。原生支持了迭代管理、内存计算和程序优化。
Flink在实现流处理和批处理时,与传统的一些方案完全不同,它从另一个视角看待流处理和批处理,将二者统一起来:Flink是完全支持流处理,也就是说作为流处理看待时输入数据流是无界的;批处理被作为一种特殊的流处理,只是它的输入数据流被定义为有界的。
优点:
Storm是一个分布式、高容错的实时计算系统,对数据实时计算提供了简单的spout和bolt原语。
低延时、无穷数据、持续计算。例如 屏蔽词。
优点:
Hadoop Streaming是 Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或脚本文件作为Mapper和 Reducer,例如:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
-input /user/test/input \
-output /user/test/output \
-mapper “myMapper.sh” \
-reducer “myReducer.sh”
-input等都为该命令的参数。|
mapper 和 reducer 会从标准输入中读取用户数据,一行一行处理后发送给标准输出。 Streaming 工具会创建MapReduce 作业,发送给各个 tasktracker ,同时监控整个作业的执行过程。
Hadoop为MapReduce提供了不同的API,可以方便我们使用不同的编程语言来使用MapReduce框架,而不是只局限于Java。这里要介绍的就是Hadoop streaming API。Hadoop streaming 使用Unix的standard streams作为我们mapreduce程序和MapReduce框架之间的接口。所以你可以用任何语言来编写MapReduce程序,只要该语言可以往standard input/output上进行读写。
Streamming是天然适用于文字处理的(text processing),当然,也仅适用纯文本的处理,对于需要对象和序列化的场景,hadoop streaming无能为力。它力图使我们能够快捷的通过各种脚本语言,快速的处理大量的文本文件。
使用下面的命令运行 Streaming MapReduce程序:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-stream.jar [args]
其中 args是 streaming参数,下面是参数列表 :
-input <path> :map输入数据的 hdfs路径; path可以是文件或者目录,可以使用 *通配符, -input选项可以使用多次指定多个文件或目录作为输入。
-output <path> :reduce输出结果的 hdfs路径; path必须不存在,而且执行作业的用户必须有创建该目录的权限, -output只能使用一次。
-mapper <filename> : mapper可执行文件或脚本;必须指定且唯一。
-reducer <filename> : reducer 可执行文件或脚本;必须指定且唯一。
-file <file> : 分发本地文件,先上传到 hdfs,然后再分发 到各个节点;
-cacheFIle <file>: 将 hdfs上的文件分发到各个节点;
-cachArchive <file> : 将 hdfs上的压缩文件分发到各个节点;
-numReduceTasks <num> : 系统中 reduce任务个数; 如果设置 -numReduceTasks 0或者 -reducer NONE则没有 reducer程序, mapper的输出直接作为整个 job的输出。
-D name=value : 配置系统参数;
1) mapred.map.tasks: map task数目
2) mapred.reduce.tasks: reduce task数目
3) stream.map.input.field.separator/stream.map.output.field.separator: map task输入 /输出数据的分隔符 ,默认均为 \t。
4)stream.num.map.output.key.fields:指定 map task输出记录中 key所占的域数目
5)stream.reduce.input.field.separator/stream.reduce.output.field.separator: reduce task输入 /输出数据的分隔符,默认均为 \t。
6) stream.num.reduce.output.key.fields:指定 reduce task输出记录中 key所占的域数目 -combiner<javaClass> : Combiner java类;对应的 Java类文件打包成 jar文件后用 -file分发。
-partitioner <javaClass> : Partitioner java类;
-inputformat <java class> : InputFormat java 类;用于读取输入数据,要实现 InputFormat接口。如果不指定,默认使用 TextInputFormat。
-outputformat <javaClass> : OutputFormat java 类;用于写入输出数据,要实现 OutputFormat接口。如果不指定,默认使用 TextOutputFormat。
-cmdenv NAME=VALUE:给 mapper和 reducer程序传递额外的环境变量, NAME是变量名, VALUE是变量值。
-verbose :指定输出详细信息,例如分发哪些文件,实际作业配置参数值等,可以用于调试
优缺点
优点:
1.直接:在TaskTracker上执行时直接以stdin/stdout作为数据传输媒介,意味着你可以用任何语言编写Map-Reduce任务。Hadoop是用来处理以文件形式保存和输出的超大规模半结构化数据的,这种数据一般随机性强,Linux Shell、Python这种能直接运行的脚本语言本身就是最佳选择。一些原先在单机上跑的、基于文件的任务脚本,可以轻易修改为Map-Reduce任务,从而在分布式集群上跑。
2.方便灵活:对于一些逻辑不复杂的任务,可以使用简单脚本语言(Python, Shell, Perl等等)编写和提交任务,不需要编译,不用打jar包,只要Task Tracker上有相应的环境即可立即执行,而执行语句也可以在提交时指定,这对于平时经常使用Linux的同学来说实在太方便了,pipeline, cat, 甚至awk都可以自如使用,因为它的执行者就是shell本身
缺点:
1.慢,这是使用了标准输入/输出的缘故,数据交换过程不如Java API直接(不过,过多或过少Mapper数量,以及分桶不均等问题也会造成数据IO极不正常的慢)
2.无法避免的数据类型转换:还是因为stdin/out的缘故,数据以文本类型在节点之间交互,这点暂不必说;而Java API则使用了专门封装过的数据类型
3.那个关于Key的故事:作为分桶和Reduce前排序的依据,Streaming模式貌似只能支持以第一个\t之前的那一坨为key。我们自行开发的Hadoop分支已经支持多key排序,不知当前社区版的情况如何
4.习惯OO同学,您还是用Java吧:如果文件比较多,而且带有目录结构的话呢,使用Streaming模式只有一种选择:archive,使用时请注意如果压缩一定要用gzip,后缀使用tgz或者tar.gz,否则可能悲剧。
5.关于字典:一定要用archive,用file在分发任务的时候会将字典文件上传到每台task tracker上,字典大的话IO压力会比较大
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。