扫码关注公众号
要从1000个数据元素中选五个最小的,下面排序算法中,那个算法最快?()
正确答案是C简单选择排序,每轮选出最小的一个元素,那么5轮就完成了任务,比较次数为1000+999+998+997+996=5000-10=4990次。而C选项,堆排序,首先需要建堆,建堆时间复杂度是O(n),根据《算法导论》上chap6的公式推导,建堆时间的上界是O(2n),那么需要2000次比较。接下来依次挑选最小的元素,每次挑选完一个元素,都需要重新调整堆,调整堆的时间复杂度为O(logn)。根据《算法导论》的推导是T(n)<=T(2n/3)+O(1),把n=1024带入,发现对调整时间大约为10次,并且推导中的O(1)时间是用于调整根节点、左儿子、右儿子这3个节点的时间,显然时间开销小于10次,那么5次取最小元素的时间开销就小于5*10*10=500,所以总时间开销不足2500次。
.hdfs写文件的步骤
(1)client向NameNode申请上传…/xxx.txt文件(2)NN向client响应可以上传文件(3)Client向NameNode申请DataNode(4)NN向Client返回DN1,DN2,DN3(5)Client向DN1,DN2,DN3申请建立文件传输通道(6)DN3,DN2,DN1依次响应连接(7)Client向DN1上传一个block,DN1向DN2,DN3冗余文件
Hadoop解决数据倾斜方法
1、提前在map进行combine,减少传输的数据量在Mapper加上combiner相当于提前进行reduce,即把一个Mapper中的相同key进行了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量。如果导致数据倾斜的key大量分布在不同的mapper的时候,这种方法就不是很有效了。2、导致数据倾斜的key大量分布在不同的mapper(1)局部聚合加全局聚合第一次在map阶段对那些导致了数据倾斜的key加上1到n的随机前缀,这样本来相同的key也会被分到多个Reducer中进行局部聚合,数量就会大大降低。第二次mapreduce,去掉key的随机前缀,进行全局聚合。思想:二次mr,第一次将key随机散列到不同reducer进行处理达到负载均衡目的。第二次再根据去掉key的随机前缀,按原key进行reduce处理。这个方法进行两次mapreduce,性能稍差。(2)增加Reducer,提升并行度JobConf.setNumReduceTasks(int)(3)实现自定义分区根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer