Hadoop面试题精选集合带答案

1. 以下哪一项不属于Hadoop可以运行的模式___C___。

A. 单机(本地)模式

B. 伪分布式模式

C. 互联模式

D. 分布式模式

2. Hadoop的作者是下面哪一位__B____。

A. Martin Fowler

B. Doug cutting

C. Kent Beck

D. Grace Hopper

3. 下列哪个程序通常与 NameNode 在同一个节点启动__D___。

A. TaskTracker

B. DataNode

C. SecondaryNameNode

D. Jobtracker

4. HDFS 默认 Block Size的大小是___B___。

A.32MB

B.64MB

C.128MB

D.256M

5. 下列哪项通常是集群的最主要瓶颈____C__。

A. CPU

B. 网络

C. 磁盘IO

D. 内存

6. 下列关于MapReduce说法不正确的是_____C_。

A. MapReduce是一种计算框架

B. MapReduce来源于google的学术论文

C. MapReduce程序只能用java语言编写

D. MapReduce隐藏了并行计算的细节,方便使用

8. HDFS是基于流数据模式访问和处理超大文件的需求而开发的,具有高容错、高可靠性、高可扩展性、高吞吐率等特征,适合的读写任务是 __D____。

A.一次写入,少次读

B.多次写入,少次读

C.多次写入,多次读

D.一次写入,多次读

9. HBase依靠__A____存储底层数据。

A. HDFS

B. Hadoop

C. Memory

D. MapReduce

10. HBase依赖___D___提供强大的计算能力。

A. Zookeeper

B. Chubby

C. RPC

D. MapReduce

11. HBase依赖___A___提供消息通信机制

A. Zookeeper

B. Chubby

C. RPC

D. Socket

12. 下面与HDFS类似的框架是___C____?

A. NTFS

B. FAT32

C. GFS

D. EXT3

13. 关于 SecondaryNameNode 下面哪项是正确的___C___。

A. 它是 NameNode 的热备

B. 它对内存没有要求

C. 它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间

D. SecondaryNameNode 应与 NameNode 部署到一个节点

14. 大数据的特点不包括下面哪一项___D___。

A. 巨大的数据量

B. 多结构化数据

C. 增长速度快

D. 价值密度高

HBase测试题

1. HBase来源于哪一项? C

A The Google File System

B MapReduce

C BigTable

D Chubby

2. 下面对HBase的描述哪些是正确的? B、C、D

A 不是开源的

B 是面向列的

C 是分布式的

D 是一种NoSQL数据库

3. HBase依靠()存储底层数据 A

A HDFS

B Hadoop

C Memory

D MapReduce

4. HBase依赖()提供消息通信机制 A

A Zookeeper

B Chubby

C RPC

D Socket

5. HBase依赖()提供强大的计算能力 D

A Zookeeper

B Chubby

C RPC

D MapReduce

6. MapReduce与HBase的关系,哪些描述是正确的? B、C

A 两者不可或缺,MapReduce是HBase可以正常运行的保证

B 两者不是强关联关系,没有MapReduce,HBase可以正常运行

C MapReduce可以直接访问HBase

D 它们之间没有任何关系

7. 下面哪些选项正确描述了HBase的特性? A、B、C、D

A 高可靠性

B 高性能

C 面向列

D可伸缩

8. 下面与Zookeeper类似的框架是?D

A Protobuf

B Java

C Kafka

D Chubby

9. 下面与HDFS类似的框架是?C

A NTFS

B FAT32

C GFS

D EXT3

10. 下面哪些概念是HBase框架中使用的?A、C

A HDFS

B GridFS

C Zookeeper

D EXT3

第二部分:HBase核心知识点

11. LSM含义是?A

A 日志结构合并树

B 二叉树

C 平衡二叉树

D 基于日志结构的合并树

12. 下面对LSM结构描述正确的是? A、C

A 顺序存储

B 直接写硬盘

C 需要将数据Flush到磁盘

D 是一种搜索平衡树

13. LSM更能保证哪种操作的性能?B

A 读

B 写

C 随机读

D 合并

14. LSM的读操作和写操作是独立的?A

A 是。

B 否。

C LSM并不区分读和写

D LSM中读写是同一种操作

15. LSM结构的数据首先存储在()。 B

A 硬盘上

B 内存中

C 磁盘阵列中

D 闪存中

16 HFile数据格式中的Data字段用于()。A

A 存储实际的KeyValue数据

B 存储数据的起点

C 指定字段的长度

D 存储数据块的起点

17 HFile数据格式中的MetaIndex字段用于()。D

A Meta块的长度

B Meta块的结束点

C Meta块数据内容

D Meta块的起始点

18 HFile数据格式中的Magic字段用于()。A

A 存储随机数,防止数据损坏

B 存储数据的起点

C 存储数据块的起点

D 指定字段的长度

19 HFile数据格式中的KeyValue数据格式,下列选项描述正确的是()。A、D

A 是byte[]数组

B 没有固定的结构

C 数据的大小是定长的

D 有固定的结构

20 HFile数据格式中的KeyValue数据格式中Value部分是()。C

A 拥有复杂结构的字符串

B 字符串

C 二进制数据

D 压缩数据

第三部分:HBase高级应用介绍

31 HBase中的批量加载底层使用()实现。A

A MapReduce

B Hive

C Coprocessor

D Bloom Filter

32. HBase性能优化包含下面的哪些选项?A、B、C、D

A 读优化

B 写优化

C 配置优化

D JVM优化

33. Rowkey设计的原则,下列哪些选项的描述是正确的?A、B、C

A 尽量保证越短越好

B 可以使用汉字

C 可以使用字符串

