2009-10-07 35 views
18

Tôi cần ghi dữ liệu vào Hadoop (HDFS) từ các nguồn bên ngoài như hộp cửa sổ. Ngay bây giờ tôi đã sao chép dữ liệu vào nút tên và sử dụng lệnh put của HDFS để nhập nó vào cụm. Trong quá trình duyệt mã, tôi không thấy API để thực hiện việc này. Tôi hy vọng một người nào đó có thể chỉ cho tôi rằng tôi sai và có một cách dễ dàng để mã khách hàng bên ngoài chống lại HDFS.Ghi dữ liệu vào Hadoop

Trả lời

11

Cài đặt Cygwin, cài đặt Hadoop tại địa phương (bạn chỉ cần nhị phân và configs trỏ ở NN của bạn - không cần phải thực sự chạy dịch vụ), chạy hadoop fs -copyFromLocal /path/to/localfile /hdfs/path/

Bạn cũng có thể sử dụng máy tính để bàn Cloudera mới để tải lên một tệp thông qua giao diện người dùng web, mặc dù đó có thể không phải là một lựa chọn tốt cho các tệp khổng lồ.

Ngoài ra còn có lớp phủ WebDAV cho HDFS nhưng tôi không biết mức độ ổn định/đáng tin cậy như thế nào.

17

Có một API bằng Java. Bạn có thể sử dụng nó bằng cách bao gồm mã Hadoop trong dự án của bạn. Các javadoc là khá hữu ích trong việc chung, nhưng tất nhiên bạn phải biết, những gì bạn đang tìm kiếm * g * http://hadoop.apache.org/common/docs/

Đối với vấn đề cụ thể của bạn, có một cái nhìn tại địa chỉ: http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/fs/FileSystem.html (điều này áp dụng đối với các mới nhất phát hành, tham khảo các phiên bản JavaDocs khác cho các phiên bản khác nhau!)

Cuộc gọi thông thường sẽ là: Filesystem.get(new JobConf()).create(new Path("however.file")); Trả về cho bạn luồng bạn có thể xử lý bằng JavaIO thông thường.

+3

cụ thể hơn (và chạy bằng hadoop jar code.jar {classname}) org.apache.hadoop.fs.FileSystem.get (mới org.apache.hadoop.mapred.JobConf()). Tạo (org mới .apache.hadoop.fs.Path ("tuy nhiên.file")); –

13

Đối với vấn đề tải dữ liệu cần thiết để đưa vào HDFS, tôi chọn để chuyển vấn đề xung quanh.

Thay vì tải tệp lên HDFS từ máy chủ nơi họ cư trú, tôi đã viết một công việc Java Map/Reduce nơi người lập bản đồ đọc tệp từ máy chủ tệp (trong trường hợp này qua https), sau đó viết trực tiếp lên HDFS (thông qua Java API).

Danh sách tệp được đọc từ đầu vào. Sau đó, tôi có một tập lệnh bên ngoài điền một tệp có danh sách tệp cần tìm nạp, tải tệp lên HDFS (sử dụng hadoop dfs -put), sau đó bắt đầu công việc bản đồ/giảm với số lượng người lập bản đồ phong nha.

Điều này mang lại cho tôi hiệu suất chuyển tuyệt vời vì nhiều tệp được đọc/ghi cùng một lúc.

Có thể không phải là câu trả lời bạn đang tìm kiếm, nhưng hy vọng hữu ích anyway :-).

12

Khoảng 2 năm sau câu trả lời cuối cùng của tôi, hiện có hai lựa chọn thay thế mới - Hoop/HttpFS và WebHDFS.

Về Hoop, lần đầu tiên được công bố trong Cloudera's blog và có thể được tải xuống từ github repository. Tôi đã quản lý để có được phiên bản này để nói chuyện thành công với ít nhất Hadoop 0.20.1, nó có thể nói chuyện với các phiên bản cũ hơn một chút.

