如何在Spark SQL中加入大数据帧?(最佳实践,稳定性,性能)

leo*_*o9r 11 performance join apache-spark apache-spark-sql spark-dataframe

在Spark SQL中加入大数据帧时,我得到的错误与丢失输出位置的shuffle相同.建议设置MEMORY_AND_DISK和/或spark.shuffle.memoryFraction 0.但是,在Spark> = 1.6.0中不推荐使用spark.shuffle.memoryFraction,如果我没有缓存任何RDD或Dataframe,设置MEMORY_AND_DISK应该没有帮助,对吧?此外,我正在获得许多其他WARN日志和任务重试,这使我认为工作不稳定.

因此,我的问题是:

  • 在Spark SQL> = 1.6.0中加入大型数据帧的最佳实践是什么?

更具体的问题是:

  • 如何调整执行程序的数量spark.sql.shuffle.partitions以实现更好的稳定性/性能?
  • 如何在并行级别(执行程序/核心数量)和分区数量之间找到适当的平衡点?我发现增加执行程序的数量并不总是解决方案,因为它可能会因网络流量而产生I/O读取超时异常.
  • 是否还有其他相关参数需要针对此目的进行调整?
  • 我的理解是,加入存储为ORCParquet的数据可以提供比文本或Avro更好的连接操作性能.Parquet和ORC之间有显着差异吗?
  • SQLContextHiveContext有关于连接操作的稳定性/性能的优势吗?
  • 当连接中涉及的数据帧先前是registerTempTable()saveAsTable()时,性能/稳定性是否存在差异?

到目前为止,我正在使用这个答案本章作为起点.还有一些与此主题相关的stackoverflow页面.然而,我还没有找到这个热门问题的全面答案.

提前致谢.

Fok*_*ong 6

有很多问题。请允许我一一回答:

在生产环境中,执行者的数量通常是可变的。这取决于可用资源。执行随机播放时,分区的数量很重要。假设您的数据现在存在偏差,则可以通过增加分区数来降低每个任务的负载。理想情况下,一项任务应减去几分。如果任务花费的时间太长,则有可能您的容器被抢占,并且工作丢失。如果任务仅花费几毫秒,则启动任务的开销将占主导。

并行度和调整执行器大小的方法,我想参考Cloudera的出色指南:https : //blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark- Jobs-Part-2 /

ORC和Parquet仅对静态数据进行编码。进行实际联接时,数据采用Spark的内存中格式。自从Netflix和Facebook采纳Parquet并投入大量精力以来,Parquet变得越来越受欢迎。Parquet使您可以更有效地存储数据,并具有Spark使用的一些优化(谓词下推)。

因为不推荐使用HiveContext,所以应该使用SQLContext而不是HiveContext。SQLContext更通用,不仅与Hive一起使用。

执行时registerTempTable,数据存储在SparkSession中。这不会影响联接的执行。它存储的只是执行动作(例如saveAsTable)时调用的执行计划。执行时saveAsTable,数据将存储在分布式文件系统上。

希望这可以帮助。我也建议您观看我们在Spark峰会上关于进行联接的演讲:https : //www.youtube.com/watch?v= 6zg7NTw- kTQ。这可能会为您提供一些见解。

福子干杯


归档时间:

查看次数:

4242 次

最近记录:

8 年,6 月 前