pyspark Spark写入速度性能测试,同时以Parquet格式将数据从Teradata加载到S3

jq6vz3qz  于 2023-01-08  发布在  Spark
关注(0)|答案(1)|浏览(184)

我有一个需求,需要将表从Teradata迁移到DELL ECS S3,数据以Parquet格式写入。我得到了一个Spark群集,其中有一个1GB大小的工作节点和一个2GB大小的驱动程序。我尝试首先使用小数据集来测试我的spark代码的性能:我能够将一个0.3GB大小的表加载到S3。完成该过程大约需要1分3秒。这是我在此数据集中实现的最佳性能,我只是在单个分区中提取数据,缓存并将其写回到S3的单个分区中:我曾尝试在源端和目标端对数据进行分区,但所有这些方法都需要超过1分3秒的时间。
我想知道是否有进一步提高性能的方法,或者这是我可以利用的计算资源的最大值吗?
下面是我编写的代码(非常简单,因为它只是数据提升和移位):

df = spark.read.format("jdbc")\
.option("user", "user_name")\
.option("password","pwd")\
.option("url","jdbc:teradata://servername/LOGMECH=TD2")\
.option("driver","com.teradata.jdbc.TeraDriver")\
.option("query","sql_query_for_source_table").load()

df.cache()

filepath = 's3a://s3_bucket_name/prefix/tablename'

#For S3 write
df.write.mode("overwrite").format("parquet").option("compression","snappy").save(filepath)

我在source/tgt级别分区时使用的代码如下所示:
x一个一个一个一个x一个一个二个x
只是补充一下:分别在年、月和季度级别划分业务日期列时,得到的值为4、31和11。
抱歉发了这么长的帖子,只是想把每个细节都提到。

svmlkihl

svmlkihl1#

加快速度的方法是获得更多的工作节点,并给予它更多的数据。使用.coalesce()而不是.repartition().partitionBy()来减少数据移动。但是只有一个工作节点,你能得到的最快速度是非常有限的--没有并行,它只是一台计算机阅读一个s3文件。

相关问题