(py)串联字符串

时间:2016-06-15 14:54:16

标签: apache-spark mapreduce pyspark spark-dataframe

我有一个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
)

1 个答案:

答案 0 :(得分:0)

首先,您可以在单独的行上执行任务,中间使用.first()或.show()步骤,以查看哪一个失败。