2017-04-21 63 views
0

我有一個Spark Streaming作業,它使用streamContext.textFileStream("s3://log-directory/")來偵聽文件,然後解析它們並將它們輸出爲ORC文件。這個特定的目錄有很多文件流入 - 每5分鐘超過40個文件。如何通過針對S3的Spark流提高性能

但是,無論我在EMR集羣上添加多少臺機器,它在任何給定時間都有3到4個執行程序停頓,最多運行30個任務。這使得工作很快就落後了,因爲每個microbatch作業大約需要5分鐘來解析和轉換所有數據,而且它一次只能解析4-10個日誌文件。理想情況下,每個批次將在五分鐘內處理所有40個以上的文件,然後轉到下一個集合,基本與流保持同步。

所以,我的問題 - 有沒有辦法增加運行executor的數量?或者還有其他一些我沒有想到的問題會使我的工作跟上新文件的步伐嗎?我已經閱讀了一些關於S3如何在Spark上非常慢的事情,但是我的工作不斷返回諸如 17/04/21 19:14:32 INFO FileInputDStream: Finding new files took 2135 ms的消息。這不是但它也不是5分鐘,所以我覺得它不是一個查找文件的問題。至於環境,我目前設置spark.maximizeResourceAllocation=true作爲一個配置選項,這將導致:

spark.default.parallelism = 160 
spark.executors.cores =  8 
spark.executor.memory =  10356M 

這似乎是它應該是足夠的,以及 - 文件目前在每一個100MB盡了全力。我可以提供任何幫助,如果有必要,我們很樂意添加更多細節。

+0

Streaming的來源是什麼?室壁運動?卡夫卡?文件? –

+0

來自Amazon ELB的文件 – jpavs

回答

0

這是杜彥武的問題,

使用火花采取從ELB的信息,並寫入獸人的信息引導是不是最好的解決辦法都沒有。

寫入過程由於壓縮導致的orc速度很慢,而IO寫入磁盤。我建議你改變這個過程,在Spark中創建一份工作,將你的數據寫入Kinesis或Kafka,以便快速編寫。在這個過程的另一方面,如果你正在使用Kinesis,你可以使用FireHose在你的S3或者甚至Spark中寫入你的數據,在S3中寫入一個更大時間窗口的流程。

如果您想快速獲取數據,快速獲取數據或建議您使用AWS的Presto或Athena從Kinesis直接獲取數據。或者你需要的其他工具。

我希望這可以提供幫助。

+0

我的數據源是ELB日誌 - 它們包含一些對我們有價值的信息。而Presto最終是我用來查詢的工具,但是在閱讀文本文件的ORC時,它的性能有了很大的提高。所以,我的想法是將ELB寫的文件直接傳送給ORC,而不是進行批處理作業(我現在的解決方案)。我沒有看到從ELB獲取logdata到Kinesis的方法嗎? – jpavs

+0

有一堆解決方案,我已經使用過,我建議您遇到的類似問題是FluentD http://docs.fluentd.org/v0.12/articles/kinesis-stream有一個很大的問題把數據寫入Orc就是IO。關於獸人的表現,是的,這是來自Orc的巨大表現。關鍵是,您對實時數據的必要性是什麼?在ELB中,Kinesis可以幫助您更快地讀取文件。嘗試一下。我建議ELB - > FluentD - > Kinesis - > Spark - > S3(Orc) –

0

Spark的FileInputDStream在掃描目錄時效率非常低下;它會多次掃描每個文件以獲取時間戳並查看是否可以排除它。這表示針對任何獲取​​文件時間戳的GET請求需要100 + ms的對象存儲。

你現在可以做的最好的事情(直到SPARK-17159進入)是讓這個目錄中沒有你已經處理過的任何舊文件。它們不是必需的,但它們仍然在不斷被掃描,越是放慢你的程序越慢。