4个简单方法,可提高您的Apache Spark工作性能
|
介绍 在开发Spark应用程序时,最耗时的部分之一是优化。 在此博客文章中,我将提供一些性能提示,以及(至少对我而言)启动时可能会使用的未知配置参数。 因此,我将介绍以下主题:
我们可以改善什么? 1. 使用多个小文件? OpenCostInBytes(来自文档)—可以同时扫描打开文件的估计成本(以字节数衡量)。 将多个文件放入分区时使用。 最好高估一下,然后,具有较小文件的分区将比具有较大文件的分区(首先安排)更快。 默认值为4MB。 spark.conf.set("spark.files.openCostInBytes", SOME_COST_IN_BYTES) 我对包含12,000个文件的1GB文件夹,包含800个文件的7.8GB文件夹和包含1.6k个文件的18GB文件夹进行了测试。 我的目的是弄清楚输入文件是否较小,最好使用低于默认值的文件。 因此,当测试1GB和7.8GB文件夹时-肯定是较低的值,但是测试大约11MB的文件时,较大的参数值会更好。 使用接近您的小文件大小的openCostInBytes大小。 这样会更有效率! 2. 随机分区 开始使用Spark时,我莫名其妙地想到了在创建Spark会话时设置的配置是不可变的。 天哪,我怎么错。 因此,通常,在进行聚集或联接时,spark分区在spark中是一个静态数字(默认为200)。 根据您的数据大小,这会导致两个问题:
因此,在遇到此类问题时遇到了一些麻烦,我在Google上花费了很多时间,发现了这个美丽的东西
可以在运行时中途随时随地更改此整洁的配置,它会影响设置后触发的步骤。 您也可以在创建Spark会话时使用这个坏男孩。 在对联接或聚合进行数据混排时,将使用此分区数量。 还获得数据帧分区计数:
您可以估计最合适的混搭分区数,以进行进一步的联接和聚合。 也就是说,您有一个巨大的数据框,并且想要保留一些信息。 这样就得到了大数据帧的分区数。 将shuffle分区参数设置为此值。 这样一来,加入后就不会成为默认值200! 更多并行性-我们来了! 3. 广播Join 非常简单的情况:我们有一个庞大的表,其中包含所有用户,而我们的表中包含内部用户,质量检查人员和其他不应包含在内的用户。 目标只是离开非内部人员。
它看起来像是一个简单且性能明智的好解决方案。 如果您的小型表小于10MB,则您的小型数据集将在没有任何提示的情况下进行广播。 如果在代码中添加提示,则可能会使它在更大的数据集上运行,但这取决于优化程序的行为。 但是,假设它是100-200MB,并且提示您不要强制广播它。 因此,如果您确信它不会影响代码的性能(或引发一些OOM错误),则可以使用它并覆盖默认值:
在这种情况下,它将广播给所有执行者,并且加入应该工作得更快。
当心OOM错误! (编辑:揭阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



