2015-11-06 246 views
1

我正在設置一個新的hadoop集羣(在此階段進行實驗)。hadoop/hdfs中的默認存儲文件格式

我希望對它進行配置,使得無論何時將文件複製到羣集上(通過copyFromLocal或使用sqoop等),hadoop/hdfs都應該將數據存儲爲parquet文件格式。

我對此期待嗎?可能嗎 ?

我認爲應該有一個配置參數在hdfs級別的某處,我可以指定在存儲數據時使用哪種格式,但某種程度上無法找到它。想知道如果我在這裏錯過了什麼。

回答

3

不,你是對的 - 沒有HDFS級配置。每次操作某些數據時,您都必須設置存儲格式。想象一下,如果每個文件都自動轉換爲Parquet,將會造成的損害。所有由應用程序創建的臨時文件,任何Hive/Pig腳本和任何查找文件都將被破壞。

向Sqoop命令的輸出保存到鑲木:

sqoop import --connect JDBC_URI --table TABLE --as-parquetfile --target-dir /path/to/files 

將寫入數據轉換成平面格式。

沒有辦法用copyFromLocal來做到這一點。

要移動上已有的HDFS到木地板的數據,將數據加載到一個外部蜂巢表原始格式,創建一個平面表,然後將數據加載到它,即

//Overlay a table onto the input data on the HDFS 
CREATE EXTERNAL TABLE input (
    id int, 
    str string 
STORED AS <the-input-data-format> 
LOCATION 'hdfs://<wherever-you-put-the-data>'; 

//Create a Parquet-formatted table 
CREATE TABLE parquet (
    id int, 
    str string 
STORED AS PARQUET; 

//Write your input data into the Parquet table - this will format the data into Parquet 
INSERT INTO TABLE parquet 
SELECT * FROM input; 
+0

感謝本。我有幾千個文件要加載到集羣中,並且由於它們可以在外部磁盤上使用,所以我們現在正在考慮使用copyFromLocal方式......儘管並行......這裏的任何技巧?我想最終得到實木複合地板文件,因爲我需要稍後在火花上操作它們。 – Gyan

+0

假設外部磁盤是USB硬盤,那麼主要瓶頸將是數據從該磁盤到集羣邊緣節點的不可避免的傳輸。除了將不同的文件放在不同的邊緣節點上並在每個節點上運行'put'以使其有效地並行運行之外,沒有辦法提高'put'命令的速度。 –

+0

我意識到我錯過了將原始問題的一部分改爲Parquet輸入數據的格式,所以我將其添加到我的答案中。 –