2014-05-20 114 views
5

我想將test.tar.gz文件從S3複製到HDFS。這可以通過distcp或s​​3distcp完成。但我的要求是,當我將文件傳輸到HDFS時,應該立即提取文件並在HDFS中提取文件,而不是tar.gz。將s3中的文件複製並提取到HDFS

請提出任何建議。

回答

0

使用bash腳本有什麼問題?我的意思是:

s3distcp --src [file-location] --dst . #Without the hdfs prefix 
tar -zxvf test.tar.gz 
hadoop fs -mkdir /input 
hadoop fs -mkdir /input/test 
hadoop fs -copyFromLocal test/ /input/test 
+0

這是一個不錯的選擇。但我不應該使用任何本地文件系統來放置tar.gz文件。它像S3中的tar.gz文件,在HDFS中僅提取文件的目錄結構。 – Ilango

+1

是的,它也不可擴展 – mtariq

2

當您通過網絡傳輸時,通常最好是文件保持壓縮狀態。想象一下,傳輸100GB而不是傳輸20GB bz2壓縮文件。一旦傳輸完成到HDFS,我建議您使用基於Hadoop API的代碼或MapReduce程序來提取壓縮文件。一旦進入HDFS,您可以將所有文件提取到而不需要將其複製到本地文件系統。

  1. 一個解決方案是使用一個簡單的Hadoop API based碼或MapReduce code (updated),在並行解壓縮。

    附錄:對於ZIP,你可以關注this link。而且,你可以想出類似於tar.gz的東西。

  2. 如果你的文件大小是巨大的100GB.zip,你大概可以使用Hadoop API based program它讀取Zip文件流,提取物(check this link它是如何在做ZipFileRecordReader上面附錄),然後把它寫回到HDFS。我認爲,一個ZIP文件不是可拆分的並且可以並行提取(如果我沒有弄錯的話)。所以,如果你有一個100GB的zip文件,你可能無法發揮MapReduce程序的全部潛力。因此,不要使用它。

  3. 其他的解決方案是根本不解壓。對於各種內置壓縮格式,Hadoop具有一個命令行實用程序,可幫助您按原樣查看壓縮文件,如果您打算將其保存爲HDFS中的未壓縮文件。

    Hadoop的FS -text /path/fileinHDFS.bz2"

+0

無法訪問MapReduce代碼,壓縮格式不支持tar或zip文件。 HDFS上的解壓縮非常好,但是可以共享一些tar/zip代碼。 (有一種方法unar,但似乎不能在HDFS上工作) – mtariq

+0

我已經在上面添加了一個附錄。請檢查。 –

+0

沒有用,因爲我的情況是它的100 GB GB zip(提取到600GB),所以需要一種可能的方式在HDFS中解壓縮(作爲使用distcp將文件下載到HDFS) – mtariq

0

你應該能夠與一些聰明的管道來實現這個...

像這樣(沒有經過測試):

s3cmd get [s3 path] - | tar -zxfO | hadoop dfs -put - [hadoop path] 

s3cmd get [s3 path] -會從S3和管道的文件時,它到stdout(-)。tar -zxfO從stdin獲取管道文件內容並將其提取到stdout(-O選項)。 hadoop dfs -put - [hadoop path]將管道中的數據從標準輸入(-)輸入到提供的HDFS文件中。

+0

管道將不能使用zip,如果tar有多個文件,它將連續併成爲一個。 – mtariq