D 本身是无序的

34. HBase构建二级索引的实现方式有哪些? A、B

A MapReduce

B Coprocessor

C Bloom Filter

D Filter

35. 关于HBase二级索引的描述,哪些是正确的?A、B

A 核心是倒排表

B 二级索引概念是对应Rowkey这个“一级”索引

C 二级索引使用平衡二叉树

D 二级索引使用LSM结构

36. 下列关于Bloom Filter的描述正确的是?A、C

A 是一个很长的二进制向量和一系列随机映射函数

B 没有误算率

C 有一定的误算率

D 可以在Bloom Filter中删除元素

第四部分:HBase安装、部署、启动

37. HBase官方版本可以安装在什么操作系统上?A、B、C

A CentOS

B Ubuntu

C RedHat

D Windows

38. HBase虚拟分布式模式需要()个节点?A

A 1

B 2

C 3

D 最少3个

39. HBase分布式模式最好需要()个节点?C

A 1

B 2

C 3

D 最少

关于hadoop的选择题

1、Doug Cutting所创立的项目的名称都受到其家人的启发,以下项目不是由他创立的项目是

A. Hadoop

B. Nutch

C. Lucene

D. Solr

答案:D

2、配置Hadoop时,JAVA_HOME包含在哪一个配置文件中

A. hadoop-default.xml

B. hadoop-env.sh

C. hadoop-site.xml

D. configuration.xsl

答案:B

知识点:hadoop配置

3、Hadoop配置文件中,hadoop-site.xml显示覆盖hadoop-default.xml里的内容。在版本0.20中,hadoop-site.xml被分离成三个XML文件,不包括

A. conf-site.xml

B. mapred-site.xml

C. core-site.xml

D. hdfs-site.xml

答案:A

知识点:hadoop配置

4、HDFS默认的当前工作目录是/user/$USER,fs.default.name的值需要在哪个配置文件内说明

A. mapred-site.xml

B. core-site.xml

C. hdfs-site.xml

D. 以上均不是

答案:B

知识点:hadoop配置

5、关于Hadoop单机模式和伪分布式模式的说法,正确的是

A. 两者都起守护进程,且守护进程运行在一台机器上

B. 单机模式不使用HDFS,但加载守护进程

C. 两者都不与守护进程交互,避免复杂性

D. 后者比前者增加了HDFS输入输出以及可检查内存使用情况

答案:D

知识点:hadoop配置

6、下列关于Hadoop API的说法错误的是

A. Hadoop的文件API不是通用的,只用于HDFS文件系统

B. Configuration类的默认实例化方法是以HDFS系统的资源配置为基础的

C. FileStatus对象存储文件和目录的元数据

D. FSDataInputStream是java.io.DataInputStream的子类

答案:A

//HDFS

7、HDFS的NameNode负责管理文件系统的命名空间,将所有的文件和文件夹的元数据保存在一个文件系统树中,这些信息也会在硬盘上保存成以下文件:

A.日志

B.命名空间镜像

C.两者都是

答案:C

知识点:

8、HDFS的namenode保存了一个文件包括哪些数据块,分布在哪些数据节点上,这些信息也存储在硬盘上。

A.正确

B.错误

答案:B

知识点:在系统启动的时候从数据节点收集而成的

9、Secondary namenode就是namenode出现问题时的备用节点

A.正确

B.错误

答案:B

知识点:它和元数据节点负责不同的事情。其主要功能就是周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。合并过后的命名空间镜像文件也在Secondary namenode保存了一份,以防namenode失败的时候,可以恢复。

10、出现在datanode的VERSION文件格式中但不出现在namenode的VERSION文件格式中的是

A. namespaceID

B. storageID

C. storageType

D. layoutVersion

答案:B

知识点:其他三项是公有的。layoutVersion是一个负整数,保存了HDFS的持续化在硬盘上的数据结构的格式版本号;namespaceID是文件系统的唯一标识符,是在文件系统初次格式化时生成的;storageType表示此文件夹中保存的是数据节点的类型

11、Client在HDFS上进行文件写入时,namenode根据文件大小和配置情况,返回部分datanode信息,谁负责将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块

A. Client

B. Namenode

C. Datanode

D. Secondary namenode

答案:A

知识点:HDFS文件写入

12、HDFS的是基于流数据模式访问和处理超大文件的需求而开发的,默认的最基本的存储单位是64M,具有高容错、高可靠性、高可扩展性、高吞吐率等特征,适合的读写任务是

A.一次写入,少次读写

B.多次写入,少次读写

C.一次写入,多次读写

D.多次写入,多次读写

答案:C

知识点:HDFS特性

13、HDFS无法高效存储大量小文件,想让它能处理好小文件,比较可行的改进策略不包括

A. 利用SequenceFile、MapFile、Har等方式归档小文件

B. 多Master设计

C. Block大小适当调小

D. 调大namenode内存或将文件系统元数据存到硬盘里

答案:D

知识点:HDFS特性

14、关于HDFS的文件写入,正确的是

A. 支持多用户对同一文件的写操作

B. 用户可以在文件任意位置进行修改

C. 默认将文件块复制成三份存放

D. 复制的文件块默认都存在同一机架上

答案:C

知识点:在HDFS的一个文件中只有一个写入者,而且写操作只能在文件末尾完成,即只能执行追加操作。默认三份文件块两块在同一机架上,另一份存放在其他机架上。

15、Hadoop fs中的-get和-put命令操作对象是

A. 文件

B. 目录

C. 两者都是

答案:C

知识点:HDFS命令

16、Namenode在启动时自动进入安全模式,在安全模式阶段,说法错误的是

A. 安全模式目的是在系统启动时检查各个DataNode上数据块的有效性

