2014-05-20 24 views
5

Tôi muốn sao chép tệp test.tar.gz từ S3 sang HDFS. Điều này có thể được thực hiện bằng distcp hoặc s3distcp. Nhưng yêu cầu của tôi là khi tôi chuyển các tệp sang HDFS, nó sẽ được trích xuất ngay lập tức và trong HDFS, tôi chỉ nên có các tệp được trích xuất chứ không phải tar.gz.Sao chép và trích xuất các tệp từ s3 sang HDFS

Bất kỳ đề xuất nào vui lòng.

Trả lời

0

Sự cố khi sử dụng tập lệnh bash là gì? Ý tôi là:

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

Đó là một lựa chọn tốt. Nhưng tôi không nên sử dụng bất kỳ hệ thống tệp cục bộ nào để đặt tệp tar.gz. Nó giống như tệp tar.gz trong S3 và trích xuất cấu trúc thư mục chỉ với các tệp, trong HDFS. – Ilango

+1

có và không thể mở rộng cũng như – mtariq

2

Khi bạn chuyển bằng mạng, tốt nhất là các tệp vẫn được nén. Hãy tưởng tượng chuyển một 100GB hơn thay vì chuyển một tập tin nén bz2 20GB. Tôi khuyên bạn nên sử dụng mã dựa trên API Hadoop hoặc chương trình MapReduce để trích xuất các tệp đã nén của bạn sau khi quá trình chuyển được thực hiện thành HDFS. Khi ở trong HDFS, bạn có tất cả sức mạnh để trích xuất các tệp mà không cần sao chép chúng sang hệ thống tệp cục bộ.

  1. Một giải pháp sẽ được sử dụng một Hadoop API based mã đơn giản hoặc một MapReduce code (updated) rằng decompresses song song.

    Hợp đồng bổ sung: Đối với ZIP, bạn có thể theo dõi this link. Và, bạn có thể nghĩ ra một thứ tương tự cho tar.gz.

  2. Trong trường hợp bạn nộp kích thước là rất lớn 100GB.zip, có lẽ bạn có thể sử dụng một Hadoop API based program mà đọc một dòng các kho lưu trữ Zip, chiết xuất (check this link cho nó như thế nào đã được thực hiện trong ZipFileRecordReader trong phụ lục ở trên) và sau đó viết nó quay lại HDFS. Tôi nghĩ rằng, một tập tin ZIP duy nhất là không thể tách rời và trích xuất song song (Nếu tôi không nhầm lẫn). Vì vậy, nếu bạn có một kho lưu trữ zip 100 GB, có thể bạn sẽ không thể khai thác hết tiềm năng của một chương trình MapReduce. Do đó, không chỉ sử dụng nó.

  3. Giải pháp khác là không giải nén được. Đối với các định dạng nén tích hợp khác nhau, Hadoop có một tiện ích dòng lệnh giúp bạn xem các tệp nén như là nếu bạn có ý định giữ nó không nén trong HDFS.

    fs hadoop -văn bản /path/fileinHDFS.bz2"

+0

Không thể truy cập mã MapReduce, Các định dạng nén không hoạt động với các tệp tar hoặc zip. Giải nén trên HDFS là tuyệt vời nhưng bạn có thể chia sẻ một số mã cho tar/zip. (có một phương thức unTar nhưng dường như không hoạt động trên HDFS) – mtariq

+0

Tôi đã thêm một phụ lục ở trên. Hãy kiểm tra. –

+0

Không hữu ích, như trường hợp của tôi 100 GB GB zip (trích xuất đến 600GB) vì vậy cần một cách có thể để giải nén trong HDFS (như tải tập tin với distcp để HDFS) – mtariq

0

Bạn sẽ có thể đạt được điều này với một số đường ống thông minh ...

Something như thế này (hoàn toàn chưa được kiểm tra):

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

s3cmd get [s3 path] - nhận tập tin từ S3 và ống dẫn nó đến thiết bị xuất chuẩn (-). tar -zxfO lấy nội dung tập tin đường ống từ stdin và chiết xuất nó thành stdout (tùy chọn -O). hadoop dfs -put - [hadoop path] đặt đường ống trong dữ liệu đến từ stdin (-) trong tệp HDFS được cung cấp.

+0

ống sẽ không hoạt động với zip và thứ hai nếu tar có nhiều hơn một tập tin nó sẽ concat và trở thành một. – mtariq

Các vấn đề liên quan