Nếu bạn đang chạy Hadoop 0.23.1 mà tại thời điểm viết vẫn chưa được phát hành, Hoop thay vào đó là một phần của Hadoop là thành phần riêng của nó, HttpFS. Công việc này được thực hiện như một phần của HDFS-2178. Hoop/HttpFS có thể là một proxy không chỉ cho HDFS, mà còn cho các hệ thống tệp tương thích Hadoop khác như Amazon S3.

Hoop/HttpFS chạy dưới dạng dịch vụ độc lập của riêng nó.

Ngoài ra còn có WebHDFS hoạt động như một phần của dịch vụ NameNode và DataNode. Nó cũng cung cấp một API REST, nếu tôi hiểu chính xác, tương thích với API HttpFS. WebHDFS là một phần của Hadoop 1.0 và một trong những tính năng chính của nó là nó cung cấp dữ liệu địa phương - khi bạn đang thực hiện một yêu cầu đọc, bạn sẽ được chuyển hướng đến thành phần WebHDFS trên datanode nơi dữ liệu cư trú.

Thành phần nào để chọn phụ thuộc một chút vào thiết lập hiện tại của bạn và bạn cần có những gì. Nếu bạn cần giao diện HTTP REST cho HDFS ngay bây giờ và bạn đang chạy một phiên bản không bao gồm WebHDFS, bắt đầu với Hoop từ kho github có vẻ như là tùy chọn dễ nhất. Nếu bạn đang chạy một phiên bản bao gồm WebHDFS, tôi sẽ làm điều đó trừ khi bạn cần một số tính năng mà Hoop có mà WebHDFS thiếu (quyền truy cập vào các hệ thống tệp khác, giới hạn băng thông, v.v.)

3

Dường như có một trang chuyên dụng bây giờ cho này tại http://wiki.apache.org/hadoop/MountableHDFS:

các dự án này (được liệt kê dưới đây) cho phép HDFS được gắn kết (trên hầu hết các hương vị của Unix) như là một hệ thống tập tin tiêu chuẩn sử dụng lệnh mount. Sau khi được gắn kết, người dùng có thể thao tác trên một phiên bản hdfs bằng cách sử dụng các tiện ích chuẩn của Unix như 'ls', 'cd', 'cp', 'mkdir', 'find', 'grep' hoặc sử dụng thư viện chuẩn Posix như mở, viết, đọc, gần từ C, C++, Python, Ruby, Perl, Java, bash vv

Sau đó nó mô tả các dự án này

  • contrib/cầu chì-dfs được xây dựng trên cầu chì, một số keo C, libhdfs và hadoop-dev.jar
  • fuse-j-hdfs được xây dựng trên cầu chì, cầu chì cho java và hadoop-dev.jar
  • hdfs-fuse - dự án mã google rất giống với contrib/fuse-dfs
  • webdav - hdfs tiếp xúc dưới dạng bản đồ tài nguyên webdavR - chứa hệ thống tệp tương thích hdfs nguồn đóng hỗ trợ đọc/ghi Truy cập NFS
  • HDFS NFS Proxy - xuất HDFS làm NFS mà không cần sử dụng cầu chì. Hỗ trợ Kerberos và đơn đặt hàng lại viết để chúng được ghi vào hdfs tuần tự.

Tôi đã không cố gắng nào trong số này, nhưng tôi sẽ cập nhật câu trả lời ngay sau khi tôi có nhu cầu tương tự như OP

0

Bây giờ bạn cũng có thể thử sử dụng Talend, trong đó bao gồm các thành phần cho Tích hợp Hadoop.

0

bạn có thể thử gắn HDFS trên máy tính của bạn (gọi nó là machine_X) nơi bạn đang thực hiện mã của bạn và machine_X nên có khả năng kết nối InfiniBand với HDFS Check this out, https://wiki.apache.org/hadoop/MountableHDFS

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