B. 根据策略对数据块进行必要的复制或删除

C. 当数据块最小百分比数满足的最小副本数条件时,会自动退出安全模式

D. 文件系统允许有修改

答案:D

知识点:HDFS安全模式

//MapReduce

17、MapReduce框架提供了一种序列化键/值对的方法,支持这种序列化的类能够在Map和Reduce过程中充当键或值,以下说法错误的是

A. 实现Writable接口的类是值

B. 实现WritableComparable<T>接口的类可以是值或键

C. Hadoop的基本类型Text并不实现WritableComparable<T>接口

D. 键和值的数据类型可以超出Hadoop自身支持的基本类型

答案:C

18、以下四个Hadoop预定义的Mapper实现类的描述错误的是

A. IdentityMapper<K, V>实现Mapper<K, V, K, V>,将输入直接映射到输出

B. InverseMapper<K, V>实现Mapper<K, V, K, V>,反转键/值对

C. RegexMapper<K>实现Mapper<K, Text, Text, LongWritable>,为每个常规表达式的匹配项生成一个(match, 1)对

D. TokenCountMapper<K>实现Mapper<K, Text, Text, LongWritable>,当输入的值为分词时,生成(taken, 1)对

答案:B

知识点:InverseMapper<K, V>实现Mapper<K, V, V, K>

19、下列关于HDFS为存储MapReduce并行切分和处理的数据做的设计,错误的是

A. FSDataInputStream扩展了DataInputStream以支持随机读

B. 为实现细粒度并行,输入分片(Input Split)应该越小越好

C. 一台机器可能被指派从输入文件的任意位置开始处理一个分片

D. 输入分片是一种记录的逻辑划分,而HDFS数据块是对输入数据的物理分割

答案:B

知识点:每个分片不能太小,否则启动与停止各个分片处理所需的开销将占很大一部分执行时间

20、针对每行数据内容为”Timestamp Url”的数据文件,在用JobConf对象conf设置conf.setInputFormat(WhichInputFormat.class)来读取这个文件时,WhichInputFormat应该为以下的

A. TextInputFormat

B. KeyValueTextInputFormat

C. SequenceFileInputFormat

D. NLineInputFormat

答案:B

知识点:四项主要的InputFormat类。KeyValueTextInputFormat以每行第一个分隔符为界,分隔符前为key,之后为value,默认制表符为\t

21、有关MapReduce的输入输出,说法错误的是

A. 链接多个MapReduce作业时,序列文件是首选格式

B. FileInputFormat中实现的getSplits()可以把输入数据划分为分片,分片数目和大小任意定义

C. 想完全禁止输出,可以使用NullOutputFormat

D. 每个reduce需将它的输出写入自己的文件中,输出无需分片

答案:B

知识点:分片数目在numSplits中限定,分片大小必须大于mapred.min.size个字节,但小于文件系统的块

22、Hadoop Streaming支持脚本语言编写简单MapReduce程序,以下是一个例子:

bin/hadoop jar contrib/streaming/hadoop-0.20-streaming.jar

—input input/filename

—output output

—mapper ‘dosth.py 5’

—file dosth.py

—D mapred.reduce.tasks=1

23、以下说法不正确的是

A. Hadoop Streaming使用Unix中的流与程序交互

B. Hadoop Streaming允许我们使用任何可执行脚本语言处理数据流

C. 采用脚本语言时必须遵从UNIX的标准输入STDIN,并输出到STDOUT

D. Reduce没有设定,上述命令运行会出现问题

答案:D

知识点:没有设定特殊的reducer,默认使用IdentityReducer

24、在高阶数据处理中,往往无法把整个流程写在单个MapReduce作业中,下列关于链接MapReduce作业的说法,不正确的是

A.Job和JobControl类可以管理非线性作业之间的依赖

B.ChainMapper和ChainReducer类可以用来简化数据预处理和后处理的构成

C.使用ChainReducer时,每个mapper和reducer对象都有一个本地JobConf对象

D.ChainReducer.addMapper()方法中,一般对键/值对发送设置成值传递,性能好且安全性高

答案:D

知识点:ChainReducer.addMapper()方法中,值传递安全性高,引用传递性能高

25、下面哪个程序负责 HDFS 数据存储。答案C datanode

a)NameNode

b)Jobtracker

c)Datanode

d)secondaryNameNode

e)tasktracker

26. HDfS 中的 block 默认保存几份? 答案A默认3分

a)3 份

b)2 份

c)1 份

d)不确定

27. 下列哪个程序通常与 NameNode 在一个节点启动?答案D

a)SecondaryNameNode

b)DataNode

c)TaskTracker

d)Jobtracker

28. Hadoop 作者 答案C Doug cutting

a)Martin Fowler

b)Kent Beck

c)Doug cutting

29. HDFS 默认 Block Size 答案:B

a)32MB

b)64MB

c)128MB

30、下列哪项通常是集群的最主要瓶颈:答案:C磁盘

a)CPU

b)网络

c)磁盘IO

d)内存

31. 关于 SecondaryNameNode 哪项是正确的?答案C

a)它是 NameNode 的热备

b)它对内存没有要求

c)它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间

d)SecondaryNameNode 应与 NameNode 部署到一个节点。

多选题:

1. 下列哪项可以作为集群的管理?答案:ABD

a)Puppet

b)Pdsh

c)Cloudera Manager

d)Zookeeper

2. 配置机架感知的下面哪项正确:答案ABC

a)如果一个机架出问题,不会影响数据读写

b)写入数据的时候会写到不同机架的 DataNode 中

c)MapReduce 会根据机架获取离自己比较近的网络数据

