を使用して Web パーサーを作成しようとしています。プログラムがドキュメントを取得するときにダウンタイムが発生するため、マルチスレッドにしました。私のスレッドがURLパイルからURLを取得するという考えです。これにより、中規模のインスタンスを使用して EMR で実行した場合、プログラムの速度が 3 倍になりました。大規模なインスタンスでは、メモリ不足エラーが発生しました。必要なスレッドが少ないだけですか、それともスレッドの数が厳密に制御されていないのでしょうか? これが私のマッパーです:
public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> {
private Text word = new Text();
private URLPile pile= new URLPile();
@Override
public void map(LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) {
// non english encoding list, all others are considered english to
// avoid missing any
String url = value.toString();
StringTokenizer urls = new StringTokenizer(url);
Config.LoggerProvider = LoggerProvider.DISABLED;
MyThread[] Threads = new MyThread[8];
for(MyThread thread : Threads){
thread = new MyThread(output,pile);
thread.start();
}
while (urls.hasMoreTokens()) {
try{
if(urls.hasMoreTokens()){
word.set(urls.nextToken());
String currenturl= word.toString();
pile.addUrl(currenturl);
}else{
System.out.println("out of tokens");
pile.waitTillDone();
}
} catch (Exception e) {
/*
*/
continue;
}
}
}
}