Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2020-01-20, 11:50

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 8 篇文章 ] 
發表人 內容
 文章主題 : MapReduce不能跑迴圈!?單機下可以,偽分散卻不可以!?
文章發表於 : 2014-01-05, 22:24 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
public static void main(String[] args) throws Exception {
int i = 0;

while (!stop) {
System.out.println("count="+i);
i++;
stop = true;
JobConf conf = new JobConf();
conf.set("fs.default.name", "hdfs://localhost:9000");
conf.set("mapred.job.tracker", "localhost:9001");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(Text.class);

conf.setMapperClass(Map.class);
conf.setReducerClass(Reduce.class);

conf.setInputFormat(KeyValueTextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
String input="inputBFS";
String output="output";
FileInputFormat.setInputPaths(conf, new Path(input));
FileOutputFormat.setOutputPath(conf, new Path(output));
System.out.println("@@"+input+output);
input=output.toString();
output=output.substring(0,output.length()-1)+1;
args[0] = args[1];
args[1] = args[1].substring(0, args[1].length() - 1) + i;
JobClient.runJob(conf);
}
}
這是我的程式,請問我在單機下跑是正常的,可是拿到hdfs用偽分散式跑,跑完第一回就不能跑了,這是為什麼呢??
請大大門幫解,謝謝!!


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: MapReduce不能跑迴圈!?單機下可以,偽分散卻不可以!?
文章發表於 : 2014-01-06, 00:20 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
我猜,錯誤訊息應該是 output 目錄已經存在。不信您跑一次,貼錯誤訊息上來看看 :P

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: MapReduce不能跑迴圈!?單機下可以,偽分散卻不可以!?
文章發表於 : 2014-01-06, 00:32 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
jazz 寫:
我猜,錯誤訊息應該是 output 目錄已經存在。不信您跑一次,貼錯誤訊息上來看看 :P

- Jazz

JAZZ我並沒有錯誤訊息,他直接就跑完了,但是沒有進去迴圈

我必須要改寫成實現
public int run(String[] args) throws Exception {
int count = 1;
System.out.println(count);
count++;
Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://localhost:9000");
conf.set("mapred.job.tracker", "localhost:9001");
FileSystem hdfs = FileSystem.get(conf);
Job job = new Job(conf, "aa");
job.setJarByClass(BFStest.class);
job.setJobName("BFStest");
job.setNumReduceTasks(1);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

job.setMapperClass(Map.class);
// job.setCombinerClass(Combine.class); 開偽分散會出錯 WHY!?
job.setReducerClass(Reduce.class);

if (hdfs.exists(new Path(outPutMst))) {
hdfs.delete(new Path(outPutMst), true);
System.out.println("檔案已經存在");
} else {
System.out.println("檔案不存在");
}
job.setInputFormatClass(KeyValueTextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);

FileInputFormat.addInputPath(job, new Path(inputMst));
FileOutputFormat.setOutputPath(job, new Path(outPutMst));

boolean success = job.waitForCompletion(true);

return success ? 0 : 1;

}

public static void main(String[] args) throws Exception {
int i = 0;

while (!stop) {
i++;
stop = true;
int ret = ToolRunner.run(new BFStest(), args);
inputMst = outPutMst.toString();
outPutMst = outPutMst.substring(0, outPutMst.length() - 1) + i;
}
System.out.println("wordcount@@");
System.exit(i);

}

他這樣才會跑迴圈...

可是之前的例子我在單機上是沒問題的,會跑出迴圈,可是在偽分散式就跑不出迴圈...
以下是原程式 單機下沒問題的

package org.windoop;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.aspectj.weaver.IUnwovenClassFile;

public class BFS {

static String input = "hdfs://localhost:9000/user/root/input/inputBFS";
static String output="hdfs://localhost:9000/user/root/output/";
public static boolean stop = false;
public static int number = 0;// 設定跑幾次就停止 避免找不到路徑一直找

public static class Map extends MapReduceBase implements
Mapper<Text, Text, Text, Text> {

public void map(Text key, Text value,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
}


public static class Reduce extends MapReduceBase implements
Reducer<Text, Text, Text, Text> {

public void reduce(Text key, Iterator<Text> values,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {}


public static void main(String[] args) throws Exception {
int i = 0;

while (!stop) {
System.out.println("count="+i);
i++;
stop = true;
JobConf conf = new JobConf();
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(Text.class);

conf.setMapperClass(Map.class);
conf.setReducerClass(Reduce.class);

conf.setInputFormat(KeyValueTextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(input));
FileOutputFormat.setOutputPath(conf, new Path(output));
input=output.toString();
output=output.substring(0,output.length()-1)+i;
JobClient.runJob(conf);

}
}
}
偽分散式下得 只跑出一個,紅色是有修改得地方,只改變路徑,卻無法跑出迴圈

package org.windoop;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.aspectj.weaver.IUnwovenClassFile;

public class BFS {
static String input = "inputBFS";
static String output="output";


public static boolean stop = false;
public static int number = 0;// 設定跑幾次就停止 避免找不到路徑一直找

public static class Map extends MapReduceBase implements
Mapper<Text, Text, Text, Text> {

public void map(Text key, Text value,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
}
}

public static class Reduce extends MapReduceBase implements
Reducer<Text, Text, Text, Text> {

public void reduce(Text key, Iterator<Text> values,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
}

public static void main(String[] args) throws Exception {
int i = 0;

while (!stop) {
System.out.println("count="+i);
i++;
stop = true;
JobConf conf = new JobConf();
conf.set("fs.default.name", "hdfs://localhost:9000");
conf.set("mapred.job.tracker", "localhost:9001");

conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(Text.class);

conf.setMapperClass(Map.class);
conf.setReducerClass(Reduce.class);

conf.setInputFormat(KeyValueTextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(input));
FileOutputFormat.setOutputPath(conf, new Path(output));
input=output.toString();
output=output.substring(0,output.length()-1)+i;


JobClient.runJob(conf);

}
}
}


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: MapReduce不能跑迴圈!?單機下可以,偽分散卻不可以!?
文章發表於 : 2014-01-06, 00:48 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
這個邏輯上要解釋的事情很多,像 stop 這個全域變數,如果跑偽分散式的話,就會有問題。
我有畫一張圖解釋,若看得懂,應該就可以理解我講的全域變數同步問題。

圖檔

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: MapReduce不能跑迴圈!?單機下可以,偽分散卻不可以!?
文章發表於 : 2014-01-06, 00:52 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
請問jazz大大
Reducer再output時可以一次output多個檔案嗎?
context1.write(key, value);

context2.write(key, value);
這樣??

請問一個Reducer輸出一個檔案,五個Reducer輸出五個檔案,有辦法加什麼程式讓五個檔案資料合為一個檔案嗎??(輸出只有一個檔案)

請問jazz大大,在input資料時後,是否可以在input得文件內,假如每一行當一個map,是否可以用指定位置得方式
譬如:"hdfs://localhost:9000/user/root/1",hdfs:"//localhost:9000/user/root/2","hdfs://localhost:9000/user/root/3"
然後這個map收到這些資料就會到對應得位置去尋找資料夾當一個map得資料呢!?

感謝jazz大大回答,感激!!


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: MapReduce不能跑迴圈!?單機下可以,偽分散卻不可以!?
文章發表於 : 2014-01-06, 01:04 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
1. 讓 reducer 輸出多個檔案 - 請用 MultipleOutputs 類別
http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html

2.
AndyTsai 寫:
請問一個Reducer輸出一個檔案,五個Reducer輸出五個檔案,有辦法加什麼程式讓五個檔案資料合為一個檔案嗎??(輸出只有一個檔案)


也可以追看看 hadoop fs -getmerge 呼叫什麼函數吧。

3.
AndyTsai 寫:
請問jazz大大,在input資料時後,是否可以在input得文件內,假如每一行當一個map,是否可以用指定位置得方式
譬如:"hdfs://localhost:9000/user/root/1",hdfs:"//localhost:9000/user/root/2","hdfs://localhost:9000/user/root/3"
然後這個map收到這些資料就會到對應得位置去尋找資料夾當一個map得資料呢!?


您是想要在 map() 裡分別再提交一次 Job ?

input : (file1, file2, file3) -> 產生一個 mapper
 -> {
     1st map() -> 提交 Job(file1) ->
     2nd map() -> 提交 Job(file2) ->
     3rd map() -> 提交 Job(file3)
}
 -> Job(file1), Job(file2), Job(file3) 的標準輸出變成 Reducer 的標準輸入。

這樣 Job(file1), Job(file2), Job(file3) 的檔案輸出,並無法給原始 Job 的 reduce 使用。

這是個資料流(Data Flow)的問題。

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: MapReduce不能跑迴圈!?單機下可以,偽分散卻不可以!?
文章發表於 : 2014-01-06, 01:28 
離線

註冊時間: 2013-10-15, 21:01
文章: 50
jazz大大,我有這個想法,是因為我要寫得程式input資料,每一行每個map需要的資料要有(graph,tree,edge)..演算法..
而graph與tree都是大筆的資料,如果只用一行很難拿到全部得資料,以此才有這想法..

為了讓mapreduce跑得更順利,教授才有問我是否可以再map裡面又包一個map的概念..而裡面那個map就需要龐大的資料..

不不,我是想要
input : (file1, file2, file3) -> 產生一個 mapper1
input : (file1, file4, file5) -> 產生一個 mapper2
 -> {
     1st map() -> 1st reducer
     2nd map() -> 2st reducer
     3rd map() -> 3st reducer
}
老實說,我得reducer是沒有要合併得計畫,只單純做分散處理....


2.MultipleOutputs之前有看過,試著寫過但有點卡住,所以才想問問是否有更好方法..

3. hadoop fs -getmerge這個指令我有在網路看過,可是這是要再指令集打得,
我是想說如果有五個Reducer那資料就分成五個,如果我要繼續跑迴圈,要吃那五個資料夾,
如果他門不合併成一個,我就不能吃了,才上來請問有否語法是可以設定在程式裡,
讓他output出來只有一個資料夾,我就可以吃他繼續跑迴圈了..

感謝jazz大大這麼晚還回答我的問題,祝好夢!!


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: MapReduce不能跑迴圈!?單機下可以,偽分散卻不可以!?
文章發表於 : 2014-01-06, 01:35 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
關於 BFS 的 MapReduce 演算法,其實已經被討論很久,也有不少篇論文了~
https://www.google.com.tw/search?q=BFS+mapreduce
我這裡只能建議不妨先參考看看別人的作法吧~

- Jazz


回頂端
 個人資料 E-mail  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 8 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
正體中文語系由 竹貓星球 維護製作