Spark SQL“创建表为选择...” outofmemory

时间:2019-04-28 09:28:58

标签: apache-spark apache-spark-sql

我正在使用Spark SQL。 Spark版本2.2.2。

SQL喜欢

select a.*, b.* from a inner join b on a.id=b.id

表a和b很大。这行得通,我可以获得答案。

第二,我想将SQL结果保存到配置单元表中。 SQL喜欢:

create table xxx stored as orc as select ...

这将失败,错误代码为143。错误消息为:

  

ExecutorLostFailure(由于正在运行的任务之一而导致执行器268退出)原因:标记为失败的容器:主机xxx上的container_e37_1554167308087_15187_01_000269。退出状态:143。诊断:根据要求将容器杀死。退出代码为143 +详细信息   ExecutorLostFailure(由于正在运行的任务之一而导致执行器268退出)原因:标记为失败的容器:主机:xxxx上的container_e37_1554167308087_15187_01_000269。退出状态:143。诊断:根据要求将容器杀死。退出代码是143   容器退出,退出代码为非零143   被外部信号杀死

我尝试使用pyspark来使用df.saveAsTable()。这在某些情况下有效,但并非始终如此。

有人可以帮忙吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

要解决内存问题,您可以尝试:

  • 重新分区
  • 增加执行者的记忆力--executor-memory
  • 通过执行程序--executor-cores减少内核数(它们共享执行程序的RAM),请不要忘记增加内存开销以符合规范

重新分区将减少每个任务的大小,同时增加内存或减少内核数将导致为每个任务分配更多的内存。

如果您不知道事先需要多少任务以及应该分配多少内存,则可以根据数据帧的大小重新分区。

df.persist()
n = df.count()
nb_records = 10
df = df.repartition(int(n / nb_records))
df.rdd.getNumPartitions()

10

在这里,我们确保按任务有10条记录,数据框有100条记录,因此我要10个分区。