1.combine、partition和shuffer的区别?
combine:
把同一个key的键值对合并在一起,combine函数把一个map函数产生的<key,value>对(多个key,value)合并成一个新的<key2,value2>,将新的<key2,value2>作为输入到reduce函数中,这个value2亦可称之为values,因为有多个。这个合并的目的是为了减少网络传输。
partition:
partition是分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的。这里其实可以理解归类。
partition的作用就是把这些数据归类,主要在Shuffle过程中按照Key值将中间结果分成R份,其中每份都有一个Reduce去负责,可以通过job.setPartitionerClass()方法进行设置,默认的使用hashPartitioner类。
Partitioner:对map()的输出进行partition,即根据key或value及reduce的数量来决定当前的这对键值对最终应该交由哪个reduce处理。默认是对key哈希后再以reduce task数量取模,默认的取模方式只是为了避免数据倾斜。然后该key/value对以及partitionIdx的结果都会被写入环形缓冲区。
shuffle:
shuffle就是map和reduce之间的过程,包含了两端的combine和partition。它比较难以理解,因为我们摸不着,看不到它,它只是理论存在的,而且确实存在,它属于mapreduce的框架。将map端的输入作为reduce的输出。
2. 如何优化网络传输?
1)在分片时,调整分片大小和block块大小相同,不让分片跨界点存放,防止map时跨节点读取数据
2)在溢写时,对小文件进行合并,减少冗余文件,提高传输效率;其次使用combiner,将key相同的键值合并。
3)在shuffle的copy拉去数据时,需要网络传输,默认reduce端会并行从5个map端下载数据,可以调整这个并行默认参数。与此同时,加大下载等待时间,防止网络延迟过大或太慢,导致下载线程误判为失败。
4)使用压缩对数据进行传输。
3. Hadoop中为什么要使用数据压缩?
优点:
1,减少存储磁盘空间,降低单节点的磁盘IO。
2,加快网络传输的效率。
缺点:
需要花费额外的时间/CPU做压缩和解压缩计算
应用场景:
1,数据更多的是被存储,而不是被处理。例如使用HDFS作为数据存储,且上层搭建了Hive数据仓库。
2,数据本身有不错的压缩率。
参考:Hadoop数据压缩
4. Hadoop中的数据压缩有哪几种呢?
输入文件压缩:减少了I/O操作,但加大了cpu的处理时间;
压缩map程序中间输出:压缩这类输出可减少文件从map程序中写入到本地磁盘的文件I/O,也可以减少分区从Mapper节点传输到Reducer节点的网络I/O。;
压缩MapReduce程序的输出:对map和reduce的输出进行压缩;
压缩方式:
根据:压缩大小 压缩速度 是否可分割 冷热数据
压缩方式
Snappy压缩方式比GZIP方式快几个数量级,然而输出文件更大,大出20%-100%
5. hadoop和spark的都是并行计算,那么他们有什么相同和区别呢?
两者都是用mapreduce模型来进行并行计算;
hadoop的一个作业称为job,job里面分为map task和reduce task,每个task都是在自己的进程中运行的,当task结束时,进程也会结束;
Spark用户提交的任务成为application,一个application对应一个sparkcontext,application中存在多个job,每触发一次action操作就会产生一个job;
这些job可以并行或串行执行,每个job中有多个stage,stage是shuffle过程中DAGSchaduler通过RDD之间的依赖关系划分job而来的,每个stage里面有多个task,组成taskset有TaskSchaduler分发到各个executor中执行,executor的生命周期是和app一样的,即使没有job运行也是存在的,所以task可以快速启动读取内存进行计算;
hadoop的job只有map和reduce操作,表达能力比较欠缺而且在mr过程中会重复的读写hdfs,造成大量的io操作,多个job需要自己管理关系;
Spark的迭代计算都是在内存中进行的,API中提供了大量的RDD操作如join,groupby等,而且通过DAG图可以实现良好的容错。