簡體   English   中英

將文件從s3復制並提取到HDFS

[英]Copy and extract files from s3 to HDFS

我想將test.tar.gz文件從S3復制到HDFS。 這可以通過distcp或s​​3distcp完成。 但是我的要求是,當我將文件傳輸到HDFS時,應該動態提取它,而在HDFS中,我應該只提取文件而不是tar.gz。

有任何建議請。

通過網絡傳輸時,通常最好保持文件壓縮。 想象一下傳輸100GB而不是傳輸20GB bz2壓縮文件。 我建議您在完成向HDFS的傳輸后,使用基於Hadoop API的代碼或MapReduce程序來提取壓縮文件。 進入HDFS后,您將擁有提取文件的全部能力, 而無需將其復制到本地文件系統中。

  1. 一種解決方案是使用基於Hadoop API的簡單代碼或並行解壓縮的MapReduce代碼(更新)

    附錄:對於ZIP,您可以點擊此鏈接 而且,您可以為tar.gz提出類似的建議。

  2. 如果文件大小為100GB.zip,則可以使用基於Hadoop API的程序 ,該程序讀取Zip存檔流,然后提取( 在上面的附錄中的ZipFileRecordReader中查看此鏈接的處理方式),然后編寫它回到HDFS。 我認為,單個ZIP文件不可拆分和並行提取(如果我沒記錯的話)。 因此,如果您只有一個100GB的zip歸檔文件,那么您將可能無法釋放MapReduce程序的全部潛力。 因此,不要指向使用它。

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

    hadoop fs -text /path/fileinHDFS.bz2“

使用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

您應該能夠通過一些巧妙的配管來實現這一目標...

像這樣(完全未經測試):

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文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM