我是新来激发世界的人:-)。根据某些规则,尝试编写一个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%的驱动程序内存?) 谢谢。