2017-03-21 85 views
2

火花新手在這裏。 我在Hive中有一張非常大的表格(大約130M條記錄,180列),我試圖用Spark將它打包成實木複合地板文件。 我正在使用默認的EMR集羣配置,6 * r3.xlarge實例來提交我用Python編寫的Spark應用程序。然後我在YARN上以集羣模式運行它,通常給驅動程序提供少量內存(幾千兆),其餘部分給執行程序。這裏是我的代碼,這樣做:在Spark上查詢Hive以獲得最佳性能的正確方法是什麼?

from pyspark import SparkContext 
from pyspark.sql import HiveContext 
sc = SparkContext(appName="ParquetTest") 

hiveCtx = HiveContext(sc) 

data = hiveCtx.sql("select * from my_table") 
data.repartition(20).write.mode('overwrite').parquet("s3://path/to/myfile.parquet") 

後來,我用類似這樣的東西提交:

spark-submit --master yarn --deploy-mode cluster --num-executors 5 --driver-memory 4g --driver-cores 1 --executor-memory 24g --executor-cores 2 --py-files test_pyspark.py test_pyspark.py 

然而,我的任務永遠需要完成。在工作開始後,Spark很快就關閉了除一個工作人員以外的所有工作人員,因爲其他人沒有被使用,並且它需要幾個小時才能獲得來自Hive的所有數據。 Hive表本身還沒有分區或集羣(我還需要一些建議)。

你能幫助我理解我在做什麼錯了,我應該在哪裏何去何從,如何擺脫資源我的最大性能?

謝謝!

+0

你可能想看看這個問題/答案。它不完全是最新的,但它應該幫助https://stackoverflow.com/questions/36927918/using-spark-to-write-a-parquet-file-to-s3-over-s3a-is-very-slow/36992096#36992096 – David

回答

0

我有類似的用例,我用spark來寫入s3並出現性能問題。主要原因是spark創建了大量的零字節部分文件,將臨時文件替換爲實際的文件名會減慢寫入過程。嘗試下面的方法作爲解決辦法

  1. 將輸出寫入HDFS並使用Hive寫入s3。性能要好得多,因爲配置單元創建的零件文件數量較少。我遇到的問題是(使用spark時也有同樣的問題),由於安全原因,在prod env中未提供Policy上的刪除操作。 S3存儲桶在我的情況下是kms加密的。
  2. 將火花輸出寫入HDFS並將hdfs文件複製到本地並使用aws s3複製將數據推送到s3。採用這種方法獲得了第二好的結果。與亞馬遜創建的票,他們建議去與這一個。
  3. 使用s3 dist cp將文件從HDFS複製到S3。這是沒有問題的工作,而不是高性能
相關問題