关于数据倾斜
我们分组统计,结果分组字段分布很不均匀,大的key造成所在机器内存不足,长时间处理不完,导致任务不能结束
1.MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,效率也会高很多
mapjion虽然省去小表的磁盘读写开销,join操作的匹配命中率还是很低。
我们有个类似的例子:
有一个小表由,起始ip地址,结束ip地址,地域code组成,我们要根据访问的IP地址取地域code,我们 1.将80万的记录按起始iP排序,并保存文件到hdfs.2.写udf将文件读入内存,通过二分法查找匹配,不需要产生join后的笛卡尔积, 速度提高了很多。
2.数据采样
3.优化SQL,缩小小表记录,设定 hive.groupby.skewindata=true
4.预处理,提前统计结果,写入hdfs
sqoop 导出数据到mysql
sqoop效率不错,但是导出hive表时,一次只能导出一个分区文件,hive提供的dboutput导入数据是一条数据建立一次连接,我们改造了这个类,做了批量预处理10000条建立一次数据库连接
hive表的唯一主键
大数据理论上是不能有主键的,但是有些情况下,需要主键来标识唯一的记录
udf生成主键,一般在数据导入hive的一次全数据扫描过程中进行
键值由:ip+日期+序列数+进程id组成
基于session的页面访问深度的计算
LATERAL VIEW explode
页面访问深度指网站的某个指定页面,一个会话在第几次访问时到达该页面