2011-10-18 29 views
42

-put-copyFromLocal được ghi nhận là giống hệt nhau, trong khi hầu hết các ví dụ sử dụng biến thể verbose -copyFromLocal. Tại sao?Sự khác biệt giữa hadoop fs -put và hadoop fs -copyFromLocal

Cùng một điều cho -get-copyToLocal

+0

vui lòng kiểm tra liên kết này đã đề cập chi tiết ở cấp mã nguồn http://hakunamapdata.com/why-put-is-better-than-copyfromlocal-when-coping-files-to-hdfs/ –

Trả lời

53
  • copyFromLocal cũng tương tự như đặt lệnh, ngoại trừ các nguồn được giới hạn trong một tài liệu tham khảo tệp cục bộ.

Vì vậy, về cơ bản bạn có thể làm với đặt, tất cả những gì bạn làm với copyFromLocal, nhưng không phải ngược lại.

Tương tự,

  • copyToLocal cũng tương tự như được lệnh, ngoại trừ các điểm đến được giới hạn trong một địa phương tập tin tham khảo.

Do đó, bạn có thể sử dụng được thay vì copyToLocal, nhưng không phải theo chiều ngược lại.

Tham khảo: Hadoop's documentation.

Cập nhật: Mới nhất là tháng 10 năm 2015, vui lòng xem this câu trả lời bên dưới.

35

Hãy làm một ví dụ: Nếu HDFS của bạn có chứa đường dẫn: /tmp/dir/abc.txt Và nếu đĩa địa phương của bạn cũng chứa con đường này thì API HDFS sẽ không biết cái nào bạn có ý nghĩa, trừ khi bạn chỉ định một kế hoạch như file:// hoặc hdfs:// . Có thể nó chọn con đường bạn không muốn sao chép.

Vì vậy, bạn có -copyFromLocal ngăn bạn vô tình sao chép sai tệp, bằng cách giới hạn tham số mà bạn cung cấp cho hệ thống tệp cục bộ.

Put dành cho những người dùng nâng cao hơn, những người biết nên đặt kế hoạch nào ở phía trước.

Nó luôn luôn là một chút bối rối cho người dùng Hadoop mới mà hệ thống tập tin mà họ hiện đang ở và nơi tệp của họ thực sự là.

+1

Ý của bạn là gì bởi "API hdfs sẽ không biết bạn nghĩa là gì"? Đối với '-put', nguồn luôn là đối số đầu tiên. Hoặc bạn có nghĩa là một số người dùng có thể nhầm lẫn '-put' với '-get'? – snappy

+0

Không, không phải cách nào. Chúng tôi đang nói về hai hệ thống tệp khác nhau ở đây. HDFS và hệ thống tệp cục bộ (nói ext4). Bằng cách sử dụng 'bin/hadoop fs -put/tmp/somepath/người dùng/hadoop/somepath' lệnh thực sự không biết liệu'/tmp/somepath' có tồn tại trong cả hai hệ thống tập tin hay chỉ trong hệ thống tập tin cục bộ. Điều tương tự với đường dẫn đích. –

+7

Vì vậy, tham số đầu tiên không phải lúc nào cũng là đường dẫn cục bộ fs để nói. Bạn có thể 'đặt' từ một HDFS này sang một HDFS khác nếu bạn muốn. '-copyFromLocal' sẽ đảm bảo rằng nó chỉ chọn từ đĩa cục bộ và tải lên HDFS. –

2
  • cả hai đều như nhau ngoại trừ
  • copyFromLocal bị hạn chế sao chép từ địa phương trong khi put có thể mất tập tin từ bất kỳ (HDFS khác/hệ thống tập tin địa phương/..)
10

Mặc dù những gì đang tuyên bố chủ quyền các tài liệu , tính đến nay (tháng 10 năm 2015), cả hai -copyFromLocal-put đều giống nhau.

Từ sự giúp đỡ trực tuyến:

[[email protected] ~]$ hdfs dfs -help copyFromLocal 
-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst> : 
    Identical to the -put command. 

Và điều này được xác nhận bởi looking at the sources, nơi bạn có thể thấy rằng lớp CopyFromLocal mở rộng lớp mi, nhưng mà không cần thêm bất kỳ hành vi mới:

public static class CopyFromLocal extends Put { 
    public static final String NAME = "copyFromLocal"; 
    public static final String USAGE = Put.USAGE; 
    public static final String DESCRIPTION = "Identical to the -put command."; 
    } 

    public static class CopyToLocal extends Get { 
    public static final String NAME = "copyToLocal"; 
    public static final String USAGE = Get.USAGE; 
    public static final String DESCRIPTION = "Identical to the -get command."; 
    } 

Như bạn có thể thấy, điều này hoàn toàn giống với get/copyToLocal.

0

Cả hai lệnh 'put' & 'copyFromLocal' hoạt động giống hệt nhau. Bạn không thể sử dụng lệnh 'put' để sao chép các tệp từ một thư mục hdfs sang một thư mục khác. Cho phép xem điều này với một ví dụ: giả sử thư mục gốc của bạn có hai thư mục, có tên 'test1' và 'test2'. Nếu 'test1' chứa tệp 'customer.txt' và bạn thử sao chép tệp đó vào thư mục test2
$ hadoop fs -put /test1/customer.txt/test2 Nó sẽ dẫn đến lỗi 'không có tệp hoặc thư mục như vậy' kể từ ' đặt 'sẽ tìm tệp trong hệ thống tệp cục bộ chứ không phải hdfs. Cả hai đều có nghĩa là sao chép tệp (hoặc thư mục) từ hệ thống tệp cục bộ sang hdfs, chỉ.

+0

Có thể nếu bạn chỉ định hệ thống tập tin trong đối số đầu tiên, nó sẽ không đọc địa phương? 'hadoop fs -put hdfs: ///test1/customer.txt hdfs: /// test2'? –

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