計數器出於特定的原因,即。以保持某些特定狀態的計數,例如「NUMBER_OF_RECORDS_DISCARDED」。我相信只有增量這些計數器並沒有設置爲任意值(我可能在這裏是錯誤的)。但是確定它們可以用作消息傳遞者,但是有一個更好的方法,那就是使用作業配置來設置變量並且無縫地進行。但是,這隻能用於將自定義消息傳遞給映射器或縮減器,並且映射器中的更改將無法在reducer中使用。
使用舊設置消息/可變mapred API
JobConf job = (JobConf) getConf();
job.set("messageToBePassed-OR-anyValue", "123-awesome-value :P");
使用新的MapReduce API設置消息/變量:
Configuration conf = new Configuration();
conf.set("messageToBePassed-OR-anyValue", "123-awesome-value :P");
Job job = new Job(conf);
使用獲取消息/變量Mapper和Reducer中的舊API: configure()必須在Mapper和Reducer類和值可能會被分配給一個類成員,以便在內部使用map()或reduce()。
...
private String awesomeMessage;
public void configure(JobConf job) {
awesomeMessage = Long.parseLong(job.get("messageToBePassed-OR-anyValue"));
}
...
變量awesomeMessage
然後可以與地圖和減少功能一起使用。
使用新的API中的映射和減速獲取消息/變量: 類似的事情必須在設置()在這裏完成。
Configuration conf = context.getConfiguration();
String param = conf.get("messageToBePassed-OR-anyValue");
我敢肯定你不能傳遞映射器設置減速機配置狀態 - 工作的conf複製並更新各的map/reduce任務,並在每個任務的最終配置不「解析'並保存回作業追蹤器供以後使用。因此,儘管您可以在作業提交時設置配置,但無法全局更新或保留map/reduce任務中的新值 –
我正在使用其映射函數沒有上下文的org.apache.hadoop.mapred.Mapper;但記者的對象。 – Nilesh
是的,謝謝你指出克里斯。你是絕對正確的。我的錯。 – Amar