倾斜key采样后单独Join方案分析
数据倾斜的时候如果能把Join的方式去除,在Mapper端就能完成Join的操作,这是最好的,但有一个前提条件:要进行Join的RDD,其中有一个RDD的数据比较少。而在实际的生产环境下,有时不具备这样的前提条件,如果两个RDD的数据都比较多,我们将尝试采取进一步的做法来解决这个问题。
首先我们谈采样。采样是有一个数据的全量,假如有100亿条数据,采取一个规则来选取100亿条数据中的一部分数据,如5%、10%、15%,采样通常不可能超过30%的数据。采样算法的优劣决定了采样的效果。所谓采样的效果,即我们采样的结果能否代表全局的数据(100亿条数据)。在Spark中,我们可以直接采用采样算法Sample。采样算法对解决数据倾斜的作用:数据产生数据倾斜是由于某个Key或者某几个Key,数据的Value特别多,进行Shuffle的时候,Key是进行数据分类的依据。如果能够精准地找出是哪个Key或者哪几个Key导致了数据倾斜,这是解决问题的第一步:找出谁导致数据倾斜,就可以进行分而治之。
适用场景
两个RDD/Hive表进行join的时候,如果数据量都比较大,无法采用“解决方案五”,那么此时可以看一下两个RDD/Hive表中的key分布情况。如果出现数据倾斜,是因为其中某一个RDD/Hive表中的少数几个key的数据量过大,而另一个RDD/Hive表中的所有key都分布比较均匀,那么采用这个解决方案是比较合适的。
实现思路
对包含少数几个数据量过大的key的那个RDD,通过sample算子采样出一份样本来&#x