3. Client 端上传文件的时候下列哪项正确?答案B

a)数据经过 NameNode 传递给 DataNode

b)Client 端将文件切分为 Block,依次上传

c)Client 只上传数据到一台 DataNode,然后由 NameNode 负责 Block 复制工作

4. 下列哪个是 Hadoop 运行的模式:答案ABC

a)单机版

b)伪分布式

c)分布式

5. Cloudera 提供哪几种安装 CDH 的方法?答案:ABCD

a)Cloudera manager

b)Tarball

c)Yum

d)Rpm

判断题:

1. Ganglia 不仅可以进行监控,也可以进行告警。( 正确)

2. Block Size 是不可以修改的。(错误 )

3. Nagios 不可以监控 Hadoop 集群,因为它不提供 Hadoop 支持。(错误 )

4. 如果 NameNode 意外终止,SecondaryNameNode 会接替它使集群继续工作。(错误 )

5. Cloudera CDH 是需要付费使用的。(错误 )

6. Hadoop 是 Java 开发的,所以 MapReduce 只支持 Java 语言编写。(错误 )

7. Hadoop 支持数据的随机读写。(错 )

8. NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。(错误)

9. Hadoop 自身具有严格的权限管理和安全措施保障集群正常运行。(错误 )

10. Slave 节点要存储数据,所以它的磁盘越大越好。( 错误)

11. hadoop dfsadmin –report 命令用于检测 HDFS 损坏块。(错误 )

12. Hadoop 默认调度器策略为 FIFO(正确 )

13. 集群内每个节点都应该配 RAID,这样避免单磁盘损坏,影响整个节点运行。(错误 )

14.因为 HDFS 有多个副本,所以 NameNode 是不存在单点问题的。(错误 )

15. 每个 map 槽就是一个线程。(错误 )

16. Mapreduce 的 input split 就是一个 block。(错误 )

17. DataNode 首次加入 cluster 的时候,如果 log 中报告不兼容文件版本,那需要 NameNode执行“Hadoop namenode -format”操作格式化磁盘。(错误 )

18. NameNode 的 Web UI 端口是 50030,它通过 jetty 启动的 Web 服务。(错误 )

19. Hadoop 环境变量中的 HADOOP_HEAPSIZE 用于设置所有 Hadoop 守护线程的内存。它默认是 200 GB。( 错误)

单纯的课本内容,并不能满足学生的需要,通过补充,达到内容的完善

0

大数据框架Hadoop、Storm、Samza、Spark和Flink对比分析

简介

大数据是收集、整理、处理大容量数据集,并从中获得见解所需的非传统战略和技术的总称。虽然处理数据所需的计算能力或存储容量早已超过一台计算机的上限,但这种计算类型的普遍性、规模,以及价值在最近几年才经历了大规模扩展。

在之前的文章中,我们曾经介绍过有关大数据系统的常规概念、处理过程,以及各种专门术语,本文将介绍大数据系统一个最基本的组件:处理框架。处理框架负责对系统中的数据进行计算,例如处理从非易失存储中读取的数据,或处理刚刚摄入到系统中的数据。数据的计算则是指从大量单一数据点中提取信息和见解的过程。

下文将介绍这些框架:

仅批处理框架:

Apache Hadoop

仅流处理框架:

Apache Storm

Apache Samza

混合框架:

Apache Spark

Apache Flink

大数据处理框架是什么?

处理框架和处理引擎负责对数据系统中的数据进行计算。虽然“引擎”和“框架”之间的区别没有什么权威的定义,但大部分时候可以将前者定义为实际负责处理数据操作的组件,后者则可定义为承担类似作用的一系列组件。

例如Apache Hadoop可以看作一种以MapReduce作为默认处理引擎的处理框架。引擎和框架通常可以相互替换或同时使用。例如另一个框架Apache Spark可以纳入Hadoop并取代MapReduce。组件之间的这种互操作性是大数据系统灵活性如此之高的原因之一。

虽然负责处理生命周期内这一阶段数据的系统通常都很复杂,但从广义层面来看它们的目标是非常一致的:通过对数据执行操作提高理解能力,揭示出数据蕴含的模式,并针对复杂互动获得见解。

为了简化这些组件的讨论,我们会通过不同处理框架的设计意图,按照所处理的数据状态对其进行分类。一些系统可以用批处理方式处理数据,一些系统可以用流方式处理连续不断流入系统的数据。此外还有一些系统可以同时处理这两类数据。

在深入介绍不同实现的指标和结论之前,首先需要对不同处理类型的概念进行一个简单的介绍。

批处理系统

批处理在大数据世界有着悠久的历史。批处理主要操作大容量静态数据集,并在计算过程完成后返回结果。

批处理模式中使用的数据集通常符合下列特征…

· 有界:批处理数据集代表数据的有限集合

· 持久:数据通常始终存储在某种类型的持久存储位置中

· 大量:批处理操作通常是处理极为海量数据集的唯一方法

批处理非常适合需要访问全套记录才能完成的计算工作。例如在计算总数和平均数时,必须将数据集作为一个整体加以处理,而不能将其视作多条记录的集合。这些操作要求在计算进行过程中数据维持自己的状态。

需要处理大量数据的任务通常最适合用批处理操作进行处理。无论直接从持久存储设备处理数据集,或首先将数据集载入内存,批处理系统在设计过程中就充分考虑了数据的量,可提供充足的处理资源。由于批处理在应对大量持久数据方面的表现极为出色,因此经常被用于对历史数据进行分析。

大量数据的处理需要付出大量时间,因此批处理不适合对处理时间要求较高的场合。

Apache Hadoop

