2012-12-06 26 views
8

Tôi muốn sử dụng bộ nhớ cache được phân phối để cho phép người lập bản đồ truy cập dữ liệu. Trong chính, tôi đang sử dụng lệnhTruy cập các tệp trong bộ nhớ cache phân phối hadoop

DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf); 

đâu/người dùng/peter/cacheFile/testCache1 là một tập tin đó tồn tại trong HDFS

Sau đó, chức năng thiết lập của tôi trông như thế này:

public void setup(Context context) throws IOException, InterruptedException{ 
    Configuration conf = context.getConfiguration(); 
    Path[] localFiles = DistributedCache.getLocalCacheFiles(conf); 
    //etc 
} 

Tuy nhiên, mảng localFiles này luôn rỗng.

Lần đầu tiên tôi chạy trên một cụm máy chủ để thử nghiệm, nhưng tôi đọc rằng điều này sẽ ngăn bộ đệm phân phối hoạt động. Tôi đã thử với một pseudo-phân phối, nhưng điều đó không làm việc, hoặc

Tôi đang sử dụng hadoop 1.0.3

nhờ Peter

+0

thể trùng lặp của [tập tin không đặt đúng vào bộ nhớ cache phân phối] (http://stackoverflow.com/questions/12708947/ tập tin-không-đưa-chính xác-vào-phân phối-bộ nhớ cache) – kabuko

Trả lời

35

Vấn đề ở đây là tôi đã làm như sau:

Configuration conf = new Configuration(); 
Job job = new Job(conf, "wordcount"); 
DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf); 

Vì hàm tạo công việc tạo bản sao nội bộ của cá thể conf, việc thêm tệp bộ nhớ cache sau đó sẽ không ảnh hưởng đến mọi thứ. Thay vào đó, tôi nên làm điều này:

Configuration conf = new Configuration(); 
DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf); 
Job job = new Job(conf, "wordcount"); 

Và bây giờ nó hoạt động. Nhờ có Harsh trên danh sách người dùng hadoop để được trợ giúp.

+0

Harsh thực sự là một godsend! .. Đã lãng phí khá nhiều giờ với nhau. Cảm ơn! – Shatu

11
Configuration conf = new Configuration(); 
Job job = new Job(conf, "wordcount"); 
DistributedCache.addCacheFile(new URI("/userpetercacheFiletestCache1"),job.getConfiguration()); 

Bạn cũng có thể thực hiện theo cách này.

4

Một khi công việc được phân công với một đối tượng cấu hình, tức Configuration conf = new Configuration();

Job job = new Job(conf, "wordcount"); 

Và sau đó nếu thỏa thuận với các thuộc tính của conf như hình dưới đây, ví dụ như

conf.set("demiliter","|"); 

hoặc

DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf); 

Những thay đổi như vậy sẽ không được phản ánh trong một pseudo cluste r hoặc cluster như thế nào bao giờ nó sẽ làm việc với môi trường địa phương.

2

Phiên bản mã này (hơi khác so với các cấu trúc được đề cập ở trên) luôn hoạt động đối với tôi.

//in main(String [] args) 
Job job = new Job(conf,"Word Count"); 
... 
DistributedCache.addCacheFile(new URI(/user/peter/cacheFile/testCache1), job.getConfiguration()); 

tôi didnt xem các chức năng hoàn chỉnh setup() trong mã Mapper

public void setup(Context context) throws IOException, InterruptedException { 

    Configuration conf = context.getConfiguration(); 
    FileSystem fs = FileSystem.getLocal(conf); 

    Path[] dataFile = DistributedCache.getLocalCacheFiles(conf); 

    // [0] because we added just one file. 
    BufferedReader cacheReader = new BufferedReader(new InputStreamReader(fs.open(dataFile[0]))); 
    // now one can use BufferedReader's readLine() to read data 

} 
+0

Cảm ơn @Somum, nó đã làm việc cho tôi. Tôi đã kiểm tra với hadoop 1.2.1 –

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