我想將test.tar.gz文件從S3複製到HDFS。這可以通過distcp或s3distcp完成。但我的要求是,當我將文件傳輸到HDFS時,應該立即提取文件並在HDFS中提取文件,而不是tar.gz。將s3中的文件複製並提取到HDFS
請提出任何建議。
我想將test.tar.gz文件從S3複製到HDFS。這可以通過distcp或s3distcp完成。但我的要求是,當我將文件傳輸到HDFS時,應該立即提取文件並在HDFS中提取文件,而不是tar.gz。將s3中的文件複製並提取到HDFS
請提出任何建議。
使用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
當您通過網絡傳輸時,通常最好是文件保持壓縮狀態。想象一下,傳輸100GB而不是傳輸20GB bz2壓縮文件。一旦傳輸完成到HDFS,我建議您使用基於Hadoop API的代碼或MapReduce程序來提取壓縮文件。一旦進入HDFS,您可以將所有文件提取到而不需要將其複製到本地文件系統。
一個解決方案是使用一個簡單的Hadoop API based碼或MapReduce code (updated),在並行解壓縮。
附錄:對於ZIP,你可以關注this link。而且,你可以想出類似於tar.gz的東西。
如果你的文件大小是巨大的100GB.zip,你大概可以使用Hadoop API based program它讀取Zip文件流,提取物(check this link它是如何在做ZipFileRecordReader上面附錄),然後把它寫回到HDFS。我認爲,一個ZIP文件不是可拆分的並且可以並行提取(如果我沒有弄錯的話)。所以,如果你有一個100GB的zip文件,你可能無法發揮MapReduce程序的全部潛力。因此,不要使用它。
其他的解決方案是根本不解壓。對於各種內置壓縮格式,Hadoop具有一個命令行實用程序,可幫助您按原樣查看壓縮文件,如果您打算將其保存爲HDFS中的未壓縮文件。
Hadoop的FS -text /path/fileinHDFS.bz2"
你應該能夠與一些聰明的管道來實現這個...
像這樣(沒有經過測試):
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文件中。
管道將不能使用zip,如果tar有多個文件,它將連續併成爲一個。 – mtariq
這是一個不錯的選擇。但我不應該使用任何本地文件系統來放置tar.gz文件。它像S3中的tar.gz文件,在HDFS中僅提取文件的目錄結構。 – Ilango
是的,它也不可擴展 – mtariq