Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 随着表的增长,写入分区配置单元表需要更长的时间_Apache Spark_Hadoop_Hive_Hdfs_Parquet - Fatal编程技术网

Apache spark 随着表的增长,写入分区配置单元表需要更长的时间

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会扫描所有现

我正在使用Spark 2.4.4写入一个2级分区的外部配置单元表(格式化HDFS上的拼花):

IO所花费的时间随着每个作业的增加而增加。每个作业(一批数据)我将写入5-10个不同的
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/")