Spark写文件csv/hive花费太多时间和性能基准

tez616oj  于 2022-11-05  发布在  Hive
关注(0)|答案(2)|浏览(193)

我在使用Spark时遇到了一个非常简单的问题,但是网络上的信息非常少。我在使用Pyspark和Scala时都遇到过这个问题。
问题是保存csv / hive文件需要花费大量时间。
下面是我的一段非常简单的代码。

spark = SparkSession.
sql = '''
select * from some_table
'''
df = spark.sql(sql)
df.write.csv(path)

这段代码非常简单,但是处理200,000个数据卷需要30-40分钟,处理1000万个数据卷需要几个小时。即使repartition(1)也不能显著提高写性能。saveAsTable(对Hive)可能会更好,但仍然是一个不可接受的时间量,毕竟,直接使用Hive要快得多。2但是Hive作为一个大项目很难进行工程设计。
我的问题是:
1.是否有办法提高性能?
1.性能基准是什么?在什么配置中存储100万条数据大约需要多长时间?

waxmsbnn

waxmsbnn1#

它不是行数。它也是列数和数据数。如果以GB为单位的表主要决定转储时间,那么大小是多少。你可以使用下面的命令来获得该信息。

show tblproperties some_table;
or 
analyze table  some_table compute statistics;

现在,一旦知道了GB,就可以估计转储时间。如果太高,数据转储将花费时间,可以使用
1.添加一些过滤器以排除不需要的数据。
1.仅选择必需的列。
1.在夜间系统不忙碌时转储数据。
1.请与最终消费者核实,看是否可以调整它。
您可以尝试使用此命令将数据转储到csv文件中-它既简单又快速。

hive -e 'select * from some_table' | sed 's/[\t]/,/g'  > /tmp/some_table.csv
bjp0bcyl

bjp0bcyl2#

我知道这个问题已经很老了,但是经过几次反复试验,我的团队发现,当我们向Csv写入数据时,我们需要确保根据所需的并行性对数据进行重新分区。例如:

Executors used = 30
Repartition before write could be higher 100+
And if data to write is more please increase the repartition and executors count too

相关问题