分佈式文件我試圖在Hadoop中的以下內容:閱讀Hadoop中
- 我已經實現了一個文件輸出到目錄「foo」的一個地圖,減少工作。
- foo文件帶有一個鍵= IntWriteable,value = IntWriteable格式(使用SequenceFileOutputFormat)。
- 現在,我想開始另一個map-reduce作業。映射器是好的,但每個reducer都需要在啓動時讀取整個「foo」文件(我正在使用HDFS在reducer之間共享數據)。
我用了「公共無效配置(JobConf CONF)」這樣的代碼:
String uri = "out/foo";
FileSystem fs = FileSystem.get(URI.create(uri), conf);
FileStatus[] status = fs.listStatus(new Path(uri));
for (int i=0; i<status.length; ++i) {
Path currFile = status[i].getPath();
System.out.println("status: " + i + " " + currFile.toString());
try {
SequenceFile.Reader reader = null;
reader = new SequenceFile.Reader(fs, currFile, conf);
IntWritable key = (IntWritable) ReflectionUtils.newInstance(reader.getKeyClass(), conf);
IntWritable value = (IntWritable) ReflectionUtils.newInstance(reader.getValueClass(), conf);
while (reader.next(key, value)) {
// do the code for all the pairs.
}
}
}
的代碼運行良好,一臺機器上,但我notsure是否會在集羣上運行。 換句話說,這個代碼是從當前機器讀取文件還是從分佈式系統讀取ID?
有什麼我想要做的更好的解決方案?
在此先感謝,
Arik。
這似乎是一個可行的方法來做到這一點。如果defaultFS配置爲hdfs,則out/foo將位於HDFS上。我建議閱讀setup()方法中的文件,所以你只做一次。 –
謝謝,我該如何設置defaultFS爲HDFS ?,此外,在configure()和setup()方法之間還有什麼區別 - 它只是舊vs新API,因爲它們提供了相同的功能? –
你在你的core-site.xml中設置它。 fs.default.name類似hdfs:// hadoop -nn:8020。默認情況下,如果你運行在僞分佈模式下,它會被設置爲這個(也許是hdfs:// localhost:8020)。配置和設置基本上是一樣的,是的。 –