1. 什么是Hadoop
大数据处理的分布式系统
2. Hadoop****生态圈
三大核心:
HDFS集群:分布式文件存储系统
YARN集群:运算资源调度
MapReduce分布式计算模型
3. 讲一下MapReduce
Map Reduce把一堆杂乱无章的数据按照某种特征归纳起来,然后处理并得到最后的结果Reduce
为海量数据提供计算/抽象成为map和reduce两阶段,屏蔽了分布式计算框架细节
Map对数据集独立元素定制操作,生成键值对的中间结果;
Reduce对中间结果键相同的值进行规约,得到最终结果
4. Spark和Mapreduce的区别
Spark从Mapreduce发展而来,继承了其分布式并行计算的优点,改进了下述缺陷:
a.Spark把中间计算结果存放在内存中,能够实现数据高效共享,迭代运算效率高。Mapreduce中的计算中间结果是保存在磁盘上的,这样必然影响整体运行速度。
b.Spark容错性高。Spark支持DAG图的分布式并行计算,RDD数据集部分丢失,可根据血统来对它们进行重建;同时还有checkpoint容错机制;
c.Spark更加通用。hadoop只提供了map和reduce两种操作,Spark还提供了更多操作,比如map,filter,flatmap,sample,groupbykey,reducebykey,union,join,cogroup,mapvalues,sort,partitionby等转换操作及collect,reduce,lookup和save等行动操作
5. 使用Hadoop需要启动哪些进程
Master节点:
NameNode:管理文件系统
DataNode:文件系统的工作节点
Secondary NameNode:用来监控HDFS的辅助后台程序,存储NameNode的快照,是其备胎
JobTracker:连接应用程序与Hadoop,监控所有task
TaskTracker:从节点上管理各自的Task
Slave****节点:
DataNode:从节点上管理文件
TaskTracker:从节点上管理task
6. HDFS****读写机制
读操作:
1、客户端启动通过调用文件系统对象的 open() 方法读取请求;它是DistributedFileSystem 类型的对象。
2、此对象使用 RPC 连接到 namenode 并获取的元数据信息,如该文件的块的位置。 请注意,这些地址是文件的前几个块。
3、响应该元数据请求,具有该块副本的 DataNodes 地址被返回。
4、一旦接收到 DataNodes的地址,FSDataInputStream类型的一个对象被返回到客户端。 FSDataInputStream包含DFSInputStream这需要处理交互DataNode和NameNode。在上图所示的步骤4,客户端调用 read() 方法,这将导致DFSInputStream 建立与第一个 DataNode 文件的第一个块连接。
5、以数据流的形式读取数据,其中客户端多次调用 “read() ” 方法。 read() 操作这个过程一直持续,直到它到达块结束位置。
6、一旦到块的结尾,DFSInputStream 关闭连接,移动定位到下一个DataNode 的下一个块。
7、一旦客户端已读取完成后,它会调用 close()方法。
写操作:
1、客户端通过调用 DistributedFileSystem对象的create() 方法创建一个新的文件,并开始写操作 - 在上面的图中的步骤1;
2、DistributedFileSystem对象使用 RPC 调用连接到 NameNode,并启动新的文件创建。但是,此文件创建操作不与文件任何块相关联。NameNode 的责任是验证文件(其正被创建的)不存在,并且客户端具有正确权限来创建新文件。如果文件已经存在,或者客户端不具有足够的权限来创建一个新的文件,则抛出 IOException 到客户端。否则操作成功,并且该文件新的记录是由 NameNode 创建;
3、一旦 NameNode 创建一条新的记录,返回FSDataOutputStream 类型的一个对象到客户端。客户端使用它来写入数据到 HDFS。数据写入方法被调用(图中的步骤3)。
4、FSDataOutputStream包含DFSOutputStream对象,它使用 DataNodes 和 NameNode 通信后查找。当客户机继续写入数据,DFSOutputStream 继续创建这个数据包。这些数据包连接排队到一个队列被称为 DataQueue;
5、还有一个名为 DataStreamer 组件,用于消耗DataQueue。DataStreamer 也要求 NameNode 分配新的块,拣选 DataNodes 用于复制;
6、 现在,复制过程始于使用 DataNodes 创建一个管道。 在我们的例子中,选择了复制水平3,因此有3 个 DataNodes 管道;
7、所述 DataStreamer 注入包分成到第一个 DataNode 的管道中。
8、在每个 DataNode 的管道中存储数据包接收并同样转发在第二个 DataNode 的管道中。
9、 另一个队列,“Ack Queue”是由 DFSOutputStream 保持存储,它们是 DataNodes 等待确认的数据包。
10、 一旦确认在队列中的分组从所有 DataNodes 已接收在管道,它从 'Ack Queue' 删除。在任何 DataNode 发生故障时,从队列中的包重新用于操作。
11、在客户端的数据写入完成后,它会调用close()方法(第9步图中),调用close()结果进入到清理缓存剩余数据包到管道之后等待确认。
12、一旦收到最终确认,NameNode 连接告诉它该文件的写操作完成。
7. Hadoop序列化和反序列化
序列化就是把内存中的对象,转换成字节序列以便于存储(持久化)和网络传输。
反序列化就是将收到字节序列或者是硬盘的持久化数据,转换成内存中的对象。
Hadoop的序列化机制:Writable
特点:数据紧凑 对象可重用 可扩展性
8. MapReduce和Spark的shuffle对比
Shuffle是洗牌的逆过程,把一组无规则的数据尽量转换成一组具有一定规则的数据。
从Map端输出到Reduce端输入的过程广义的称为shuffle,处理其间的中间结果
Shuffle****过程本质上都是将Map端获得的数据使用分区器进行划分,并将数据发送给对应的Reducer 的过程。
Shuffle涉及到磁盘读写和网络传输,因此性能高低影响整个程序的运行效率。
Mapreduce:
Map端的spill操作,reduce端的copy/merge/reduce操作
Spark:
在mapredue基础上对排序/合并逻辑做了一些优化
普通机制的Hash Shuffle,通过复用buffer来优化产生小文件的数量的合并机制。
异同:
整体功能上没有大差别。
流程上两者差别不小。 Hadoop MapReduce 是 sort-based,进入 combine和 reduce的 records必须先 sort。这样的好处在于 combine/reduce可以处理大规模的数据,因为其输入数据可以通过外排得到。以前 Spark 默认选择的是 hash-based,通常使用 HashMap 来对 shuffle 来的数据进行合并,不会对数据进行提前排序。如果用户需要经过排序的数据,那么需要自己调用类似 sortByKey的操作。在Spark 1.2之后,sort-based变为默认的Shuffle实现。
流程实现上两者也有不少差别。 Hadoop MapReduce 将处理流程划分出明显的几个阶段:map, spill, merge, shuffle, sort, reduce等。每个阶段各司其职,可以按照过程式的编程思想来逐一实现每个阶段的功能。在 Spark 中,没有这样功能明确的阶段,只有不同的 stage 和一系列的 transformation,所以 spill, merge, aggregate 等操作需要蕴含在 transformation中。