0

我正在使用spark sql來讀取坐在S3中的ORC格式的2個不同數據集。但對於幾乎相似大小的數據集來說,閱讀中的性能差異非常大。同樣大小但不同行長度的Spark讀取性能差異

數據集1:包含2.12億記錄每個50列並且在S3存儲桶獸人格式總量可達15GB

數據集2:包含29000000記錄每個150列並且在相同S3桶獸人格式總量可達15GB

數據集1正在使用2分鐘使用spark sql進行讀取。並且在相同的基礎設施中採用相同的火花讀取/計數作業來讀取數據集2的12分鐘

每行的長度可能會導致這種巨大的差異。任何人都可以幫助我理解閱讀這些數據集時巨大性能差異背後的原因嗎?

回答

1

假設你正在使用的S3A:客戶端(而不是亞馬遜EMR &它的S3://客戶端) 它大概是多少SEEK()的工作是怎麼回事,客戶端是否是聰明約隨機IO或不。從本質上說:seek()在HTTP1.1上非常昂貴,如果你必須關閉HTTP連接並創建一個新連接, Hadoop 2.8+爲此添加了兩個功能:HADOOP-14244:懶惰搜索和HADOOP-13203。高性能隨機IO。 。

如果您對您的classopath Hadoop的2.8 +罐子,去:

spark.hadoop.fs.s3a.experimental.fadvise random

這將損害非隨機IO性能(讀取。廣州文件等),但關鍵ORC/Parquet IO perf。

如果您正在使用Amazon EMR,他們的s3客戶端是封閉源代碼,請與他們的支持團隊聯繫,恐怕。

+0

我正在使用亞馬遜EMR和他們的S3客戶端..任何我可以嘗試測試性能?注意:數據集1中的文件數量更多(數據集2中的文件數量爲300)。 –

+0

我懷疑它比#of文件跳過的次數多,但您可以嘗試更多地分割文件。測試性能? ,也許從本地安裝Hadoop 2.8並使用「用戶提供的JARs」https://spark.apache.org/downloads.html進行啓動......將其粘貼到虛擬機中,然後將該搜索與第二個數據集。其他策略。將它全部下載到本地,並比較文件中的perf:// ..這可以是基準 –