将RDD转换为DataFrame时,请避免使用“ spark.driver.maxResultSize”

时间:2019-02-27 18:20:45

标签: apache-spark pyspark amazon-emr

我是新来激发世界的人:-)。根据某些规则,尝试编写一个Spark工作流将小日志合并为大日志。我想要将RDD转换为DataFrame对象并使用API​​的步骤之一,因为操作列更加容易。代码如下:

def main(path):
  print("Read from S3:{}".format(path))
  with SparkContext() as sc:
    sc = SparkContext.getOrCreate()
    spark = SparkSession(sc)
    spark.conf.set("spark.driver.extrajavaoptions", "-XX:+UseParallelGC")
    spark.conf.set("spark.executor.extrajavaoptions", "-XX:+UseParallelGC")
    #spark.conf.set("spark.driver.maxResultSize", "3g")
    spark.conf.set("spark.rdd.compress", "true")
    rdd = sc.newAPIHadoopFile(
        path,
        'org.apache.hadoop.mapreduce.lib.input.TextInputFormat',
        'org.apache.hadoop.io.LongWritable',
        'org.apache.hadoop.io.Text',
        keyConverter=None
    )
    rdd1 = rdd.map(lambda key_val: process_line(key_val[1])).reduceByKey(lambda x, y: x + y)
    print("RDD=>{}".format(rdd1.getNumPartitions()))
    df = rdd1.toDF(["ns_pod", "log"])
    df.write.partitionBy("ns_pod").option("quote", "\u0000").text('hdfs:///merged')
    df.explain()

这在小型数据集上效果很好,但是当我在大型数据集中进行测试时,出现异常:

py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.runJob.: org.apache.spark.SparkException: Job aborted due to stage failure: Total size of serialized results of 11 tasks (1268.4 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)

我在网上进行了一些研究,好像我可以按注释中所示增加“ spark.driver.maxResultSize”,但它不能缩放。触发此错误的原因是主节点试图从工作节点收集数据。我不知道有没有一种方法可以将RDD转换为DF而无需触发数据收集?不确定我做错了什么吗?:-)如果没有办法,如何选择maxResultSize值? (例如:80%的驱动程序内存?) 谢谢。

0 个答案:

没有答案