Apache Hadoop是一种专用于批处理的处理框架。Hadoop是首个在开源社区获得极大关注的大数据框架。基于谷歌有关海量数据处理所发表的多篇论文与经验的Hadoop重新实现了相关算法和组件堆栈,让大规模批处理技术变得更易用。

新版Hadoop包含多个组件,即多个层,通过配合使用可处理批数据:

HDFS:HDFS是一种分布式文件系统层,可对集群节点间的存储和复制进行协调。HDFS确保了无法避免的节点故障发生后数据依然可用,可将其用作数据来源,可用于存储中间态的处理结果,并可存储计算的最终结果。

YARN:YARN是Yet Another Resource Negotiator(另一个资源管理器)的缩写,可充当Hadoop堆栈的集群协调组件。该组件负责协调并管理底层资源和调度作业的运行。通过充当集群资源的接口,YARN使得用户能在Hadoop集群中使用比以往的迭代方式运行更多类型的工作负载。

MapReduce:MapReduce是Hadoop的原生批处理引擎。

批处理模式

Hadoop的处理功能来自MapReduce引擎。MapReduce的处理技术符合使用键值对的map、shuffle、reduce算法要求。基本处理过程包括:

从HDFS文件系统读取数据集

将数据集拆分成小块并分配给所有可用节点

针对每个节点上的数据子集进行计算(计算的中间态结果会重新写入HDFS)

重新分配中间态结果并按照键进行分组

通过对每个节点计算的结果进行汇总和组合对每个键的值进行“Reducing”

将计算而来的最终结果重新写入 HDFS

优势和局限

由于这种方法严重依赖持久存储,每个任务需要多次执行读取和写入操作,因此速度相对较慢。但另一方面由于磁盘空间通常是服务器上最丰富的资源,这意味着MapReduce可以处理非常海量的数据集。同时也意味着相比其他类似技术,Hadoop的MapReduce通常可以在廉价硬件上运行,因为该技术并不需要将一切都存储在内存中。MapReduce具备极高的缩放潜力,生产环境中曾经出现过包含数万个节点的应用。

MapReduce的学习曲线较为陡峭,虽然Hadoop生态系统的其他周边技术可以大幅降低这一问题的影响,但通过Hadoop集群快速实现某些应用时依然需要注意这个问题。

围绕Hadoop已经形成了辽阔的生态系统,Hadoop集群本身也经常被用作其他软件的组成部件。很多其他处理框架和引擎通过与Hadoop集成也可以使用HDFS和YARN资源管理器。

总结

Apache Hadoop及其MapReduce处理引擎提供了一套久经考验的批处理模型,最适合处理对时间要求不高的非常大规模数据集。通过非常低成本的组件即可搭建完整功能的Hadoop集群,使得这一廉价且高效的处理技术可以灵活应用在很多案例中。与其他框架和引擎的兼容与集成能力使得Hadoop可以成为使用不同技术的多种工作负载处理平台的底层基础。

流处理系统

流处理系统会对随时进入系统的数据进行计算。相比批处理模式,这是一种截然不同的处理方式。流处理方式无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作。

流处理中的数据集是“无边界”的,这就产生了几个重要的影响:

完整数据集只能代表截至目前已经进入到系统中的数据总量。

工作数据集也许更相关,在特定时间只能代表某个单一数据项。

处理工作是基于事件的,除非明确停止否则没有“尽头”。处理结果立刻可用,并会随着新数据的抵达继续更新。

流处理系统可以处理几乎无限量的数据,但同一时间只能处理一条(真正的流处理)或很少量(微批处理,Micro-batch Processing)数据,不同记录间只维持最少量的状态。虽然大部分系统提供了用于维持某些状态的方法,但流处理主要针对副作用更少,更加功能性的处理(Functional processing)进行优化。

功能性操作主要侧重于状态或副作用有限的离散步骤。针对同一个数据执行同一个操作会或略其他因素产生相同的结果,此类处理非常适合流处理,因为不同项的状态通常是某些困难、限制,以及某些情况下不需要的结果的结合体。因此虽然某些类型的状态管理通常是可行的,但这些框架通常在不具备状态管理机制时更简单也更高效。

此类处理非常适合某些类型的工作负载。有近实时处理需求的任务很适合使用流处理模式。分析、服务器或应用程序错误日志,以及其他基于时间的衡量指标是最适合的类型,因为对这些领域的数据变化做出响应对于业务职能来说是极为关键的。流处理很适合用来处理必须对变动或峰值做出响应,并且关注一段时间内变化趋势的数据。

Apache Storm

Apache Storm是一种侧重于极低延迟的流处理框架,也许是要求近实时处理的工作负载的最佳选择。该技术可处理非常大量的数据,通过比其他解决方案更低的延迟提供结果。

 流处理模式

Storm的流处理可对框架中名为Topology(拓扑)的DAG(Directed Acyclic Graph,有向无环图)进行编排。这些拓扑描述了当数据片段进入系统后,需要对每个传入的片段执行的不同转换或步骤。

 拓扑包含

Stream:普通的数据流,这是一种会持续抵达系统的无边界数据。

Spout:位于拓扑边缘的数据流来源,例如可以是API或查询等,从这里可以产生待处理的数据。

Bolt:Bolt代表需要消耗流数据,对其应用操作,并将结果以流的形式进行输出的处理步骤。Bolt需要与每个Spout建立连接,随后相互连接以组成所有必要的处理。在拓扑的尾部,可以使用最终的Bolt输出作为相互连接的其他系统的输入。

Storm背后的想法是使用上述组件定义大量小型的离散操作,随后将多个组件组成所需拓扑。默认情况下Storm提供了“至少一次”的处理保证,这意味着可以确保每条消息至少可以被处理一次,但某些情况下如果遇到失败可能会处理多次。Storm无法确保可以按照特定顺序处理消息。

