mr spark storm 都是分布式计算框架,他们之间不是谁替换谁的问题,是谁适合做什么的问题。
mr特点,移动计算,而不移动数据。 把我们的计算程序下发到不同的机器上面运行,但是不移动数据。
每一个split 是由一个map线程,还是map进程进行处理? 肯定的是,他们之间是并发的。
mr的shuffle阶段,是比较难于理解的,不太便于我们去控制他,我们只能通过程序,控制其中的一部分。shuffle阶段,大多数都是有MR框架自动完成的。
溢写到磁盘中:map执行完成,结果肯定是放在内存中的。 所以达到一定数量之后,就需要溢写到磁盘中。在这之前,需要进行分区(partition)和把当前这个map的输出数据进行排序(sotred)
所以说,写到磁盘中的数据已经分好区了,并且已经排好序了。这都是在map任务所在节点的本地执行的。 其中partition暂时没有体现出作用。而是在fetch的过程中提现出来的。是按照什么
进行分区的呢?是看partition是怎么写的。partition可以由程序员自己写。按照程序员自己的规则实现。也可以不写,有默认的分区规则。默认分区规则是hash模运算(1,获取hash值
,是一个int。2,把这个int值对reduce的个数取模),默认的partition是有可能产生数据倾斜的。比如有两个reduce,没所有map产生的所有结果取模的时候,打个比方,
共有10个map结果,有9个都会1,只有1个为0,这就产生了数据倾斜。
mr如何解决数据倾斜问题和负载均衡。就是通过partition来实现的。如果发现数据倾斜问题,修改我们的partition算法就可以了。
排序,排序的关键是如何比较两个对象,mr自己也有自带的排序规则。默认的是按照对象所对应的ascii码值来排序的,或者说就是按照字典排序
分区不是立刻把数据都分开,而是打一个标号,标注,你是 1区的,你是2区的。在数据传输的 时候才会真正的分开,就是fetch阶段
merge ondisk每次溢写,都会产生一个文件,注意,不是追加,所以溢写次数越多,产生的文件数越多,怎么办呢,需要和并,和并成为一个大一点的文件,和并也有规则,默认按照
hash值和并。你的键的hash进行合并,键相同,就进行合并。合并规则也可以自定义。是combiner,就是每次合并,都会执行combiner的代码。 目的是加快拷贝速度,因为文件数量越少,拷贝越快。
溢写的时候,map任务可能还没有执行完,故可能一次map任务会有多次的溢写。所以会产生多个文件
把map结果的机器上把分给我这个reduce数据拷贝过来,拷贝是根据partition的结果来拷贝的。由于是从多个map的节点上拷贝数据,所以会有多个小文件,此时又会进行一次合并,这次
合并不能人为控制。这次合并,只要是key相同的都会进行合并,这个相同的key,可能来自于不同的map task。合并完成之后,相同key的数据都会在一起。分别传给reduce执行,这个
不是并发的,但是两个reduce是并发的。
比较会调用多次。
先partition,后入 memory buffer
partition是对map的每个结果的分区规则的运算
大数据的两个方向:
1.大数据变成和运维方向
2.数据建模方向,必须是统计学和数据学出来的人。