Skip to main content
 首页 » 编程设计

python之pyspark 将数据帧写入 hdfs 失败

2024年12月31日22TianFang

我有以下代码可以从 pyspark 数据帧创建 2 个文件。第一个执行成功。第二行失败并出现错误。谁能帮我找出根本原因?

df_Test_cases.write.format("csv").mode('overwrite').save("hdfs://hd0/data/sample.db/test_result_tc/result.csv") # no issues 
df_summary.write.format("csv").mode('overwrite').save("hdfs://hd0/data/sample.db/test_result_py/result.csv") # fails 

这是错误日志

> 18/10/11 09:54:19 WARN TaskMemoryManager: Failed to allocate a page 
> (1048576 bytes), try again. 
>      
>     18/10/11 09:54:19 ERROR Utils: Exception encountered 
>     java.io.IOException: Could not allocate memory to grow BytesToBytesMap 
>             at org.apache.spark.sql.execution.joins.UnsafeHashedRelation.org$apache$spark$sql$execution$joins$UnsafeHashedRelation$$read(HashedRelation.scala:267) 
>             at org.apache.spark.sql.execution.joins.UnsafeHashedRelation$$anonfun$readExternal$1.apply$mcV$sp(HashedRelation.scala:214) 
>  
> 
 
 in  module  
    df_summary.write.format("csv").mode('overwrite').save("hdfs://hd0/data/sample.db/test_result_py/result.csv") # fails 
  File "/usr/hdp/2.6.4.0-91/spark2/python/lib/pyspark.zip/pyspark/sql/readwriter.py", line 595, in save 
  File "/usr/hdp/2.6.4.0-91/spark2/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__ 
  File "/usr/hdp/2.6.4.0-91/spark2/python/lib/pyspark.zip/pyspark/sql/utils.py", line 63, in deco 
  File "/usr/hdp/2.6.4.0-91/spark2/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value 
py4j.protocol.Py4JJavaError: An error occurred while calling o2153.save. 
: org.apache.spark.SparkException: Job aborted. 
        at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1.apply$mcV$sp(FileFormatWriter.scala:213) 
        at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1.apply(FileFormatWriter.scala:166) 
        at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1.apply(FileFormatWriter.scala:166) 
        at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:65) 
        at org.apache.spark.sql.execution.datasources.FileFormatWriter$.write(FileFormatWriter.scala:166) 
        at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand.run(InsertIntoHadoopFsRelationCommand.scala:145) 
        at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:58) 
        at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:56) 
        at org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(commands.scala:74) 
        at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117) 
        at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117) 
        at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:138) 
        at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151) 
        at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:135) 
        at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:116) 
        at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:92) 
        at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:92) 
        at org.apache.spark.sql.execution.datasources.DataSource.writeInFileFormat(DataSource.scala:437) 
        at org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:473) 
        at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:50) 
        at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:58) 
        at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:56) 
        at org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(commands.scala:74) 
        at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117) 
        at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117) 
        at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:138) 
        at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151) 
        at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:135) 
        at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:116) 
        at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:92) 
        at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:92) 
        at org.apache.spark.sql.DataFrameWriter.runCommand(DataFrameWriter.scala:609) 
        at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:233) 
        at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:217) 
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
        at java.lang.reflect.Method.invoke(Method.java:497) 
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 
        at py4j.Gateway.invoke(Gateway.java:280) 
        at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 
        at py4j.commands.CallCommand.execute(CallCommand.java:79) 
        at py4j.GatewayConnection.run(GatewayConnection.java:214) 
        at java.lang.Thread.run(Thread.java:745) 
Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 25.0 failed 1 times, most recent failure: Lost task 0.0 in stage 25.0 (TID 31, localhost, executor driver): java.io.IOException: Could not allocate memory to grow BytesToBytesMap 
        at org.apache.spark.sql.execution.joins.UnsafeHashedRelation.org$apache$spark$sql$execution$joins$UnsafeHashedRelation$$read(HashedRelation.scala:267) 
        at org.apache.spark.sql.execution.joins.UnsafeHashedRelation$$anonfun$readExternal$1.apply$mcV$sp(HashedRelation.scala:214) 
        at org.apache.spark.sql.execution.joins.UnsafeHashedRelation$$anonfun$readExternal$1.apply(HashedRelation.scala:214) 
        at org.apache.spark.sql.execution.joins.UnsafeHashedRelation$$anonfun$readExternal$1.apply(HashedRelation.scala:214) 
        at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1303) 
        at org.apache.spark.sql.execution.joins.UnsafeHashedRelation.readExternal(HashedRelation.scala:213) 
        at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1840) 
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1799) 
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 
        at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75) 
        at org.apache.spark.serializer.DeserializationStream$$anon$1.getNext(Serializer.scala:168) 
        at org.apache.spark.util.NextIterator.hasNext(NextIterator.scala:73) 
        at org.apache.spark.storage.memory.MemoryStore.putIteratorAsValues(MemoryStore.scala:215) 
        at org.apache.spark.storage.BlockManager.maybeCacheDiskValuesInMemory(BlockManager.scala:1185) 
        at org.apache.spark.storage.BlockManager.getLocalValues(BlockManager.scala:526) 
        at org.apache.spark.broadcast.TorrentBroadcast$$anonfun$readBroadcastBlock$1.apply(TorrentBroadcast.scala:210) 
        at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1303) 
        at org.apache.spark.broadcast.TorrentBroadcast.readBroadcastBlock(TorrentBroadcast.scala:206) 
        at org.apache.spark.broadcast.TorrentBroadcast._value$lzycompute(TorrentBroadcast.scala:66) 
        at org.apache.spark.broadcast.TorrentBroadcast._value(TorrentBroadcast.scala:66) 
        at org.apache.spark.broadcast.TorrentBroadcast.getValue(TorrentBroadcast.scala:96) 
        at org.apache.spark.broadcast.Broadcast.value(Broadcast.scala:70) 
        at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.wholestagecodegen_init_0$(Unknown Source) 
        at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.init(Unknown Source) 
        at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8.apply(WholeStageCodegenExec.scala:392) 
        at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8.apply(WholeStageCodegenExec.scala:389) 
        at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsWithIndex$1$$anonfun$apply$26.apply(RDD.scala:844) 
        at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsWithIndex$1$$anonfun$apply$26.apply(RDD.scala:844) 
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96) 
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53) 
        at org.apache.spark.scheduler.Task.run(Task.scala:108) 
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:338) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
        at java.lang.Thread.run(Thread.java:745) 
 
