【发布时间】:2018-05-08 14:56:20
【问题描述】:
我在 mysql 上有一个 > 5GB 的表。我想将该表作为数据框加载到 spark 上,并从中创建一个 parquet 文件。
这是我的python函数来完成这项工作:
def import_table(tablename):
spark = SparkSession.builder.appName(tablename).getOrCreate()
df = spark.read.format('jdbc').options(
url="jdbc:mysql://mysql.host.name:3306/dbname?zeroDateTimeBehavior=convertToNull
",
driver="com.mysql.jdbc.Driver",
dbtable=tablename,
user="root",
password="password"
).load()
df.write.parquet("/mnt/s3/parquet-store/%s.parquet" % tablename)
我正在运行以下脚本来运行我的 spark 应用程序:
./bin/spark-submit ~/mysql2parquet.py --conf "spark.executor.memory=29g" --conf "spark.storage.memoryFraction=0.9" --conf "spark.executor.extraJavaOptions=-XX:-UseGCOverheadLimit" --driver-memory 29G --executor-memory 29G
当我在 30 GB 的 EC2 实例上运行此脚本时,它失败并显示 java.lang.OutOfMemoryError: GC overhead limit exceeded
同时,我只使用了 1.42 GB 的可用总内存。
这是带有堆栈跟踪的完整控制台输出:https://gist.github.com/idlecool/5504c6e225fda146df269c4897790097
我不确定我做错了什么,或者 spark 不适合这个用例。我希望火花是。
【问题讨论】:
标签: apache-spark pyspark