我写了一个带有SPARK的自定义RDD提供商,并在SQL查询下测试其执行时间。我不确定该提供商的内部机制与该问题有关,但基本上是用于读取本地和远程文件的数据。
问题:使用"不同"关键字运行查询(无论是否用于聚合问题)对查询的性能有很大的影响。
示例:
查询:从表中选择SourceIP,SourcePort,destination Port执行时间:31527 MS
查询:从destination = 80执行时间:57856 MS
当我尝试在中等尺寸的数据集中使用"太多的开放文件"来运行它时,此结果是非常少量的数据日志是:
/tmp/spark-a47f859b-2a1f-4466-8333-0bf40c3968eb/executor-9c98264a-23a8-49b8-ab6f-ddf7349e0155/blockmgr-b73fc639-8705-4956-8652-e7300b35527a/3f/temp_shuffle_b4afe57f-9db1-4653-91c0-22d207933748 (Too many open files)
对于透视图,使用独特的粉碎群集使用5分钟的数据,其中没有不同的服务器成功运行2天查询。
有什么想法会导致这个问题?
P.S。我使用以下方式验证了打开文件的数量及其限制:
open files: `lsof | wc -l` resulted in ~1.4M
max open files: `cat /proc/sys/fs/file-max` resulted in 9-42M (depending on machine - master had 9M)
以下两个步骤可帮助您调试问题:
1)Distract()肯定是在分区中进行洗牌。要查看更多发生的事情,请在RDD上运行.todebugstring?。
2)您可以检查您的工作是否适当并行使用Spark UI进行检查?
还检查您的分区是偏斜,这里是用于进一步阅读
当然,如果您的查询在其中不同。
select sourceip, sourceport, destinationport from table where destinationport=80
这是一个简单的选择滤波器查询。因此,它不需要任何洗牌。Spark将进行谓词下降,并仅使用过滤器操作给出结果
select distinct sourceip, sourceport, destinationport from events where destinationport=80
在这里你有独特的。这本质上要求Spark做洗牌。它将首先过滤结果,然后计算每个结果的哈希值,然后进行减少操作以删除重复结果(相同的哈希多行沸腾到一行)
现在,随机混乱是一个相对昂贵的操作,因为它需要通过网络发送数据,因此第二个查询将比以前的