Nano Hash - криптовалюты, майнинг, программирование

Hadoop: данные за пределами Eclipse List теряются

Я написал простое задание MapReduce (на основе примера Word Count), чтобы получить общее количество слов в текстовом файле. Я просматриваю файл построчно и перед отображением выполняю некоторую обработку. Все это, кажется, работает, за исключением удаления определенных слов из строки перед ее отображением.

Перед началом задания я прочитал список слов из файла, который следует удалить перед отображением строки. Я позволил программе распечатать список слов после его чтения, и он отлично работает. Проблема в том, что как только задание начинается, мой ArrayList, содержащий слова, снова кажется пустым. Самое смешное, что это происходит только при запуске программы вне eclipse (jar-файл), в eclipse слова удаляются. Окончательный результат за пределами eclipse — 13,2 миллиона, хотя всего должно быть 13,4 миллиона слов (без удаления слов из списка). В рамках затмения результат 8,4 миллиона, как и должно быть.

Почему это? Большое вам спасибо за вашу помощь!

Вот мой код:

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

import org.apache.hadoop.filecache.DistributedCache;
import org.apache.hadoop.fs.*; 
import org.apache.hadoop.conf.*; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.io.file.tfile.TFile.Reader.Scanner;
import org.apache.hadoop.mapred.*; 
import org.apache.hadoop.util.*; 

public class WordCount { 

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

        private final static IntWritable one = new IntWritable(1); 
        private final static NullWritable nullKey = NullWritable.get();

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

            String processedline = LineProcessor.processLine(value.toString());

            StringTokenizer tokenizer = new StringTokenizer(processedline); 
            while (tokenizer.hasMoreTokens()) { 
                tokenizer.nextToken();
                output.collect(nullKey, one); 
            } 
        }  

    } 

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

        private final static NullWritable nullKey = NullWritable.get();

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

            int sum = 0; 
            while (values.hasNext()) { 
                sum += values.next().get(); 
            } 
            output.collect(nullKey, new IntWritable(sum)); 
        }

    } 

    public static class LineProcessor{
        public static ArrayList<String> stopWordsList = new ArrayList<String>();

        public static void initializeStopWords() throws IOException{
            Path stop_words = new Path("/user/ds2013/stop_words/english_stop_list.txt");
            FileSystem fs = FileSystem.get(new Configuration());
            BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(stop_words)));
            String stopWord;
            stopWord = br.readLine();

            while (stopWord != null){
                //addToStopWords
                stopWordsList.add(stopWord);
                stopWord = br.readLine();
            }
        }

        public static String processLine(String line) {
            line = line.toLowerCase();
            //delete some punctuation
            char[] remove = {'.', ',','"'};
            for (char c : remove) {
                line = line.replace(""+c, "");
            }
            //Replace "-" with Space
            line = line.replace("-", " ");

            //delete stop Words
            StringTokenizer tokenizer = new StringTokenizer(line); 
            String nextWord = tokenizer.nextToken();
            while (tokenizer.hasMoreTokens()) {     
                if(stopWordsList.contains(nextWord)){
                    line = line.replace(nextWord, "");
                }
                nextWord = tokenizer.nextToken();
            } 

            return line;
        }
    }

    public static void main(String[] args) throws Exception { 
        JobConf conf = new JobConf(WordCount.class); 
        conf.setJobName("wordcount"); 
        conf.setMapOutputKeyClass(NullWritable.class);
        conf.setMapOutputValueClass(IntWritable.class);
        conf.setOutputKeyClass(NullWritable.class);
        conf.setOutputValueClass(IntWritable.class);

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

        conf.setInputFormat(TextInputFormat.class); 
        conf.setOutputFormat(TextOutputFormat.class);
        //initialize List of words that should be deletet
        LineProcessor.initializeStopWords();

        //Directories

        FileInputFormat.setInputPaths(conf, new Path("/user/ds2013/data/plot_summaries.txt"));


        Path outputDir = new Path( args[0] );
        //delete output folder if it already exists
        FileSystem fs = FileSystem.get(conf);
        fs.delete(outputDir, true);
        FileOutputFormat.setOutputPath(conf, outputDir);


        JobClient.runJob(conf); 

    } 
}

  • Что вы подразумеваете под затмением, запускаете ли вы его в реальном кластере? 21.11.2013
  • Под этим я подразумевал, что я экспортирую его как банку и запускаю с помощью такой команды, как эта hadoop jar wordCount.jar packageName.WordCount /data/wordcount Все это локально на виртуальной машине. 21.11.2013

Ответы:


1

Если вы отправите свое задание через командную строку, для этого будет создан процесс на стороне клиента. Итак, инициализация, которую вы делаете в своем основном методе:

LineProcessor.initializeStopWords();

работает в совершенно другом процессе. Обычно вы перемещаете этот материал инициализации в функцию настройки в вашем картографе, которую вы можете переопределить (в старом API, который вы используете, это):

public void configure(JobConf job) {
   LineProcessor.initializeStopWords();
}

Или в более новом API это:

public void setup(Context context) {
   LineProcessor.initializeStopWords();
}
21.11.2013
  • Большое спасибо, кажется, это имеет смысл. Я попробую это, как только вернусь домой. Итак, если я добавлю функцию настройки в класс преобразователя, все, что я делаю в этой функции (даже если ArrayList находится за пределами класса преобразователя), будет работать так, как ожидалось, потому что это в том же процессе? И эта функция настройки всегда будет запускаться перед фактической функцией карты (и только один раз для каждого задания, поэтому она не инициализирует список 13 миллионов раз)? 21.11.2013
  • Да, он будет запускаться один раз для каждого процесса сопоставления (задача на языке Hadoop) и непосредственно перед вызовами карты. 21.11.2013
  • Хорошо, я только что пришел домой, попробовал, и это сработало отлично. Большое спасибо :-) 21.11.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..