为了实现严格的一次处理,即有状态处理,可以使用一种名为Trident的抽象。严格来说不使用Trident的Storm通常可称之为Core Storm。Trident会对Storm的处理能力产生极大影响,会增加延迟,为处理提供状态,使用微批模式代替逐项处理的纯粹流处理模式。

为避免这些问题,通常建议Storm用户尽可能使用Core Storm。然而也要注意,Trident对内容严格的一次处理保证在某些情况下也比较有用,例如系统无法智能地处理重复消息时。如果需要在项之间维持状态,例如想要计算一个小时内有多少用户点击了某个链接,此时Trident将是你唯一的选择。尽管不能充分发挥框架与生俱来的优势,但Trident提高了Storm的灵活性。

 Trident拓扑包含:

流批(Stream batch):这是指流数据的微批,可通过分块提供批处理语义。

操作(Operation):是指可以对数据执行的批处理过程。

 优势和局限

目前来说Storm可能是近实时处理领域的最佳解决方案。该技术可以用极低延迟处理数据,可用于希望获得最低延迟的工作负载。如果处理速度直接影响用户体验,例如需要将处理结果直接提供给访客打开的网站页面,此时Storm将会是一个很好的选择。

Storm与Trident配合使得用户可以用微批代替纯粹的流处理。虽然借此用户可以获得更大灵活性打造更符合要求的工具,但同时这种做法会削弱该技术相比其他解决方案最大的优势。话虽如此,但多一种流处理方式总是好的。

Core Storm无法保证消息的处理顺序。Core Storm为消息提供了“至少一次”的处理保证,这意味着可以保证每条消息都能被处理,但也可能发生重复。Trident提供了严格的一次处理保证,可以在不同批之间提供顺序处理,但无法在一个批内部实现顺序处理。

在互操作性方面,Storm可与Hadoop的YARN资源管理器进行集成,因此可以很方便地融入现有Hadoop部署。除了支持大部分处理框架,Storm还可支持多种语言,为用户的拓扑定义提供了更多选择。

 总结

对于延迟需求很高的纯粹的流处理工作负载,Storm可能是最适合的技术。该技术可以保证每条消息都被处理,可配合多种编程语言使用。由于Storm无法进行批处理,如果需要这些能力可能还需要使用其他软件。如果对严格的一次处理保证有比较高的要求,此时可考虑使用Trident。不过这种情况下其他流处理框架也许更适合。

 Apache Samza

Apache Samza是一种与Apache Kafka消息系统紧密绑定的流处理框架。虽然Kafka可用于很多流处理系统,但按照设计,Samza可以更好地发挥Kafka独特的架构优势和保障。该技术可通过Kafka提供容错、缓冲,以及状态存储。

Samza可使用YARN作为资源管理器。这意味着默认情况下需要具备Hadoop集群(至少具备HDFS和YARN),但同时也意味着Samza可以直接使用YARN丰富的内建功能。

 流处理模式

Samza依赖Kafka的语义定义流的处理方式。Kafka在处理数据时涉及下列概念:

Topic(话题):进入Kafka系统的每个数据流可称之为一个话题。话题基本上是一种可供消耗方订阅的,由相关信息组成的数据流。

Partition(分区):为了将一个话题分散至多个节点,Kafka会将传入的消息划分为多个分区。分区的划分将基于键(Key)进行,这样可以保证包含同一个键的每条消息可以划分至同一个分区。分区的顺序可获得保证。

Broker(代理):组成Kafka集群的每个节点也叫做代理。

Producer(生成方):任何向Kafka话题写入数据的组件可以叫做生成方。生成方可提供将话题划分为分区所需的键。

Consumer(消耗方):任何从Kafka读取话题的组件可叫做消耗方。消耗方需要负责维持有关自己分支的信息,这样即可在失败后知道哪些记录已经被处理过了。

由于Kafka相当于永恒不变的日志,Samza也需要处理永恒不变的数据流。这意味着任何转换创建的新数据流都可被其他组件所使用,而不会对最初的数据流产生影响。

 优势和局限

乍看之下,Samza对Kafka类查询系统的依赖似乎是一种限制,然而这也可以为系统提供一些独特的保证和功能,这些内容也是其他流处理系统不具备的。

例如Kafka已经提供了可以通过低延迟方式访问的数据存储副本,此外还可以为每个数据分区提供非常易用且低成本的多订阅者模型。所有输出内容,包括中间态的结果都可写入到Kafka,并可被下游步骤独立使用。

这种对Kafka的紧密依赖在很多方面类似于MapReduce引擎对HDFS的依赖。虽然在批处理的每个计算之间对HDFS的依赖导致了一些严重的性能问题,但也避免了流处理遇到的很多其他问题。

Samza与Kafka之间紧密的关系使得处理步骤本身可以非常松散地耦合在一起。无需事先协调,即可在输出的任何步骤中增加任意数量的订阅者,对于有多个团队需要访问类似数据的组织,这一特性非常有用。多个团队可以全部订阅进入系统的数据话题,或任意订阅其他团队对数据进行过某些处理后创建的话题。这一切并不会对数据库等负载密集型基础架构造成额外的压力。

直接写入Kafka还可避免回压(Backpressure)问题。回压是指当负载峰值导致数据流入速度超过组件实时处理能力的情况,这种情况可能导致处理工作停顿并可能丢失数据。按照设计,Kafka可以将数据保存很长时间,这意味着组件可以在方便的时候继续进行处理,并可直接重启动而无需担心造成任何后果。

