Apache spark 随着表的增长,写入分区配置单元表需要更长的时间
我正在使用Spark 2.4.4写入一个2级分区的外部配置单元表(格式化HDFS上的拼花): IO所花费的时间随着每个作业的增加而增加。每个作业(一批数据)我将写入5-10个不同的Apache spark 随着表的增长,写入分区配置单元表需要更长的时间,apache-spark,hadoop,hive,hdfs,parquet,Apache Spark,Hadoop,Hive,Hdfs,Parquet,我正在使用Spark 2.4.4写入一个2级分区的外部配置单元表(格式化HDFS上的拼花): IO所花费的时间随着每个作业的增加而增加。每个作业(一批数据)我将写入5-10个不同的field2分区(作业前为空)。所以我实际上只是在附加数据 从一个空表开始,写入一批数据需要几秒钟(大约GB的数据),现在时间已经增长到30分钟(SparkUI显示所有作业都已完成,因此我假设是IO阻碍了spark应用程序的进度)。在这段时间内,绝对没有写入任何日志,无论是执行者还是驱动者 我假设spark会扫描所有现
field2
分区(作业前为空)。所以我实际上只是在附加数据
从一个空表开始,写入一批数据需要几秒钟(大约GB的数据),现在时间已经增长到30分钟(SparkUI显示所有作业都已完成,因此我假设是IO阻碍了spark应用程序的进度)。在这段时间内,绝对没有写入任何日志,无论是执行者还是驱动者
我假设spark会扫描所有现有分区中的每个覆盖操作。。。但我不确定
我已经设置了
hive.exec.dynamic.partition=true
,以及spark.sql.sources.partitionOverwriteMode=dynamic
。配置的其余部分是默认的。您可以将数据帧直接保存到分区数据所在的路径中,该路径与配置单元的创建表语句中提到的路径相同
df.write.mode("overwrite").partitionBy("col_specified_for_partitioning").parquet("/path/mentioned/in/create/table")
spark.sql("MSCK REPAIR TABLE dbname.tablename")
这应该可以解决您希望删除并重新创建某个分区的数据的情况,并且MSCK REPAIR TABLE
只会让该表知道HDFS路径中的分区。Try
spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
data.write.mode(SaveMode.Overwrite).insertInto("table")
您也可以尝试上面提到的@yayati sule写入数据的方式,即直接指定目标目录,如下所示
spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
df.write.mode(SaveMode.Overwrite).format("parquet").partitionBy("field1", "field2").save("hdfs://nameservice1/user/raw/table/<YYYYMMDDHHMMSS>")
或者,如果这也失败了,试试老式的方法,然后执行altertableaddpartition
df.write.mode(SaveMode.Overwrite).save("hdfs://nameservice1/user/raw/table/field1=val1/field2=val2/")
任何使用Hadoop-3.3和S3之前版本的人,在以后的过程中都会有一些性能改进。所以升级。您是否要为每个作业覆盖该表?如果是这样的话,保存数据有什么意义?也许是蜂巢统计自动收集。。。尝试设置hive.stats.autogather=false@leftjoin是个好主意,但不幸的是没有help@mck不,我不覆盖数据。正如我在问题中所解释的,我正在用每个分区编写(添加)新分区job@RaphaelRoth嗯,然后试试.mode(“append”)
?
spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
df.write.mode(SaveMode.Overwrite).format("parquet").partitionBy("field1", "field2").save("hdfs://nameservice1/user/raw/table/<YYYYMMDDHHMMSS>")
sparkSession.conf.set("spark.sql.sources.partitionOverwriteMode", "dynamic")
df.write.mode(SaveMode.Overwrite).save("hdfs://nameservice1/user/raw/table/field1=val1/field2=val2/")