一个列族在数据底层是一个文件,所以将经常一起查询的列放到一个列族中,列族尽量少,减少文件的寻址时间。
23 面试题参考文档:***4#(5)%6
用 怎么处理数据倾斜问题?
数据倾斜:# 程序执行时,# 节点大部分执行完毕,但是有一个或者几个 # 节点运行很慢,导致整个程
序的处理时间很长,这是因为某一个 1 的条数比其他 1 多很多(有时是百倍或者千倍之多),这条 1 所在的 # 节
点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完,此称之为数据倾斜。
用 程序进行数据关联时,常碰到数据倾斜的情况,这里提供一种解决方法。
自己实现 $$ 类,用 1 和 !# 相加取 值:
方式 :
源代码:
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
修改后
public int getPartition(K key, V value, int numReduceTasks) {
return (((key).hashCode()+value.hashCode()) & Integer.MAX_VALUE) % numReduceTasks;
}
方式 2:
public class HashPartitioner<K, V> extends Partitioner<K, V> {
private int aa= 0;
/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode()+(aa++) & Integer.MAX_VALUE) % numReduceTasks;
}
Hive 的话可以设置这个参数
set hive.groupby.skewindata=true;
1、调优参数
&&&&set&hive.map.aggr=true;
&&&&set&hive.groupby.skewindata=true;
2、在 key 上面做文章,在 map 阶段将造成倾斜的 key 先分成多组,例如 aaa 这个 key,map 时随机在 aaa 后面加上
1,2,3,4 这四个数字之一,把 key 先分成四组,先进行一次运算,之后再恢复 key 进行最终运算。
3、能先进行 group 操作的时候先进行 group 操作,把 key 先进行一次 reduce,之后再进行 count 或者 distinct count
操作。
4、join 操作中,使用 map join 在 map 端就先进行 join ,免得到 reduce 时卡住。
参考文档:https://blog.csdn.net/chyeers/article/details/78320778
优化:从应用程序角度进行优化
() 避免不必要的 # 任务
如果 # 程序中 # 是不必要的,那么我们可以在 中处理数据-0# 设置为 5。这样避免了多余的 #
任务。