2012-12-22 61 views
5

我是一名具有相當不錯的RDBMS體驗的python開發人員。我需要處理大量的數據(大約500GB)。數據在s3桶中大約有1200個csv文件。我用Python編寫了一個腳本,並可以在服務器上運行它。但是,它太慢了。根據目前的速度和數據量,大概需要50天時間才能完成所有文件(當然,在此之前的截止日期是好的)。並行處理大量數據

注:處理是那種東西你的基本ETL型 - 沒有什麼可怕的幻想。我可以很容易地將它壓入PostgreSQL中的臨時模式,然後將腳本運行到它。但是,從我的初始測試來看,這將會變慢。

注意:一個全新的PostgreSQL 9.1數據庫將是它的最終目的地。

所以,我在想試圖旋轉了一堆EC2實例,試圖成批運行它們(並行)。但是,我從來沒有做過以前,所以我一直在四處尋找的想法是這樣的,等

同樣,我是一個Python開發,所以它看起來像布+博託可能是有前途的。我不時使用boto,但從來沒有使用Fabric的經驗。

我從閱讀/研究中瞭解到,這對於Hadoop來說可能是一項很好的工作,但我不知道它並且無法承擔這項工作,並且時間線不允許學習曲線或招聘有人。我也不應該這樣,這是一次性交易。所以,我不需要構建一個非常優雅的解決方案。我只需要它的工作,並能夠在今年年底前完成所有數據。

另外,我知道這不是一個簡單的計算器,各種問題(像「我怎樣才能扭轉蟒蛇名單」)。但是,我期望的是有人閱讀這篇文章,「說,我做了類似的事情,並使用XYZ ......太棒了!」

我想我問的是有沒有人知道我可以用來完成此任務的任何東西(鑑於我是Python開發人員,並且我不知道Hadoop或Java - 並且擁有時間緊迫,防止我學習一門新技術,如Hadoop的或學習一門新語言)

感謝您的閱讀。我期待着任何建議。

+0

布+博託的確看起來像這個任務的良好結合。也可以在每個實例上並行執行任務(除非您希望有1200個實例,每個文件一個實例),也許可以使用'multiprocessing'模塊中的'Pool'。此外,解析文件和編輯結果的方式可能會對總時間產生很大影響。你看過「numpy」嗎? – goncalopp

+1

所以沒有人試圖重複可能的建議 - 你能描述一下你在現有腳本中做了什麼太慢 - 所以我們不知道該走下去嗎:) –

+0

@JonClements - 看起來像一個公平的請求。基本上,我嘗試了兩種方法。我已經嘗試將數據放入臨時模式中,並將其編入索引(根據需要)並對其運行查詢以「按摩」數據並將其轉換爲請求的格式。這太慢了,因爲我認爲索引比PostgreSQL緩存大得多。注意:我在Heroku上運行一個小的PostgreSQL實例。 (接下來的評論會繼續) –

回答

2

我經常在這種類型的批處理工作中使用SQS/S3/EC2的組合。在SQS中爲所有需要執行的工作排隊(分塊成合理的小塊)。分配N個配置爲從SQS讀取消息,執行工作並將結果放入S3的EC2實例,然後,只有這樣,才從SQS中刪除消息。

你可以將這個比例調整到瘋狂的水平,並且它對我一直非常好。在你的情況下,我不知道你是否會在S3中存儲結果或者直接去PostgreSQL。

+0

出於好奇,您如何將您的腳本發送到EC2實例?你會讓他們從一個git回購拉?或者只是scp腳本(s)結束? –

+0

我使用了許多技巧。你可以編寫基於Paramiko的腳本來抓取文件。您可以使用cloud-init並從S3中獲取腳本。你可以使用Fabric。你可以使用CloudFormation模板。有很多選擇。 – garnaat

+0

感謝您的回覆。是啊;看起來像很多選擇。正如我在我原來的問題中提到的,我傾向於使用Fabric,但是想知道你在這裏做了什麼。 –

2

我做了這樣的事情,前一段時間,我的設置是一樣

  • 一個多實例(X-大或以上),即原始的源文件(XML/CSV)轉換爲中間格式。您可以並行運行(轉換器)腳本的(核心數量)副本。由於我的目標是mongo,我使用json作爲中間格式,在你的情況下它將是sql。

  • 此實例有N個卷附加到它。一旦卷變滿,它將被分離並連接到第二個實例(通過boto)。

  • 第二個實例運行的DBMS服務器和其中進口準備(SQL)數據到分貝的腳本。我對postgres一無所知,但我想它確實有一個工具,如mysqlmongoimport。如果是,請使用它進行批量插入,而不是通過python腳本進行查詢。

3

您是否做過一些性能測量:瓶頸在哪裏?它是CPU綁定,IO綁定,數據庫綁定?

當它被CPU綁定時,你可以嘗試python JIT,如pypy。

當它是IO綁定,你需要更多的HD(並把他們的一些條紋MD)。

當它是數據庫綁定時,您可以嘗試先刪除所有索引和鍵。

上週我將Openstreetmap DB導入到服務器上的postgres實例中。輸入數據約爲450G。預處理(這裏用JAVA完成)只是創建了可以用postgres'copy'命令導入的原始數據文件。導入密鑰和索引後生成。

導入所有原始數據需要大約一天的時間 - 然後花費數天時間來構建密鑰和索引。

1

您可能會從Amazon Elastic Map Reduce形式的hadoop中受益。如果沒有太深入的話,它可以被看作是在parralel(Map階段)中應用一些邏輯來處理海量數據的一種方式。
還有一種名爲hadoop streaming的hadoop技術 - 可以使用任何語言的腳本/可執行文件(如python)。
您可以發現有用的另一個hadoop技術是sqoop--它在HDFS和RDBMS之間移動數據。

+0

感謝您的回答。 DEEEEEP在我內部,我知道Hadoop和Elastic MapReduce在這裏是正確的。但是,我無法將自己的頭腦與自己想要完成的工作聯繫起來。我的部分問題是幾乎我見過的每一個例子都是同樣愚蠢的字數計算問題。我的確更多地是ETL(提取,轉換,加載)問題。我很容易想象Map函數處理大多數變換。但是,轉換是依賴於客戶的。所以,這不是一個簡單的計算(例如。(x * y)/ 2)。 –