2011-09-20 16 views
23

Tôi đang chạy hive trên EMR, và cần phải sao chép một số tệp vào tất cả các trường hợp EMR. Một cách mà tôi hiểu là chỉ sao chép các tập tin vào hệ thống tập tin cục bộ trên mỗi nút, còn cách khác là sao chép các tập tin vào HDFS, tuy nhiên tôi chưa tìm được cách đơn giản để sao chép từ S3 sang HDFS.Làm cách nào để sao chép các tệp từ S3 sang Amazon EMR HDFS?

Cách tốt nhất để giải quyết vấn đề này là gì?

Trả lời

26

cách tốt nhất để làm điều này là sử dụng lệnh distcp của Hadoop. Ví dụ (trên một trong các nút cluster):

% ${HADOOP_HOME}/bin/hadoop distcp s3n://mybucket/myfile /root/myfile

này sẽ sao chép một tập tin gọi là myfile từ S3 xô tên mybucket để /root/myfile trong HDFS. Lưu ý rằng ví dụ này giả sử bạn đang sử dụng hệ thống tệp S3 ở chế độ "gốc"; điều này có nghĩa là Hadoop nhìn thấy từng đối tượng trong S3 dưới dạng tệp. Nếu bạn sử dụng S3 ở chế độ khối thay vào đó, bạn sẽ thay thế s3n bằng s3 trong ví dụ trên. Để biết thêm thông tin về sự khác biệt giữa S3 và chế độ khối gốc, cũng như việc xây dựng trên ví dụ trên, xem http://wiki.apache.org/hadoop/AmazonS3.

Tôi thấy rằng distcp là một công cụ rất mạnh. Ngoài việc có thể sử dụng nó để sao chép một lượng lớn tệp vào và ra khỏi S3, bạn cũng có thể thực hiện các bản sao cụm từ tới cụm nhanh với các tập dữ liệu lớn. Thay vì đẩy tất cả dữ liệu qua một nút, distcp sử dụng nhiều nút song song để thực hiện quá trình truyền. Điều này làm cho distcp nhanh hơn đáng kể khi chuyển lượng lớn dữ liệu, so với việc thay thế sao chép tất cả mọi thứ sang hệ thống tệp cục bộ làm trung gian.

+0

vẫn gặp lỗi trong khi chuyển s3 sang hdfs bằng distcp. trong trường hợp của tôi tôi đang tring để di chuyển tập tin rất lớn (hơn sau đó 300GB) sau khi di chuyển 40 hoặc 50% nó bắt đầu hình thức bắt đầu không biết tại sao. bất kỳ ý tưởng?? – rht

3

Lưu ý rằng theo Amazon, tại http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/FileSystemConfig.html "Amazon Elastic MapReduce - Cấu hình hệ thống tập tin", S3 Block FileSystem không được chấp nhận và tiền tố URI của nó bây giờ là s3bfs: // và chúng đặc biệt không khuyến khích sử dụng nó vì nó có thể kích hoạt điều kiện chủng tộc có thể làm cho công việc của bạn bị thất bại ".

Theo cùng một trang, HDFS bây giờ là hệ thống tệp 'hạng nhất' dưới S3 mặc dù nó là tạm thời (biến mất khi các công việc Hadoop kết thúc).

15

Bây giờ Amazon tự nó có trình bao bọc được triển khai trên distcp, cụ thể là: s3distcp.

S3DistCp là một phần mở rộng của DistCp được tối ưu hóa để làm việc với Amazon Web Services (AWS), đặc biệt là Amazon Simple Storage Service (Amazon S3). Bạn sử dụng S3DistCp bằng cách thêm nó như một bước trong luồng công việc. Sử dụng S3DistCp, bạn có thể sao chép hiệu quả một lượng lớn dữ liệu từ Amazon S3 vào HDFS nơi nó có thể được xử lý bằng các bước tiếp theo trong dòng công việc Amazon Elastic MapReduce (Amazon EMR) của bạn. Bạn cũng có thể sử dụng S3DistCp để sao chép dữ liệu giữa xô Amazon S3 hoặc từ HDFS đến Amazon S3

Ví dụ Chép file log từ Amazon S3 để HDFS

Ví dụ sau này minh họa làm thế nào để sao chép các tập tin đăng nhập được lưu trữ trong một thùng S3 của Amazon vào HDFS. Trong ví dụ này, tùy chọn --srcPattern được sử dụng để giới hạn dữ liệu được sao chép vào các bản ghi daemon.

elastic-mapreduce --jobflow j-3GY8JC4179IOJ --jar \ 
s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar \ 
--args '--src,s3://myawsbucket/logs/j-3GY8JC4179IOJ/node/,\ 
--dest,hdfs:///output,\ 
--srcPattern,.*daemons.*-hadoop-.*'