Samza可以使用以本地键值存储方式实现的容错检查点系统存储数据。这样Samza即可获得“至少一次”的交付保障,但面对由于数据可能多次交付造成的失败,该技术无法对汇总后状态(例如计数)提供精确恢复。

Samza提供的高级抽象使其在很多方面比Storm等系统提供的基元(Primitive)更易于配合使用。目前Samza只支持JVM语言,这意味着它在语言支持方面不如Storm灵活。

总结

对于已经具备或易于实现Hadoop和Kafka的环境,Apache Samza是流处理工作负载一个很好的选择。Samza本身很适合有多个团队需要使用(但相互之间并不一定紧密协调)不同处理阶段的多个数据流的组织。Samza可大幅简化很多流处理工作,可实现低延迟的性能。如果部署需求与当前系统不兼容,也许并不适合使用,但如果需要极低延迟的处理,或对严格的一次处理语义有较高需求,此时依然适合考虑。

 混合处理系统:批处理和流处理

一些处理框架可同时处理批处理和流处理工作负载。这些框架可以用相同或相关的组件和API处理两种类型的数据,借此让不同的处理需求得以简化。

如你所见,这一特性主要是由Spark和Flink实现的,下文将介绍这两种框架。实现这样的功能重点在于两种不同处理模式如何进行统一,以及要对固定和不固定数据集之间的关系进行何种假设。

虽然侧重于某一种处理类型的项目会更好地满足具体用例的要求,但混合框架意在提供一种数据处理的通用解决方案。这种框架不仅可以提供处理数据所需的方法,而且提供了自己的集成项、库、工具,可胜任图形分析、机器学习、交互式查询等多种任务。

 Apache Spark

Apache Spark是一种包含流处理能力的下一代批处理框架。与Hadoop的MapReduce引擎基于各种相同原则开发而来的Spark主要侧重于通过完善的内存计算和处理优化机制加快批处理工作负载的运行速度。

Spark可作为独立集群部署(需要相应存储层的配合),或可与Hadoop集成并取代MapReduce引擎。

批处理模式

与MapReduce不同,Spark的数据处理工作全部在内存中进行,只在一开始将数据读入内存,以及将最终结果持久存储时需要与存储层交互。所有中间态的处理结果均存储在内存中。

虽然内存中处理方式可大幅改善性能,Spark在处理与磁盘有关的任务时速度也有很大提升,因为通过提前对整个任务集进行分析可以实现更完善的整体式优化。为此Spark可创建代表所需执行的全部操作,需要操作的数据,以及操作和数据之间关系的Directed Acyclic Graph(有向无环图),即DAG,借此处理器可以对任务进行更智能的协调。

为了实现内存中批计算,Spark会使用一种名为Resilient Distributed Dataset(弹性分布式数据集),即RDD的模型来处理数据。这是一种代表数据集,只位于内存中,永恒不变的结构。针对RDD执行的操作可生成新的RDD。每个RDD可通过世系(Lineage)回溯至父级RDD,并最终回溯至磁盘上的数据。Spark可通过RDD在无需将每个操作的结果写回磁盘的前提下实现容错。

流处理模式

流处理能力是由Spark Streaming实现的。Spark本身在设计上主要面向批处理工作负载,为了弥补引擎设计和流处理工作负载特征方面的差异,Spark实现了一种叫做微批(Micro-batch)*的概念。在具体策略方面该技术可以将数据流视作一系列非常小的“批”,借此即可通过批处理引擎的原生语义进行处理。

Spark Streaming会以亚秒级增量对流进行缓冲,随后这些缓冲会作为小规模的固定数据集进行批处理。这种方式的实际效果非常好,但相比真正的流处理框架在性能方面依然存在不足。

 优势和局限

使用Spark而非Hadoop MapReduce的主要原因是速度。在内存计算策略和先进的DAG调度等机制的帮助下,Spark可以用更快速度处理相同的数据集。

Spark的另一个重要优势在于多样性。该产品可作为独立集群部署,或与现有Hadoop集群集成。该产品可运行批处理和流处理,运行一个集群即可处理不同类型的任务。

除了引擎自身的能力外,围绕Spark还建立了包含各种库的生态系统,可为机器学习、交互式查询等任务提供更好的支持。相比MapReduce,Spark任务更是“众所周知”地易于编写,因此可大幅提高生产力。

为流处理系统采用批处理的方法,需要对进入系统的数据进行缓冲。缓冲机制使得该技术可以处理非常大量的传入数据,提高整体吞吐率,但等待缓冲区清空也会导致延迟增高。这意味着Spark Streaming可能不适合处理对延迟有较高要求的工作负载。

由于内存通常比磁盘空间更贵,因此相比基于磁盘的系统,Spark成本更高。然而处理速度的提升意味着可以更快速完成任务,在需要按照小时数为资源付费的环境中,这一特性通常可以抵消增加的成本。

Spark内存计算这一设计的另一个后果是,如果部署在共享的集群中可能会遇到资源不足的问题。相比Hadoop MapReduce,Spark的资源消耗更大,可能会对需要在同一时间使用集群的其他任务产生影响。从本质来看,Spark更不适合与Hadoop堆栈的其他组件共存一处。

 总结

Spark是多样化工作负载处理任务的最佳选择。Spark批处理能力以更高内存占用为代价提供了无与伦比的速度优势。对于重视吞吐率而非延迟的工作负载,则比较适合使用Spark Streaming作为流处理解决方案。

Apache Flink

Apache Flink是一种可以处理批处理任务的流处理框架。该技术可将批处理数据视作具备有限边界的数据流,借此将批处理任务作为流处理的子集加以处理。为所有处理任务采取流处理为先的方法会产生一系列有趣的副作用。

