2015-04-23 3 views
2

У меня есть большой файл gz размером около 120 ГБ. Я хочу запустить mapreduce на этом, но поскольку файл gz не является разделяемым, только один обработчик может обрабатывать этот файл сразу. Файл присутствует в hdf и локальном. Возможный вариант, о котором я думаю:Mapreduce on large gz file

1) Декомпрессируйте этот gz-файл и сохраните его в hdfs: во-первых, потребуется много времени для распаковки файла и для декомпрессии данных в hdf. Также я не могу распаковать файл непосредственно в hdfs, так как hdfs не имеет команды zcat или gunzip. Поэтому я должен сделать zcat a.gz | hdfs dfs put - /path/in/hdfs. Также это займет столько места в hdfs (примерно в 4 раза больше, чем в gz)

2) разделить файл в небольшом файле (около 1 ГБ каждый) и обработать на них: лучший вариант, но, к сожалению, не работает. Я разделив большой файл на небольшие файлы с помощью разделения команды (также попытался кошки a.gz | голова -n), но когда я бегу картографа на них я получаю ошибку

Error: java.io.EOFException: Unexpected end of input stream 
    at org.apache.hadoop.io.compress.DecompressorStream.decompress(DecompressorStream.java:145) 
    at org.apache.hadoop.io.compress.DecompressorStream.read(DecompressorStream.java:85) 
    at java.io.InputStream.read(InputStream.java:101) 
    at org.apache.hadoop.util.LineReader.fillBuffer(LineReader.java:180) 
    at org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:216) 
    at org.apache.hadoop.util.LineReader.readLine(LineReader.java:174) 
    at org.apache.hadoop.mapreduce.lib.input.LineRecordReader.nextKeyValue(LineRecordReader.java:185) 
    at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:553) 
    at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80) 
    at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91) 
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:784) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163) 

3) разархивировать файл и затем снова сжимайте в bzip2: это займет много времени.

Пожалуйста, предложите мне любую другую идею для достижения этой цели или изменить любой из этих трех методов, чтобы получить успех (я предпочитаю 2-й способ: P)

ответ

2

Я думаю, вы можете пойти с опцией 3. Сжатие файла в Bzip2 дает преимущество использования его непосредственно в задаче mapreduce. Поскольку Bzip2 является разделяемым, вам не нужно разбить его вручную на 1GB-файлы (как и в вашем варианте 2) и обрабатывать на них, hadoop все равно должен хранить их в блоках заданного размера и обрабатывать на настроенных входных разделителях. Таким образом, выполнение предварительной обработки сжатия файла в Bzip2 должно работать нормально.