2017-03-01 53 views
0

我開始爲我的一個項目學習Hadoop Stack(在hadoop堆棧中相當新手)。我試圖找出將數據放入HIVE的ETL過程的最佳方法。我有一些工作解決方案,但我認爲這不是最佳的,並且有更好的選擇。Hadoop導入數據 - 正確的ETL方法

我的案例: 我有一個系統生成的二進制文件的原始數據。在將它們放在HDFS/HIVE之前,我必須使用unix控制檯程序(非常複雜)解析它們以獲取包含數據的文本行,然後將其放到HIVE表中。

我目前的解決方案:

  1. 系統添加一條消息,卡夫卡,有一個新的二進制文件等待處理。

  2. 我有hadoop的主節點上的Python腳本(至少現在):

    A)recieveing卡夫卡消息

    B)下載該文件。

    C)執行控制檯程序

    d)保存文本輸出到CSV

    E)推CSV文件到HDFS

    F)從CSV在HIVE創建臨時表文件

    G)將來自臨時TABLE的數據插入到ORC引擎上的單獨的pernament表中

    H)刪除臨時表

我的問題:

  1. 這是流最佳?也許有些東西可以更簡單?

  2. 它可以在每個hadoop節點上自動安排/部署/執行這個python腳本(或其他更好的技術?)嗎?

  3. 任何關於工具/選項的線索使整個過程易於維護,計劃和高效?

回答

0

我假設你點2 - > d具有CSV恆定的佈局。在 的情況下,您可以合併點F和H,而不是每次都創建和刪除表,您可以創建一個模板臨時表,並且每次下次都會覆蓋數據。

對於如:

create external table template 
(
---- Your csv schema. 
) 

接下來,你可以嘗試以下類型插入:

LOAD DATA LOCAL INPATH '%s' OVERWRITE INTO TABLE template; 

這會減少你處理一些時間。

我不確定關於java,但我已經使用了很多python,並在我的工作中實現了這些類似的需求。由於python的多樣性和不同模塊的可用性,我從未感受到Python的挑戰。

如果您正在UNIX框中實現此功能,則可以使用cron或 oozie來安排整個自動化。

+0

Thx爲線索。 表現在創建: '創建外部表,如果NOT EXISTS模板 ( ---- CVS架構 ) 行格式分隔的字段TERMINATED BY '' 保存爲TEXTFILE location' 凡位置是HDFS路徑CSV文件。 在此之後,我使用: 'INSERT INTO TABLE target_table SELECT * FROM template; DROP TABLE IF EXISTS template;' – mcwolf