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



我会遇到相同的错误,而不是在加入Spark SQL中的大数据范围时缺少输出位置。建议设置 MOMEME_AND_DISK 和/或 SPARK.SHUFFLE.MEMORYFRACTION 0 。但是,spark.shuffle.memoryfraction在spark> = 1.6.0中弃用,设置menemy_and_disk如果我不缓存任何RDD或DataFrame,则无济于事,对吗?另外,我得到了许多其他警告日志和任务重试,这使我认为这项工作并不稳定。

因此,我的问题是:

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

更具体的问题是:

  • 如何调整执行者的数量 spark.sql.shuffle.partitions 以实现更好的稳定性/绩效?
  • 如何在平行级之间找到适当的平衡(执行者/内核的数字)和分区数?我发现增加执行者的数字并不总是是解决方案,因为它可能会生成 i/o阅读时间由于网络流量而异常。
  • 是否还有其他相关参数要为此目的进行调整?
  • 我的理解是,将存储的数据加入为 orc parquet 提供的性能比文本或AVRO提供更好的性能。Parquet和orc之间是否存在显着差异?
  • sqlContext vs HiveContext 关于稳定性/绩效的优势是?
  • 当涉及加入的数据框架是 registertemptable()>或 saveastable()

到目前为止,我正在使用这是答案,本章作为起点。而且还有一些与此主题相关的堆叠页面。但是我还没有找到这个流行问题的全面答案。

预先感谢。

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

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

平行性和调整执行人大小的级别,我想参考Cloudera的出色指南:https://blog.cloudera.com/blog/2015/03/how-to-to-te-tnune-the-tune-your-apache--spark-jobs-part-2/

orc和parquet仅在休息处编码数据。进行实际加入时,数据以SPARK的内存格式。自Netflix和Facebook采用它并在其中付出了很多努力以来,Parquet变得越来越受欢迎。Parquet允许您更有效地存储数据,并具有Spark使用的一些优化(谓词下降)。

您应该使用sqlcontext而不是hivecontext,因为不推荐使用HiveContext。SQLContext更一般,不仅与Hive一起使用。

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

希望这会有所帮助。我还建议在Spark Summit上观看有关加入的演讲:https://www.youtube.com/watch?v=6ZG7NTW-KTQ。这可能会为您提供一些见解。

欢呼,fokko

相关内容

  • 没有找到相关文章

最新更新