这种流处理为先的方法也叫做Kappa架构,与之相对的是更加被广为人知的Lambda架构(该架构中使用批处理作为主要处理方法,使用流作为补充并提供早期未经提炼的结果)。Kappa架构中会对一切进行流处理,借此对模型进行简化,而这一切是在最近流处理引擎逐渐成熟后才可行的。

 流处理模型

Flink的流处理模型在处理传入数据时会将每一项视作真正的数据流。Flink提供的DataStream API可用于处理无尽的数据流。Flink可配合使用的基本组件包括:

Stream(流)是指在系统中流转的,永恒不变的无边界数据集

Operator(操作方)是指针对数据流执行操作以产生其他数据流的功能

Source(源)是指数据流进入系统的入口点

Sink(槽)是指数据流离开Flink系统后进入到的位置,槽可以是数据库或到其他系统的连接器

为了在计算过程中遇到问题后能够恢复,流处理任务会在预定时间点创建快照。为了实现状态存储,Flink可配合多种状态后端系统使用,具体取决于所需实现的复杂度和持久性级别。

此外Flink的流处理能力还可以理解“事件时间”这一概念,这是指事件实际发生的时间,此外该功能还可以处理会话。这意味着可以通过某种有趣的方式确保执行顺序和分组。

 批处理模型

Flink的批处理模型在很大程度上仅仅是对流处理模型的扩展。此时模型不再从持续流中读取数据,而是从持久存储中以流的形式读取有边界的数据集。Flink会对这些处理模型使用完全相同的运行时。

Flink可以对批处理工作负载实现一定的优化。例如由于批处理操作可通过持久存储加以支持,Flink可以不对批处理工作负载创建快照。数据依然可以恢复,但常规处理操作可以执行得更快。

另一个优化是对批处理任务进行分解,这样即可在需要的时候调用不同阶段和组件。借此Flink可以与集群的其他用户更好地共存。对任务提前进行分析使得Flink可以查看需要执行的所有操作、数据集的大小,以及下游需要执行的操作步骤,借此实现进一步的优化。

优势和局限

Flink目前是处理框架领域一个独特的技术。虽然Spark也可以执行批处理和流处理,但Spark的流处理采取的微批架构使其无法适用于很多用例。Flink流处理为先的方法可提供低延迟,高吞吐率,近乎逐项处理的能力。

Flink的很多组件是自行管理的。虽然这种做法较为罕见,但出于性能方面的原因,该技术可自行管理内存,无需依赖原生的Java垃圾回收机制。与Spark不同,待处理数据的特征发生变化后Flink无需手工优化和调整,并且该技术也可以自行处理数据分区和自动缓存等操作。

Flink会通过多种方式对工作进行分许进而优化任务。这种分析在部分程度上类似于SQL查询规划器对关系型数据库所做的优化,可针对特定任务确定最高效的实现方法。该技术还支持多阶段并行执行,同时可将受阻任务的数据集合在一起。对于迭代式任务,出于性能方面的考虑,Flink会尝试在存储数据的节点上执行相应的计算任务。此外还可进行“增量迭代”,或仅对数据中有改动的部分进行迭代。

在用户工具方面,Flink提供了基于Web的调度视图,借此可轻松管理任务并查看系统状态。用户也可以查看已提交任务的优化方案,借此了解任务最终是如何在集群中实现的。对于分析类任务,Flink提供了类似SQL的查询,图形化处理,以及机器学习库,此外还支持内存计算。

Flink能很好地与其他组件配合使用。如果配合Hadoop 堆栈使用,该技术可以很好地融入整个环境,在任何时候都只占用必要的资源。该技术可轻松地与YARN、HDFS和Kafka 集成。在兼容包的帮助下,Flink还可以运行为其他处理框架,例如Hadoop和Storm编写的任务。

目前Flink最大的局限之一在于这依然是一个非常“年幼”的项目。现实环境中该项目的大规模部署尚不如其他处理框架那么常见,对于Flink在缩放能力方面的局限目前也没有较为深入的研究。随着快速开发周期的推进和兼容包等功能的完善,当越来越多的组织开始尝试时,可能会出现越来越多的Flink部署。

总结

Flink提供了低延迟流处理,同时可支持传统的批处理任务。Flink也许最适合有极高流处理需求,并有少量批处理任务的组织。该技术可兼容原生Storm和Hadoop程序,可在YARN管理的集群上运行,因此可以很方便地进行评估。快速进展的开发工作使其值得被大家关注。

结论

大数据系统可使用多种处理技术。

对于仅需要批处理的工作负载,如果对时间不敏感,比其他解决方案实现成本更低的Hadoop将会是一个好选择。

对于仅需要流处理的工作负载,Storm可支持更广泛的语言并实现极低延迟的处理,但默认配置可能产生重复结果并且无法保证顺序。Samza与YARN和Kafka紧密集成可提供更大灵活性,更易用的多团队使用,以及更简单的复制和状态管理。

对于混合型工作负载,Spark可提供高速批处理和微批处理模式的流处理。该技术的支持更完善,具备各种集成库和工具,可实现灵活的集成。Flink提供了真正的流处理并具备批处理能力,通过深度优化可运行针对其他平台编写的任务,提供低延迟的处理,但实际应用方面还为时过早。

最适合的解决方案主要取决于待处理数据的状态,对处理所需时间的需求,以及希望得到的结果。具体是使用全功能解决方案或主要侧重于某种项目的解决方案,这个问题需要慎重权衡。随着逐渐成熟并被广泛接受,在评估任何新出现的创新型解决方案时都需要考虑类似的问题。

0