2010-05-22 34 views
10

Chương trình của tôi tuân theo phương pháp tiếp cận bản đồ/giảm lặp đi lặp lại. Và nó cần phải dừng lại nếu một số điều kiện nhất định được đáp ứng. Có anyway tôi có thể thiết lập một biến toàn cầu có thể được phân phối trên tất cả các bản đồ/giảm nhiệm vụ và kiểm tra xem các biến toàn cầu đạt đến điều kiện để hoàn thành.Biến toàn cục trong hadoop

Điều gì đó tương tự.

While(Condition != true){ 

      Configuration conf = getConf(); 
      Job job = new Job(conf, "Dijkstra Graph Search"); 

      job.setJarByClass(GraphSearch.class); 
      job.setMapperClass(DijkstraMap.class); 
      job.setReducerClass(DijkstraReduce.class); 

      job.setOutputKeyClass(IntWritable.class); 
      job.setOutputValueClass(Text.class); 

} 

Trường hợp điều kiện là biến toàn cầu được sửa đổi trong/sau mỗi lần thực thi bản đồ/giảm.

Trả lời

5

Mỗi khi bạn chạy một công việc giảm bản đồ, bạn có thể kiểm tra trạng thái của đầu ra, các giá trị chứa trong bộ đếm, vv và đưa ra quyết định tại nút đang kiểm soát việc lặp lại cho dù bạn muốn thêm lặp lại hay không. Tôi đoán tôi không hiểu nhu cầu về tình trạng toàn cầu đến từ đâu trong kịch bản của bạn.

Nói chung - có hai cách chính được chia sẻ giữa các nút thực thi (mặc dù cần lưu ý rằng trạng thái chia sẻ là tránh tốt nhất vì giới hạn khả năng mở rộng).

  1. Viết tệp cho HDFS mà các nút khác có thể đọc (đảm bảo tệp được dọn sạch khi công việc thoát và thực thi đầu cơ sẽ không gây ra lỗi lạ).
  2. Sử dụng ZooKeeper để lưu trữ một số dữ liệu trong các nút cây ZK chuyên dụng.
+0

Ông có thể vui lòng giải thích thêm một chút về cách sử dụng quầy? Cảm ơn. – Deepak

+1

Hãy thử điều này để giới thiệu tóm tắt: http://philippeadjiman.com/blog/2010/01/07/hadoop-tutorial-series-issue-3-counters-in-action/ – SquareCog

0

Bạn có thể sử dụng Cascading để tổ chức nhiều công việc Hadoop. Chỉ định đường dẫn HDFS nơi bạn muốn giữ biến trạng thái toàn cục và khởi tạo với nội dung giả. Trên mỗi lần lặp, đọc nội dung hiện tại của đường dẫn HDFS này, xóa các nội dung đó, thực hiện bất kỳ số lượng các bước bản đồ/giảm nào và cuối cùng thực hiện giảm toàn cục để cập nhật biến trạng thái toàn cầu. Tùy thuộc vào bản chất nhiệm vụ của bạn, bạn có thể cần vô hiệu hóa việc thực thi đầu cơ và cho phép nhiều lần thử lại.

6

Bạn có thể sử dụng Configuration.set (String name, String value) để thiết lập một giá trị mà bạn sẽ có thể truy cập trong Mappers bạn/Hộp số/etc:

Trong lái xe của bạn:

conf.set("my.dijkstra.parameter", "value"); 

Và ví dụ trong công cụ lập bản đồ của bạn:

public void configure(JobConf job) { 
     myParam = job.get("my.dijkstra.parameter"); 
    } 

Nhưng điều này sẽ không giúp bạn tìm kiếm đầu ra của các công việc trước đó để quyết định có bắt đầu thêm một lần lặp lại hay không. I E. giá trị này sẽ không bị đẩy lùi sau khi thực hiện công việc.

Bạn cũng có thể sử dụng số DistributedCache của Hadoop để lưu trữ các tệp sẽ được phân phối trong tất cả các nút. Đây là một chút tốt hơn so với chỉ đơn giản là lưu trữ một cái gì đó trên HDFS nếu một giá trị bạn sẽ vượt qua theo cách này là một cái gì đó nhỏ.

Tất nhiên counters cũng có thể được sử dụng cho mục đích này. Nhưng chúng không quá đáng tin cậy với mục đích đưa ra quyết định trong thuật toán. Dường như trong một số trường hợp, chúng có thể được tăng lên hai lần (nếu một số tác vụ được thực hiện nhiều hơn một lần, ví dụ: trong trường hợp lỗi hoặc thực thi đầu cơ) - Tôi không chắc chắn.

+0

Câu trả lời chính xác (câu hỏi của tôi). Cảm ơn nhiều! – Malcolm

3

Đây là cách nó hoạt động trong Hadoop 2.0

Trong lái xe của bạn:

conf.set("my.dijkstra.parameter", "value"); 

Và trong Mapper của bạn:

protected void setup(Context context) throws IOException, 
      InterruptedException { 
     Configuration conf = context.getConfiguration(); 

     strProp = conf.get("my.dijkstra.parameter"); 
     // and then you can use it 
    } 
Các vấn đề liên quan