Driver stacktrace: 
        at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1517) 
        at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1505) 
        at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1504) 
        at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) 
        at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48) 
        at org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1504) 
        at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:814) 
        at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:814) 
        at scala.Option.foreach(Option.scala:257) 
        at org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:814) 
        at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:1732) 
        at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1687) 
        at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1676) 
        at org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:48) 
        at org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler.scala:630) 
        at org.apache.spark.SparkContext.runJob(SparkContext.scala:2029) 
        at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1.apply$mcV$sp(FileFormatWriter.scala:186) 
        ... 44 more 
Caused by: java.io.IOException: Could not allocate memory to grow BytesToBytesMap 
        at org.apache.spark.sql.execution.joins.UnsafeHashedRelation.org$apache$spark$sql$execution$joins$UnsafeHashedRelation$$read(HashedRelation.scala:267) 
        at org.apache.spark.sql.execution.joins.UnsafeHashedRelation$$anonfun$readExternal$1.apply$mcV$sp(HashedRelation.scala:214) 
        at org.apache.spark.sql.execution.joins.UnsafeHashedRelation$$anonfun$readExternal$1.apply(HashedRelation.scala:214) 
        at org.apache.spark.sql.execution.joins.UnsafeHashedRelation$$anonfun$readExternal$1.apply(HashedRelation.scala:214) 
        at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1303) 
        at org.apache.spark.sql.execution.joins.UnsafeHashedRelation.readExternal(HashedRelation.scala:213) 
        at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1840) 
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1799) 
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 
        at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75) 
        at org.apache.spark.serializer.DeserializationStream$$anon$1.getNext(Serializer.scala:168) 
        at org.apache.spark.util.NextIterator.hasNext(NextIterator.scala:73) 
        at org.apache.spark.storage.memory.MemoryStore.putIteratorAsValues(MemoryStore.scala:215) 
        at org.apache.spark.storage.BlockManager.maybeCacheDiskValuesInMemory(BlockManager.scala:1185) 
        at org.apache.spark.storage.BlockManager.getLocalValues(BlockManager.scala:526) 
        at org.apache.spark.broadcast.TorrentBroadcast$$anonfun$readBroadcastBlock$1.apply(TorrentBroadcast.scala:210) 
        at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1303) 
        at org.apache.spark.broadcast.TorrentBroadcast.readBroadcastBlock(TorrentBroadcast.scala:206) 
        at org.apache.spark.broadcast.TorrentBroadcast._value$lzycompute(TorrentBroadcast.scala:66) 
        at org.apache.spark.broadcast.TorrentBroadcast._value(TorrentBroadcast.scala:66) 
        at org.apache.spark.broadcast.TorrentBroadcast.getValue(TorrentBroadcast.scala:96) 
        at org.apache.spark.broadcast.Broadcast.value(Broadcast.scala:70) 
        at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.wholestagecodegen_init_0$(Unknown Source) 
        at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.init(Unknown Source) 
        at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8.apply(WholeStageCodegenExec.scala:392) 
        at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8.apply(WholeStageCodegenExec.scala:389) 
        at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsWithIndex$1$$anonfun$apply$26.apply(RDD.scala:844) 
        at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsWithIndex$1$$anonfun$apply$26.apply(RDD.scala:844) 
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96) 
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53) 
        at org.apache.spark.scheduler.Task.run(Task.scala:108) 
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:338) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
        ... 1 more 
 
18/10/11 09:54:19 INFO SparkContext: Invoking stop() from shutdown hook 

请您参考如下方法:

正如@Andrea 所说,这是一个内存问题。首先,我必须警告您,CSV 不是编写“大数据”的最佳格式,我建议您尝试其他更适合 Spark 的格式,例如 Parquet。

但是,如果您真的想将数据导出到 CSV 文件,那么您可以尝试两种不同的方法:

  1. 增加执行器和驱动程序内存:您可以修改 spark-defaults.conf 文件中的默认 Spark 配置:

spark.executor.memory: '2G'

spark.driver.memory: '4G'

  1. 在使用提交运行 Spark 作业之前,您可以传递修改先前选项的参数 Spark Documentation :

./bin/spark-submit --driver-memory 4g –num-executors 2 --executor-memory 2g --executor-cores 2

另一种方法是将输出文件拆分为多个较小的选择数据子集,然后如果需要在本地合并它。我不会这样做,但你可以尝试排除内存不足之外的其他问题。

编辑:添加一些链接和一些有趣的选项来调整 Spark 作业

Cloudera How-to Tune Spark jobs

How we Optimize Apache Spark Jobs