目录
HDFS(Hadoop Distribute File System)
Hadoop 框架
概念
Hadoop(英译: 大数据分析/云计算/分布式计算) 框架图,借助Hadoop框架及云计算核心技术MapReduce来实现数据的计算和存储,并且将HDFS分布式文件系统和HBASE分布式数据库很好地融入到云计算框架中,从而实现了云计算的分布式、并行计算和存储,并且得以实现很好的处理大规模数据的能力。
![](https://i-blog.csdnimg.cn/blog_migrate/bb78397995e4f95cb9b9f98c1f2ad617.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d7cc26511ef087af0601bdbbc319ac9e.png)
基础架构
逻辑上来看,Hadoop系统的基本组成架构包含两个部分:分布式存储和并行计算。
- 分布式存储(HDFS、HBASE):Hadoop使用NN作为存储主节点,用以存储和管理分布式文件系统的元数据,同时使用DN作为实际存储大规模数据的从节点。
- 并行计算(MapReduce):Hadoop使用JobTracker作为MapReduce框架的主节点,用来管理和调度作业的执行,同时使用TaskTracker作为从节点来管理每个上任务的执行。
为了实现Hadoop设计的本地化计算,数据节点DN和计算节点TaskTracker应放在同个节点,每个从节点也的DN和TaskTracker也应放在同个服务器,从而让每个Tracker尽量处理存储在本地DataNode上的数据。
数据主控节点NN与作业执行节点JobTracker可以设置在同一个节点,也可以考虑负载较高时分散两个节点。
三大核心组件
HDFS(Hadoop Distribute File System)
概念:
HDFS(Hadoop Distribute File System Hadoop 分布式文件系统) 是一个分布式文件系统。HDFS具有容错性、可伸缩和易扩展等优点。
其如下:
1)HDFS适合存储大量文件(PB、EB级别);
2)支持流式文件访问文件一次写入多次读取,支持追加操作但已写入的数据不支持更改;
3)对硬件要求不高,相对廉价的商用硬件即可实现HDFS存储,当系统中某几台服务器故障时系统仍可用并且能保持数据完整。
总的来说,HDFS是一个分布式存储的Hadoop应用程序,他提供了更接近数据的接口。
数据存储模型Block
-
- 数据存储方式为 字节。
- HDFS数据存储单元是block,文件被线性切割成块,每个块都有它的偏移量offset(byte),Block分散存储在节点中。
- 写入HDFS的每个文件默认被分割为64MB或128MB(Hadoop2.x默认128MB)大小的数据块。文件上传时可以指定Block大小,最小为1MB。
- 默认副本数为3,副本数可以通过配置调整,副本数不要超过节点数量。
- 单一文件Block块大小一致(除最后一个block),文件与文件可以不一致。
- 支持一次写入多次读取,允许append数据,同一时间只能有一个写入者。
HDFS架构
概括
HDFS架构包含NameNode(NN)、DataNode(DN)和SecondaryNameNode(SNN)三个节点信息。属于主从架构模型。另外还有HdfsClient作为客户端与NN通信,并提供一些接近数据的手段如API、shell命令。
设计思想
分而治之。
- 将大文件切割成小文件,以分而治之的思想让很多服务器对同一个文件进行联合管理
- 每个小文件做冗余备份,并且分散保存到不同的服务器,保证高容错,可恢复。
应用场景
为各类分布式运算框架如 Hadoop MapReduce、Spark、Tez、Flink等,提供数据存储服务。
角色说明
- NameNode: 主节点, 负责接收客户端读写服务,负责维护整个HDFS文件系统的目录树,以及每一个路径(文件)所对应的block块信息(block的id,及所在的datanode服务器)。通俗一点说,NN是集群的老大,维护文件系统目录树,处理客户端读写请求。
- SecondaryNameNode:辅助节点,主要工作时协助NameNode合并edits.log,减少NameNode启动时间。通俗说一点说,就是指为NameNode分但一些压力,不能说是备用节点但是也可以作为备份。
- DataNode:从节点,负责保存和维护文件数据(切分后的Block块),真正的处理数据读写的地方。
- HdfsClient:客户端,负责读取操作数据文件。HdfsClient与NN交互获取文件元数据信息,然后通过元数据信息与DN交互操作Block数据。
工作机制
NameNode工作机制
职责
- 接收客户端读写请求。
- 元数据的管理(查询、修改),收集DN汇报的Block列表信息。
元数据存储形式
- 内存元数据(NameSystem)
- 磁盘元数据镜像文件(fsimage),这是HDFS文件系统存于硬盘中的元数据监察点,里面记录了
自最后一次监察点之前HDFS文件系统中所有目录和文件的序列化信息。
- 数据操作日志文件(editslog),用于衔接内存metadata和fsimage之间的操作日志文件。editslog保存了自最后一次检查点之后所有针对HDFS文件系统的操作,比如:增加文件、重命名文件、删除目录等。这两种文件存放在${dfs.namenode.name.dir}/current/目录下,文件以edits_和fsimage命名,该目录为NameNode上的本地目录。为了保证这两种文件的高可用,一般将${dfs.namenode.name.dir}设置为逗号分割的多个目录,这多个目录至少不在一块磁盘上,最好放在不同的服务器上。
checkpoint
- 每隔一段时间,会由SNN将NN上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge,这个过程称为checkpoint。
- NN和SNN的工作目录存储结构完全相同,所以,当NN故障退出需要重新恢复时,可以从SNN的工作目录中将fsimage拷贝到NN的工作目录,来恢复NN的元数据。
- checkpoint过程图解
![](https://i-blog.csdnimg.cn/blog_migrate/f13dfcfc4a7f0db5d2b4248fb4591d5d.png)
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之间最大的操作记录
优缺点
优点:
- 支持廉价商用机器上的部署。
- 数据自动保存3个副本,副本丢失后自动恢复。高容错和可恢复。
- 适合批处理:计算向数据移动,数据位置暴露给计算框架(block偏移量)。
- 适合大数据处理:GB、TB、甚至PB级别的数据,百万规模以上的文件数量,10K+节点规模。
- 流式文件访问:一次写入,多次读取,保证数据一致性。
ps:
-
- 移动数据是指,传统的应用程序处理数据通常是将数据传输到应用程序的不同逻辑节点上,然后进行计算。但是这样在大数据量的情况下(GB、TB、PB级别甚至更大)将会受限于磁盘I/O,网络I/O的效率,严重拖慢处理时间。
- 移动计算是指,数据存放在数据节点上不再变动,而是将应用逻辑程序(肯定不会特别大)传输到各个数据节点上,然后本地执行处理,效率高,时间开销小。目前大数据处理技术都是采用此方式。
缺点:
- 低延迟数据访问:毫秒级、低延迟与高吞吐率。
- 小文件存取,文件寻道时间将大幅超过读取时间。
- 并发写入,文件随机修改。
YARN
概念:
Apache YARN(Yet Another Resource Negotiator,另一种资源协调者), Hadoop 的资源管理器。
从Hadoop2.x引入,最初为了改产MR的实现,但是它具有通用性,可以同时执行其他分布式计算框架 。
MapReduce1的局限
- 扩展性差:JobTracker同时处理资源管理和作业控制跟踪功能任务,启动失败或迟缓的任务,记录任务的执行状态,维护计数器。对系统造成压力大,容易成为性能瓶颈。
- 可靠性差: 采用Master/Slave结构,Master容易单点故障。
- 资源利用率低:基于槽位slot的资源分配模型。一个任务一个slot,但是通常用不了那么多资源。Hadoop1中的MR分为Map slot和Reduce slot,他们之间资源不共享,造成一些资源空闲。-
- 不支持多计算框架并行。
思想
一个全局的资源管理器ResourceManager和每个应用对应的ApplicationMaster,ResourceManage和NodeManager组成全新的通用系统,以分布式的方式管理应用程序。
基础架构
Yarn整体上属于主/从架构,三个核心组件(下述 1)2)3)为三个核心组件,4)5)为更细粒度的角色)来实现功能。
1)ResourceManager(RM) 集群资源控制者 。
-
- 处理Client请求:提交作业、杀死作业;
- 监控NM,一旦某个NM挂了,那么该NM上运行的任务需要告诉AM来如何进行处理。
2)NodeManager (NM) 管理节点上的用户作业和工作流。
-
- 定时向RM汇报节点资源使用情况;
- 接收并处理来自RM的各种命令如启动Container;
3)ApplicationMaster (AM) 用户作业生命周期管理者。
-
- 每个应用程序对应一个AM。(应用程序如:MapReduce、Spark应用)
- 为应用程序向RM申请资源(core、memory),分配给内部Task
- 需要与NM通信:启动/停止Task。Task运行在Container中,AM也是运行在Container中。AM可以理解成0号Container。
4)Container 容器
-
- 封装CPU、Memory等资源的一个容器
- 一个任务运行的抽象环境
5)Client 客户端
-
- 提交作业
- 查询作业进度
- 杀死作业
工作流程
- Client向Yarn提交Application(App),假设是一个MR作业。
- RM向NM通信为该App分配第一个容器。并在这个容器中运行这个App对应的AM。
- AM启动以后,对App作业进行拆分,拆出Task,这些Task可以运行在一个或多个Container中。然后向RM申请要运行程序的容器,并定时向RM发送心跳。
- 申请到Container之后,AM会和Container对应的NM通信,然后将作业分发到对应的NM中的容器中运行。
- Container中运行的Task会向AM发心跳,汇报自身情况。Task执行完毕后,AM再向RM注销并释放容器资源。
简述流程:
Client --> 发送请求 --> RM接收请求 --> 指定任意一个NM启动一个AM --> AM确认作业,拆解Task,准备Container资源清单 --> RM分配资源 --> NM创建资源(Containers),运行Task --> Task运行完毕通知AM --> AM向RM申请注销资源,释放容器空间
优点
- 支持非MapReduce应用的需求
- 可扩展
- 资源利用率高
- 高可用
MapReduce
概念:
- MapReduce是一种模式
- Hadoop MapReduce:是hadoop实现了MR模式的一种分布式计算框架。它其实是一个分布式并行编程框架。
思想
MapReduce2.x 采用分而治之的思想。将HDFS海量数据切分成若干块,将每个块的数据分给集群上的节点并行计算。然后整合各节点的中间结果,得到最终结果。
原理
1)Map和Reduce函数。这两个函数定义了 任务本身。
- map函数:接收键值对(k-v pair)产生一组中间值键值对。框架会将Map函数产生的额中间键值对里 键相同的值传递给一个Reduce函数。
- Reduce函数:接收一个键以及相关的一组值(k-values pair),将这组值进行合并并产生一组规模更小的值(一个Reduce对应一个Key)。
2)MR整体执行过程,下图是整个MR执行时各角色的职责体现。如下图:
- 通过JobClient提交用户程序;
- JobClient向JobTracker提交作业执行请求获得一个Job ID;
- JobClient复制作业资源到HDFS中存储;
- JobClient向JobTracker正式提交作业;
- JobTracker接受并调度该作业,并完成初始化准备工作;
- JobTracker查询数据分片信息,构建并准备相应的任务;
- JobTracker启动TaskTracker节点开始执行任务;
- TaskTracker根据分配的具体任务,获取相应作业数据;
- TaskTracker节点开始运行相应的任务;
- TaskTracker执行完任务,输出结果;
- TaskTracker向JobTracker报告分配的任务已完成。
![](https://i-blog.csdnimg.cn/blog_migrate/d1e56dcdb563b3b8bf3908796eed6819.png)
3)作业执行流程
总体上分三阶段:准备(PREP)、运行(RUNNING)、结束(FINISHED);并且在各个状态下,作业有可能被主动杀死,进入到KILLED状态或执行中遇到失败,进入FAILED状态。
![](https://i-blog.csdnimg.cn/blog_migrate/f8d1be9db4050a330b92610bf4224f55.png)
4)任务执行流程
任务时MR框架并行计算的基本单位,任务是一个逻辑概念,在MR的实现中,分布于JobTracker和TaskTracker上,对应TaskInProgress和TaskTracker.TaskInProgress对象。
![](https://i-blog.csdnimg.cn/blog_migrate/3358f6ff7a2b34b20135118096eeaa8c.png)
5)组件和组件的执行流程
执行MR时涉及到的组件有10种,流程如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/10db027f18549479ec5d86eea5c82538.png)
- 数据输入格式InputFormat
基础类之一,是一个抽象类,描述了MapReduce作业数据的输入形式和格式。InputFormat可以验证作业数据的输入形式和格式;将输入数据分割为若干个逻辑意义上的InputSplits;提供一个RecordReader。
hadoop提供了功能丰富的InputFormat类,实现从特定数据源或特殊目的的输入要求。常用的有:TextInputFormat、KeyValueInputFormat、NLineInputFormat、CombineFileInputFormat、SequenceFileInputFormat、DBInputFormat等等。
- 输入数据分块InputSplits
基础类之一。一个InputSplit将单独作为一个Mapper的输入,有多少个InputSplit就有多少个Mapper。用户无法自主选定InputSplit的类型,而是在选择某个InputFormat后就决定了对应的InputSplit。InputSplit默认将文件分为64MB的大小,hadoop-site.xml中的mapred.min.split.size参数控制这个大小。
- 数据记录读入RecordReader(RR)
InputSplit定义了一项工作的大小,但是没有定义如何读取数据 。RecordReader即是负责从数据分块中读取数据记录转化为键值对的类。它将数据输出到Mapper类中 。
- Mapper
每个Mapper对象会生成一个java进程。程序员继承此类,用于实现Map任务。
- Combiner
用于合并相同key的键值对,减少partitioner时候的数据通信开销。
- Partitioner
为了避免在Reduce计算过程中不同Reduce节点间存在相关性,需要一个Partition过程。
- Sort
传输到每一个节点上的所有的Reduce函数接收到得Key,value对会被Hadoop自动排序;
- Reducer
程序员继承此类,用于执行Reduce任务。
- 文件输出格式OutputFormat
它是用于描述MapReduce作业的数据输出格式和规范的抽象类。写入到HDFS的所有OutputFormat都继承自FileOutputFormat 。其中常用的OutputFormat有:TextOutFormat、SequenceOutFormat、NullOutFormat、DBOutFormat等,太多。
- 数据记录输出RecordWriter
对于一个文件输出格式,都需要一个对应的数据记录输出RecordWriter,以便系统明确输出结果写入到文件中的具体格式。如TextOutputFormat实现了默认的LineRecordWriter,以“key/value”的形式输出一行结果。
其他功能组件
HBase
概念
HBase(英译:数据仓库)是一个提供高可靠性、高性能、可伸缩、实施读写、面向列(面向列族)的分布式数据库,一般采用HDFS作为其底层数据存储。HBase是针对谷歌BigTable的开源实现,二者都采用了相同的数据模型,具有强大的存储能力。HBase与RDBMS的一个重要区别是,前者采用基于列的存储,而后者采用基于行的存储。HBase具有良好的横向扩展力,可以通过不断增加廉价的商用服务器来增加存储能力。
HBase不是关系型数据库,他是NoSQL数据库的一个典型代表,并不支持SQL查询,它所使用的是基于键值的一种特殊语法,也可以成为HQL。
数据模型
数据被存放在带有标签的表中,表由行和列组成,行和列交叉确定一个单元格,单元格有版本号,版本号为数据插入该单元格时的时间戳。单元格的内容没有数据类型,所有数据均被视为未解释的字节数组。
表中每一行有一个行键(也是字节数组,任何形式的数据都可以表示成字符串,比如数据结构进行序列化之后),整个表根据行键的字节序来排序,所有对表的访问必须通过行键。
表中的列又划分为多个列族(column family),同一个列族的所有成员具有相同的前缀,具体的列由列修饰符标识,因此,列族和列修饰符合起来才可以标识某一列,例如 info:format、contents:image。
![](https://i-blog.csdnimg.cn/blog_migrate/07e8e6994f2e4809589be1dba59e3356.png)
在创建表时,列族必须作为模式定义的一部分预先给出,而列族是支持动态扩展的,也就是列族成员可以随后按需加入。物理上,所有列族成员一起存放在文件系统上,所以实际上说HBase是面向列的数据库,更准确地应该是面向列族,调优和存储都是在这个列族层次上进行的。一般情况下,同一个列族的成员最后具有相同的访问模式和大小特征。
总结来说,HBase表和熟知的RDBMS(关系型数据库)很像,不同之处在于:行按行键排序,列划分为列族,单元格以时间戳作为版本号,没有数据类型。
数据坐标
HBase中根据行键、列族、列限定符和时间戳来确定一个单元格。因此,可以视为一个“四维坐标”,即[行键、列族、列表标识符、时间戳]。
![](https://i-blog.csdnimg.cn/blog_migrate/fb34abcff9be4633274c985823bc0bf9.png)
以上图的HBase表为例,其数据坐标举例如下:
键 | 值 |
[“201505003”, “Info”, “email”, 1174184619081] | “xie@qq.com” |
[“201505003”, “Info”, “email”, 1174184620720] | “you@163.com” |
HBase区域
HBase自动把表水平划分为区域(Region),每个区域都偶遇若干连续行构成,一个区域由所属的表、起始行、终止行(不包括这行)三个要素表示。
一开始,一个表只有一个区域,但是随数据量扩增,区域逐渐变大。直到超出设定的阈值大小,就会在某行的边界上进行拆分,分成两个大小基本相同的区域。然后随着数据的继续增加,区域就不断地增加,如果超出单台服务器的容量,就可以把一些区域放到其他节点上去,构成一个集群。
总结来说 ,集群中的每个节点(Region Server)管理整个表的若干个区域。所以,可以这么理解:区域是HBase集群上分布数据的最小单位。
![](https://i-blog.csdnimg.cn/blog_migrate/0df10cba11c816a44013990741588a68.png)
Hive
概念
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。
![](https://i-blog.csdnimg.cn/blog_migrate/917a27a61a1e511c16b442604782dc5a.png)
优缺点
优点:
- 简单,只用写SQL就行
- 常用于数据分析,适合处理离线数据
- 扩展性强,支持用户自定义函数
- 处理大数据量时优势明显。
缺点:
- HQL表达有限,无法表达迭代式算法。(迭代式算法:一个MR成需的结果作为另一个MR程序的输入。)
- 不擅长数据挖掘。(spark擅长)
- Hive自动生成MR作业,通常不够智能化,效率较低
- 调优困难,粒度较粗
Pig
概念
Apache Pig是一个高级过程语言,可以通过Pig编写的脚本,转换成Hadoop的MapReduce任务,简化的Hadoop的操作。
Pig是Hadoop数据操作的一个客户端、一个数据分析引擎,采用了一定的语法操作HDFS中的数据。它的语言风格比较像Shell脚本,可以嵌入Hadoop的JAVA程序中,从而简化开发。
Pig所编写的脚本叫Pig Latin,PigLatin语句被Pig引擎翻译成MapReduce程序,可完成排序、过滤、求和、分组、关联等操作,支持自定义函数。
优缺点:
- 避免书写MapReduce程序,由Pig自动转化
- 自动优化。任务编码的方式允许系统自动优化执行过程,从而使用户专注业务逻辑。
- 利好扩展,用户可以轻松地编写自己的函数来进行特殊的用途的处理
- 减少开发人员学习成本。尽管Pig没有原生的MapReduce程序快。
Mahout
概念
Mahout(英译:机器学习库)是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括被称为Taste的分布式协同过滤的实现、分类、聚类等。
机器学习算法(Mahout已实现的)
![](https://i-blog.csdnimg.cn/blog_migrate/12888044d12d16e24b54861b0525a155.png)
优缺点
- 基于Hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升的算法可处理的数据量和处理性能。
Zookeeper
概念
ZooKeeper(英译:动物园管理员)一套高吞吐的分布式协调系统。主要解决分布式应用经常遇到的数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
(Zookeeper 作为 Hadoop 项目中的一个子项目,是 Hadoop 集群管理的一个必不可少的模块,它主要用来控制集群中的数据,如它管理 Hadoop 集群中的 NameNode,还有 Hbase 中 Master Election、Server 之间状态同步等。)
Sqoop
概念
Sqoop(发音 skup),一款开源的工具。主要用于Hadoop(Hive)和传统数据库间进行数据的传递,可以将一个关系型数据库(如 Mysql、Oracle、Pg等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库。
一种关系型数据库 ⇒ hbase,hive ⇒ 另外一种关系型数据库
思想
利用MR加快数据传输速度。也就是说Sqoop的导入和导出功能是通过MapReduce作业实现的。
所以它是一种批处理方式进行数据传输,难以实现实时的数据进行导入导出。
优缺点
- 高效、可控地利用资源,可通过调整任务数来控制任务的并发度。另外它还可以配置数据库的访问时间等。
- 自动地完成数据类型映射与转换。
- 支持多种数据库,如:Mysql、pg、oracle等。
版本差异
- sqoop1架构与sqoop2完全不同,1仅采用一个客户端、2中引入了sqoop server几种管理connector以及rest api,web,ui并引入权限安全机制。
- sqoop1优点是架构简单部署方便,缺点是命令行方式容易出错、格式紧耦合、无法支持所有数据类型、不安全、connector必须符合JDBC模型。
- sqoop2优点是有多种交互方式:命令行、web UI、rest API、connector集中化管理,所有的链接安装在sqoop server上,权限管理适当,connector规范化,仅负责数据读写。缺点是:架构稍复杂,配置部署更繁琐。
Ambari
概念
Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应、管理和监控。Ambari已支持大多数Hadoop组件、包括HDFS、MapReduce、Hive、Pig、Zookeeper、Sqoop、Hcatalog等
优缺点
优点:
- Web安装图形界面操作便捷
- Hadoop整个家族组件支持很全面
- 社区资源比较丰富
缺点:
- BUG较多:安装过程中莫名出现错误。系统运维过程中偶尔出错。以上两种情况重启就正常了。
- 安装速度与网络质量关系较大,往往时间较长。
- 合理避免大坑的情况下,3小时可以搭建一个基本版的集群。
Flume
概念
Flume(英译:水槽)是Cloudera提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时Flume提供对数据的简单处理,并写到各种数据接受方的能力。
优缺点
优点:
- 支持高效率地将多个网站服务器中收集的日志信息存入HDFS/HBASE中。
- 支持将多个服务器中获取的数据迅速地移交给Hadoop
- 除了日志信息,也可以用来接入收集规模宏大的社交网络节点事件数据,如 facebook,twitter、亚马逊等。
- 支持各种接入资源数据的类型以及接出数据类型
- 支持多路径流量,多管道接入流量,多管道接出流量,上下文路由等
- 可水平扩展
缺点:
- 配置很繁琐,source、channel、sink的关系在配置文件中交织,不便于管理。
Impala
概念
Impala可以对Hadoop中大多数格式的文件进行查询。它能通过create table和insert的方式将一部分格式的数据加载到table中,但值得注意的是,有一些格式的数据它是无法写入的(write to)。对于Impala无法写入的数据格式,我们只能通过Hive建表,通过Hive进行数据的写入,然后使用Impala来对这些保存好的数据执行查询操作。
Spark
概念
Spark(英译:火花)是一种快速、通用、可扩展的大数据分析引擎。是UC Berkeley AMP lab(加州大学博客利分校AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,专门用于大规模数据的迭代式计算,是为了跟Hadoop配合而开发出来的,不是为了取代Hadoop。
Spark是基于内存计算的大数据并行计算框架。除了扩展了广泛使用的MR计算模型,而且高效地支持更多计算模式,包括交互式查询和流处理。Spark适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理。
用户和用途
数据科学应用和数据处理应用,所以相对应的产生了对应的两种研究人群:数据科学家和工程师。
- 数据科学任务: 主要是数据分析领域,数据科学家要负责分析数据并建模,具备 SQL、统计、预测建模(机器学习)等方面的经验,以及一定的使用 Python、 Matlab 或 R 语言进行编程的能力。
- 数据处理应用: 工程师定义为使用Spark开发 生产环境中的数据来处理问题的软件开发者,使用Spark的API实现对任务进行处理和转换。
优缺点
优点:
- 速度快:比Hadoop的MR运算快100倍以上,基于硬盘的运算也快10倍以上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流。计算的中间结果是存在于内存中的。
- 易用:Spark支持JAVA、Python和Scala的API,支持超过80中高级算法,使用户可以快速构建不同应用。
- 通用:Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。Spark统一的解决方案非常具有吸引力,毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本。
- 优秀的兼容性:Spark可以非常方便地与其他的开源产品进行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,并且可以处理所有Hadoop支持的数据,包括HDFS、HBase和Cassandra等。这对于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。Spark也可以不依赖于第三方的资源管理和调度器,它实现了Standalone作为其内置的资源管理和调度框架,这样进一步降低了Spark的使用门槛,使得所有人都可以非常容易地部署和使用Spark。此外,Spark还提供了在EC2上部署Standalone的Spark集群的工具。
缺点:
- 内存计算,虽然速度上优势巨大,但在容量上,内存远小于磁盘。所以他能处理的任务数远小于Hadoop。因此Spark被定义为 轻量级的大数据计算框,而MR是实际意义上的大数据计算框架。
- Spark计算过程中,会给JVM垃圾回收机制带来严重压力。例如:两个Spark应用使用同样的数据时,同一份数会缓存两次,不但增加内存压力,同时使GC缓慢从而影响性能。
- 由于弹性分布式数据集的只读特性,使得Spark只适合处理粗粒度的数据并行计算,而不适合哪些异步的细粒度的更新计算。
应用场景
- 快速查询与实时推荐场景
- 图计算
Flink
概念
Apache Flink是一个开源的分布式、高性能、高可用、准确的流处理框架,主要由Java代码实现,支持实时流(stream)处理和批(batch)处理,批数据只是流数据的一个极限的特例。原生支持了迭代管理、内存计算和程序优化。
Flink在实现流处理和批处理时,与传统的一些方案完全不同,它从另一个视角看待流处理和批处理,将二者统一起来:Flink是完全支持流处理,也就是说作为流处理看待时输入数据流是无界的;批处理被作为一种特殊的流处理,只是它的输入数据流被定义为有界的。
优缺点
优点:
- 有状态计算的Exactly-once语义。状态是指flink能够维护数据在时序上的聚类和聚合,同时它的checkpoint机制
- 支持带有事件时间(event time)语义的流处理和窗口处理。事件时间的语义使流计算的结果更加精确,尤其在事件到达无序或者延迟的情况下。
- 支持高度灵活的窗口(window)操作。支持基于time、count、session,以及data-driven的窗口操作,能很好的对现实环境中的创建的数据进行建模。
- 轻量的容错处理( fault tolerance)。 它使得系统既能保持高的吞吐率又能保证exactly-once的一致性。通过轻量的state snapshots实现。
- 支持高吞吐、低延迟、高性能的流处理
- 支持savepoints 机制(一般手动触发)。即可以将应用的运行状态保存下来;在升级应用或者处理历史数据是能够做到无状态丢失和最小停机时间。
- 支持大规模的集群模式,支持yarn、Mesos。可运行在成千上万的节点上
- 支持具有Backpressure功能的持续流模型
- Flink在JVM内部实现了自己的内存管理
- 支持迭代计算
- 支持程序自动优化:避免特定情况下Shuffle、排序等昂贵操作,中间结果进行缓存
Storm
概念
Storm是一个分布式、高容错的实时计算系统,对数据实时计算提供了简单的spout和bolt原语。
应用场景
低延时、无穷数据、持续计算。例如 屏蔽词。
优缺点
优点:
- 分布式、架构简单、方便运维
- 高度容错
- 无数据丢失
- 多语言
- 低延迟、高性能、可扩展。
Streaming
概念
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命令
使用下面的命令运行 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压力会比较大