Java 我是否会在映射器中生成更多的线程?

Java 我是否会在映射器中生成更多的线程?,java,hadoop,emr,Java,Hadoop,Emr,我正在尝试使用和创建一个web解析器,因为程序从中检索文档时,本质上会出现停机,我将其设置为多线程。我的想法是线程从url堆中检索url。当我在带有中等实例的EMR上运行程序时,它的速度提高了三倍。在大型实例上,我遇到了内存不足错误。我是需要更少的线程还是线程的数量没有我想象的那么严格?这是我的地图: public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text&

我正在尝试使用和创建一个web解析器,因为程序从中检索文档时,本质上会出现停机,我将其设置为多线程。我的想法是线程从url堆中检索url。当我在带有中等实例的EMR上运行程序时,它的速度提高了三倍。在大型实例上,我遇到了内存不足错误。我是需要更少的线程还是线程的数量没有我想象的那么严格?这是我的地图:

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;
                    }


                }


        }

}
公共静态类映射扩展MapReduceBase实现映射器{
私有文本字=新文本();
私有URLPile pile=新URLPile();
@凌驾
公共void映射(可长写键、文本值、OutputCollector输出、Reporter){
//非英语编码列表,所有其他均视为英语
//避免遗漏任何
字符串url=value.toString();
StringTokenizer url=新的StringTokenizer(url);
Config.LoggerProvider=LoggerProvider.DISABLED;
MyThread[]线程=新的MyThread[8];
用于(MyThread线程:线程){
线程=新线程读取(输出,堆栈);
thread.start();
}
while(url.hasMoreTokens()){
试一试{
if(url.hasMoreTokens()){
set(url.nextToken());
字符串currenturl=word.toString();
pile.addUrl(currenturl);
}否则{
System.out.println(“令牌用完”);
pile.waitilldone();
}
}捕获(例外e){
/*
*/
继续;
}
}
}
}

URLPile类—是否缓存输出(在内存中),直到所有内容都完成—是否可以在每个URL完成时将其修改为输出?实际上,它是这样做的,我发现问题是每个输出调用一次映射,并导致创建一组空线程。我现在正尝试使用多线程映射器类实现这一点。