我有一个2TB内存群集和一个1TB数据集(在磁盘上)。任务是将用户会话连接在一起以进行进一步分析。 (稍微简化)代码如下:
dataset.flatMap(
get_key_val_from_json # gives (key, [json_string])
).reduceByKey(
add # merge lists
).map(
lambda x: Row(k=x[0], v='\t'.join(x[1])) # convert the list to a string
).toDF(
['key', 'events_with_tab_sep'] # convert to DataFrame so could save as parquet
).write.mode(
'overwrite'
).parquet(
some_path
)
然而,在reduceByKey
步骤,由于执行程序开始失败(显示很多CAN NOT FIND ADDRESS错误)并重新启动,因此作业无法继续。该作业最终会抛出错误消息
org.apache.spark.SparkException:作业已中止。
,因为
作业X无法完成,因为阶段Y失败了4次。
在reduceByKey
的洗牌过程中,这似乎是一个OOM问题?但是,如果我提取,排序和减少,我认为此任务与内存无关。 Spark是否需要将整个数据集加载到内存中以减少操作?
已尝试但无法正常工作
1-要求Spark仅将中间文件保存到本地磁盘,即
extracted = dataset.flatMap(
get_key_val_from_json
).persist(
StorageLevel.DISK_ONLY
)
extracted.reduceByKey(
add
).map(
lambda x: Row(k=x[0], v='\t'.join(x[1]))
).toDF(
['key', 'events_with_tab_sep']
).write.mode(
'overwrite'
).parquet(
some_path
)
答案 0 :(得分:0)
首先,您可以在单独的行上执行任务,中间使用.first()或.show()步骤,以查看哪一个失败。