当前位置: 首页 > 知识库问答 >
问题:

使用PySpark生成6000万JSON文件时的OutOfMemoryError[重复]

欧阳俊逸
2023-03-14

通过JDBC连接,我能够成功地从Oracle db使用下面的PySpark代码生成6000万记录CSV文件。

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Emp data Extract") \
    .config("spark.some.config.option", " ") \
    .getOrCreate()

def generateData():
    try:
        jdbcUrl = "jdbc:oracle:thin:USER/pwd@//hostname:1521/dbname"
        jdbcDriver = "oracle.jdbc.driver.OracleDriver"
        df1 = spark.read.format('jdbc').options(url=jdbcUrl, dbtable="(SELECT * FROM EMP) alias1", driver=jdbcDriver, fetchSize="2000").load()
        #df1.coalesce(1).write.format("csv").option("header", "true").save("/home/user1/empdata" , index=False)
        df1.toPandas().to_json("/home/user1/empdata.json", orient='records')
    except Exception as err:
        print(err)
        raise
    # finally:
    # conn.close()

if __name__ == '__main__':
    generateData()
2019-04-15 05:17:06 WARN  Utils:66 - Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
[Stage 0:>                                                          (0 + 1) / 1]2019-04-15 05:20:22 ERROR Executor:91 - Exception in task 0.0 in stage 0.0 (TID 0)
java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3236)
        at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
        at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
        at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
        at net.jpountz.lz4.LZ4BlockOutputStream.flushBufferedData(LZ4BlockOutputStream.java:220)
        at net.jpountz.lz4.LZ4BlockOutputStream.write(LZ4BlockOutputStream.java:173)
        at java.io.DataOutputStream.write(DataOutputStream.java:107)
        at org.apache.spark.sql.catalyst.expressions.UnsafeRow.writeToStream(UnsafeRow.java:552)
        at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:256)
        at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:247)
        at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:836)
        at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:836)
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:49)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
        at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
        at org.apache.spark.scheduler.Task.run(Task.scala:109)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
2019-04-15 05:20:22 ERROR SparkUncaughtExceptionHandler:91 - Uncaught exception in thread Thread[Executor task launch worker for task 0,5,main]
java.lang.OutOfMemoryError: Java heap space

根据管理员的要求,我更新了我的评论:这是一些不同的问题,其他outoutmemory问题也存在,但在不同的场景中会得到。错误可能是一样的,但问题是不同的。在我的情况下,我得到了大量的数据。

共有1个答案

姚兴安
2023-03-14

如果您想在JSON中保存,您应该使用Spark的write命令--您目前所做的是将所有数据带给驱动程序,并尝试将其加载到一个pandas dataframe中

df1.write.format('json').save('/path/file_name.json')

如果需要单个文件,可以尝试

df1.coalesce(1).write.format('json').save('/path/file_name.json')
 类似资料:
  • 我定义了一个类来存储我的应用程序的配置数据。我想将其实例保存到xml并为此使用XStream。但是当我尝试编写实例时,我总是遇到内存错误。 这是我的类定义: ...等所有标准getter和setter 下面是我将单个对象导出为xml的处理程序 每次我抛出“线程中的异常”JavaFX应用程序线程“java.lang.OutOfMemoryError:java堆空间”。我不明白为什么这么简单的类会抛出

  • 在读取“100 MB”的大型XML文件并使用xstream对其进行解析时,我遇到了一个问题始终会出现以下错误 下面是解析XML的代码 ClassName是一个普通类,其字段带有xml注释。 然后使用 fileString:将xml文件作为inputstream读取并放入字符串缓冲区后的xml文件。 以上代码适用于小文件,但不适用于大文件,有什么想法吗?

  • 问题内容: 如何使用PySpark读取以下JSON结构以触发数据帧? 我的JSON结构 我已经尝试过: 我希望将输出a,b,c作为列,并将值作为相应的行。 谢谢。 问题答案: Json字符串变量 如果您将 json字符串作为变量, 则可以 这会给你 Json字符串作为文件中的单独行(sparkContext和sqlContext) 如果 文件中 有 json字符串作为单独的行, 则可以 使用spa

  • 问题内容: 我只包含所有已安装的应用程序及其图标, 但是如果安装的应用程序过多,我在执行时就会 遇到 对于每一行(此行写在我的文章中) 没问题,到目前为止,我明白了为什么我遇到了这个错误(太多图标加载,过少的VM堆) ,但我看了一下机器人的源代码 * 中设置的活动 ,我从来没有在任何这些运行 OOM错误 而使用设置, 但奇怪的是他们 完全按照相同的方式 来做 * 你可以在这里在他们的源代码看到:

  • 我正在使用2.26.0版本的诱惑插件在詹金斯。我创建了一个作业与下一个配置后,我运行它,我不能看到什么在诱惑报告在Jenkins。因为当我从Jenkins运行它时,它只在本地机器上的文件夹项目中的'allure-results'文件夹中创建这些文件。如果我手动清理这个文件夹并从NetBeansit本地运行我的项目,它将在文件夹'allure-results'中创建正确的.json文件。之后,我可以

  • 问题内容: json.php代码 我必须生成文件。 问题答案: 这是一个示例代码: