2016-11-09 75 views
2

我是這個概念的新手,還在學習。我在AWS S3中共有10 TB json文件,AWS EC2中有4個實例(m3.xlarge)(1位主,3位員工)。我目前在Apache Zeppelin上使用python進行Spark。如何提高大數據性能?

我正在用以下命令讀取文件;

hcData=sqlContext.read.option("inferSchema","true").json(path)

在飛艇解釋器設置:

master = yarn-client 
spark.driver.memory = 10g 
spark.executor.memory = 10g 
spark.cores.max = 4 

它需要1分鐘至約讀1GB。我能更高效地閱讀大數據,我能做些什麼?

  • 我應該多做一些編碼工作嗎?
  • 我應該增加實例嗎?
  • 我應該使用其他筆記本電腦平臺嗎?

謝謝。

回答

2

對於性能問題,最好的辦法是知道性能瓶頸在哪裏。或者嘗試查看性能問題的位置。

由於1分鐘讀取1GB很慢。我會嘗試以下步驟。

  • 嘗試顯式指定的,而不是inferSchema
  • 嘗試使用的模式星火2.0,而不是1.6
  • 檢查S3和EC2之間的連接,如果有一些錯誤配置
  • 使用像不同的文件格式parquetjson
  • 增加執行程序內存並減少驅動程序內存
  • 使用Scala代替Python,althou在這種情況下,這個問題的可能性最小。
+0

非常感謝。這對我來說是非常明確的答案。因此,對於10TB的數據,3個工作者和1個主人(每個m3.xlarge)應該夠了,對吧? –

+0

這實際上取決於你想要做什麼。對於簡單的統計數據,可以用一些中間聚合的幫助來確定。對於密集型機器學習,可能不會。 –

1

可以在拼花格式持久化數據JSON讀

hcData=sqlContext.read.option("inferSchema","true").json(path) 
hcData.write.parquet("hcDataFile.parquet") 
val hcDataDF = spark.read.parquet("hcDataFile.parquet") 

後//在火花1.6創建在火花2.0或registerAsTemp表的臨時視圖並使用SQL用於進一步邏輯

hcDataDF.createOrReplaceTempView("T_hcDataDF") 

//這是一種執行RDD檢查點的手動方式(不支持DataFrames),這將減少RDD Lineage,從而提高性能。

執行,使用Dyanamic資源分配的火花提交命令:

//確保在集羣中啓用以下,否則,你可以使用火花峯會命令這些參數作爲--conf

• spark.dynamicAllocation.enabled=true 
• spark.dynamicAllocation.initialExecutors=5 
• spark.dynamicAllocation.minExecutors=5 
• spark.shuffle.service.enabled=true 
• yarn.nodemanager.aux-services=mapreduce_shuffle,spark_shuffle 
• yarn.nodemanager.aux-services.spark_shuffle.class 
    =org.apache.spark.network.yarn.YarnShuffleService 

//星火提交命令

./bin/spark-submit --class package.hcDataclass \ 
--master yarn-cluster \ 
--deploy-mode cluster \ 
--driver-memory 1G \ 
--executor-memory 5G\ 
hcData*.jar 

//對於動態資源分配我們並不需要指定遺囑執行人的#。 //作業將根據羣集帶寬自動獲取資源。

1

我在十月介紹了這一主題爲頂嘴:Spark and Object Stores

本質:爲了有效利用木/獸人,但調整設置讀取。一旦發佈,獲取針對Hadoop 2.8構建的Spark 2.0.x,以實現我們已經完成的大量加速工作,特別是使用ORC & Parquet。我們也添加了很多指標,儘管還沒有把它們全部帶回到spark UI。

如果必須通過整個數據集(CSV推理,我不知道JSON),模式推斷可能會很慢。我建議先做一次,抓住模式細節,然後在下一次繞路時明確聲明它爲模式。