Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何在Spark SQL中加入大数据帧?(最佳实践、稳定性、性能)_Performance_Join_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

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

Performance 如何在Spark SQL中加入大数据帧?(最佳实践、稳定性、性能),performance,join,apache-spark,apache-spark-sql,spark-dataframe,Performance,Join,Apache Spark,Apache Spark Sql,Spark Dataframe,我得到的错误与在Spark SQL中加入大数据帧时的错误相同。建议设置内存和磁盘和/或spark.shuffle.memoryFraction 0。但是,spark>=1.6.0中不推荐使用spark.shuffle.memoryFraction,如果我不缓存任何RDD或数据帧,设置内存和磁盘应该没有帮助,对吗?此外,我还收到了很多其他警告日志和任务重试,这让我觉得工作不稳定 因此,我的问题是: 在Spark SQL>=1.6.0中加入大型数据帧的最佳实践是什么? 更具体的问题是: 如何调

我得到的错误与在Spark SQL中加入大数据帧时的错误相同。建议设置内存和磁盘和/或spark.shuffle.memoryFraction 0。但是,spark>=1.6.0中不推荐使用spark.shuffle.memoryFraction,如果我不缓存任何RDD或数据帧,设置内存和磁盘应该没有帮助,对吗?此外,我还收到了很多其他警告日志和任务重试,这让我觉得工作不稳定

因此,我的问题是:

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

  • 如何调整执行者的数量spark.sql.shuffle.partitions以实现更好的稳定性/性能
  • 如何在并行级别(执行器/核心的数量)和分区数量之间找到适当的平衡?我发现增加执行器的数量并不总是解决方案,因为它可能会因为网络流量而产生I/O读取超时异常
  • 是否有任何其他相关参数需要为此目的进行调整
  • 我的理解是,对于连接操作,存储为ORCParquet的连接数据提供了比文本或Avro更好的性能。拼花地板和兽人之间有显著区别吗
  • 在连接操作的稳定性/性能方面,SQLContextHiveContext相比是否有优势
  • 当联接中涉及的数据帧以前是registerTempTable()saveAsTable()时,在性能/稳定性方面是否存在差异
到目前为止,我使用和作为起点。还有一些与此主题相关的stackoverflow页面。然而,我还没有找到一个全面的答案来回答这个热门问题


提前谢谢

这是很多问题。请允许我逐一回答这些问题:

在生产环境中,执行者的数量在大部分时间都是可变的。这取决于可用的资源。在执行洗牌时,分区的数量很重要。假设您的数据现在是倾斜的,您可以通过增加分区的数量来降低每个任务的负载。 理想情况下,一项任务应该有两个负数。如果任务花费的时间太长,那么您的容器可能会被抢占,并且工作会丢失。如果任务只需要几毫秒,则启动任务的开销占主导地位

关于并行级别和调整执行器大小,我想参考Cloudera的优秀指南:

ORC和拼花地板只对静止的数据进行编码。在执行实际联接时,数据采用Spark的内存格式。自从Netflix和Facebook采用拼花地板并投入大量精力以来,拼花地板越来越受欢迎。Parquet允许您更高效地存储数据,并具有Spark使用的一些优化(谓词下推)

您应该使用SQLContext而不是HiveContext,因为HiveContext已被弃用。SQLContext更为通用,并且不仅仅适用于配置单元

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

希望这有帮助。我还建议观看我们在Spark峰会上关于如何做的演讲。这可能会为您提供一些见解


干杯,Fokko

这个答案建议在出现洗牌内存问题时,将spark.sql.shuffle.partitions设置在2000以上,当分区数大于阈值时,Spark使用不同的数据结构进行洗牌簿记:在这个回答中建议设置Spark.Thread.executor.memoryOverhead=1024:自从我看到你在迭代广播连接上的演示文稿以来,我一直在找你。那真是太好了。我能够分批对两个大数据帧执行排序合并联接,而且似乎工作得很好。下面的链接..我想在迭代广播连接中使用相同的技术,但在广播下一批小数据帧之前,无法了解如何从内存中清除广播分区。请您为下面的问题提供宝贵的意见。请参阅下面的链接。。任何帮助都将不胜感激。谢谢你的帮助!我正在努力编码迭代广播哈希连接