我会遇到相同的错误,而不是在加入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