我在MySQL上有一个> 5GB的表。我想将这个表格作为一个数据框加载到spark上,然后创建一个parquet文件。从Spark上的MySQL读取数据时超出了GC开销限制
这是我的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)
我运行下面的脚本来运行我的火花的应用程序:当我在一个EC2实例与运行此脚本
./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,它与java.lang.OutOfMemoryError: GC overhead limit exceeded
失败同时,我只使用1.42 GB的可用内存。
这里是堆栈跟踪全控制台输出:https://gist.github.com/idlecool/5504c6e225fda146df269c4897790097
我不知道如果我做某些错误或火花不适用于此用例。我希望火花是。
您使用的纱线如果是这样看一看[这](https://stackoverflow.com/a/33036908/1407161? )回答设置你的spark.yarn.executor.memoryOverhead属性。另外,看看[THIS](https://stackoverflow.com/questions/1393486/error-java-lang-outofmemoryerror-gc-overhead-limit-超过/ 1393503#1393503)回答有关特定例外的更多信息。 – Jeremy