Spark-使用问题总结

来源:互联网 发布:sql group by多个字段 编辑:程序博客网 时间:2024/06/06 12:33

前言

通过前面两篇文章的学习,对大数据运用中遇到的问题基本可以解决,本篇文章再补充一些前面没有提到的问题和知识点,希望避免大家踩坑。

map数目控制

通过前面的文章对参数调优有了基本认识,这里再补充一点我在hadoop streaming中关于map数目控制的知识。通过参数控制使得每个map处理的数据量基本均衡,加快运行时间,避免出现因为数据量的不均衡导致的时间浪费。
map数目默认情况下是和文件的分片数目相同(default_num),系统默认是64m或者是128m,比如说如果输入文件大小是70m左右,这样同一个文件就会需要两个map进行处理,一个是64m一个是6m,造成处理数据的不均衡,这种情况下可以通过设置如下参数(split_num),将split大小设为40m,参数的单位是byte,保证一个文件有两个map处理,并且处理的数据量大致相等。
-D mapred.min.split.size=41943040
很多博客中说可以通过参数mapred.map.tasks(goal_num)来设置程序员期望的map个数,但是个数只有在大于default_num的时候,才会生效。我通过实验发现貌似并不是这样,相反,只有该参数小于default_num,才会生效,也就是取两者中的最小值。如果错误,欢迎指正。
-D mapred.map.tasks= 600
最终map的数目个数的计算就是
compute_map_num = min(split_num,  max(default_num, goal_num))
既然存在文件太大需要拆分,也必然会存在文件过小需要合并。这种情况本人还没有遇到过,做个标记遇见后再进行处理。

数据倾斜

这个问题在前面的两篇文章中已经有所介绍,就不再赘述,提供pyspark下跑通的代码示例,pyspark的示例比较少,可以给大家做个参考,发生了数据倾斜,统计key的分布,将倾斜的数据过滤出来进行单独处理,本人使用的是map join。aData和aBigData数据做join发生数据倾斜,代码如下:
计算各个key的数目:
 aCount = aData.groupBy(a.name).count()
过滤出倾斜数据:
aLargeCount = aCount.filter("count > 100000")
取出倾斜数据的key,collect到Driver端,为和大表进行join做准备:
aLarge = aLargeCount.select("name").rdd.map(lambda x:x[0]).collect()
map join操作:
aLargeBC = sc.broadcast(aLarge)
aLargeSku = aBigData.filter(col("name").isin(aLargeBC.value))


总结:
先补充上面两个小的知识点,遇到新的问题再进行补充,欢迎读者指正文中存在的问题。

原创粉丝点击