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.数据建模方向,必须是统计学和数据学出来的人。
程序员