Чтение файла параметров в Amazon Elastic MapReduce и S3

Я пытаюсь запустить свою программу hadoop в системе Amazon Elastic MapReduce. Моя программа берет входной файл из локальной файловой системы, который содержит параметры, необходимые для запуска программы. Однако, поскольку файл обычно читается из локальной файловой системы с FileInputStream, задача завершается с ошибкой при выполнении в среде AWS с сообщением о том, что файл параметров не найден. Обратите внимание, что я уже загрузил файл в Amazon S3. Как я могу решить эту проблему? Спасибо. Ниже приведен код, который я использую для чтения файла параметров и, следовательно, для чтения параметров в файле.

FileInputStream fstream = new FileInputStream(path);
            FileInputStream os = new FileInputStream(fstream);
            DataInputStream datain = new DataInputStream(os);
            BufferedReader br = new BufferedReader(new InputStreamReader(datain));

            String[] args = new String[7];

            int i = 0;
            String strLine;
            while ((strLine = br.readLine()) != null) {
                args[i++] = strLine;
            }

person Ahmedov    schedule 14.12.2012    source источник
comment
Пожалуйста, не используйте DataInputStream для чтения текста vanillajava.blogspot.co.uk/2012/08/   -  person Peter Lawrey    schedule 31.01.2013


Ответы (3)


Если вам необходимо прочитать файл из локальной файловой системы, вы можете настроить задание EMR для запуска с ускоренное действие. Для этого просто скопируйте файл с S3 в локальный файл с помощью s3cmd или аналогичного.

Вы также можете пройти через класс файловой системы Hadoop, чтобы прочитать файл, так как я почти уверен, что EMR поддерживает такой прямой доступ. Например:

FileSystem fs = FileSystem.get(new URI("s3://my.bucket.name/"), conf);
DataInputStream in = fs.open(new Path("/my/parameter/file"));
person Joe K    schedule 14.12.2012

Я еще не пробовал Amazon Elastic, однако это похоже на классическое применение распределенного кеша. Вы добавляете файл в кэш, используя параметр -files (если вы реализуете Tool/ToolRunner) или метод job.addCacheFile(URI uri), и получаете к нему доступ, как если бы он существовал локально.

person Yevgen Yampolskiy    schedule 16.12.2012

Вы можете добавить этот файл в распределенный кеш следующим образом:

...
String s3FilePath = args[0];
DistributedCache.addCacheFile(new URI(s3FilePath), conf);
...

Позже, в configure() вашего преобразователя/редьюсера, вы можете сделать следующее:

...
Path s3FilePath;
@Override
public void configure(JobConf job) {
s3FilePath = DistributedCache.getLocalCacheFiles(job)[0];
FileInputStream fstream = new FileInputStream(s3FilePath.toString());
...
}
person Amar    schedule 16.12.2012
comment
Спасибо за ответ. Но мне не нужно использовать DistributedCache. Мне просто нужно прочитать параметры из файла, а затем начать выполнение моего задания MapReduce. - person Ahmedov; 25.12.2012