Я хочу использовать сжатие LZO в MapReduce, но получаю сообщение об ошибке при запуске моей работы MapReduce. Я использую Ubuntu с программой Java. Я просто пытаюсь запустить это на своей локальной машине. Моя первая ошибкаПытается использовать сжатие LZO с MapReduce
ERROR lzo.GPLNativeCodeLoader: Could not load native gpl library
и вниз по линии
ERROR lzo.LzoCodec: Cannot load native-lzo without native-hadoop
, а затем
java.lang.RuntimeException: native-lzo library not available
Я последовал целый ряд онлайн и текстовые инструкции о том, как скачать и настроить файлы для использования с компрессией LZO. Здесь вы можете увидеть мой файл банка Hadoop-LZO в папке lib
Я изменил мои конфигурации как таковые. Вот мое ядро-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>io.compression.codecs</name>
<value>com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
<property>
<name>mapred.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapred.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzopCodec</value>
</property>
</configuration>
и мой mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
<property>
<name>mapred.child.env</name>
<value>JAVA_LIBRARY_PATH=$JAVA_LIBRARY_PATH:/home/matthew/hadoop/lib/native/lib/lib</value>
</property>
</configuration>
Я также изменил мой hadoop-env.sh в той же папке, конф с этими линиями
export HADOOP_CLASSPATH=/home/hadoop/lib/hadoop-lzo-0.4.13.jar
export JAVA_LIBRARY=/home/hadoop/lib/native/lib/lib
Если вы заинтересованы в том, что в /home/hadoop/lib/native/lib/lib
Для чего это стоит, вот мой класс Driver, который делает все сжимающего
//import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
//import org.apache.hadoop.filecache.DistributedCache;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
//import org.apache.hadoop.io.compress.CompressionCodec;
import com.hadoop.compression.lzo.LzopCodec;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
//import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class FuzzyJoinDriver extends Configured implements Tool{
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(new Configuration(), new FuzzyJoinDriver(),args);
System.exit(exitCode);
}
@Override
public int run(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: FuzzyJoinDriver <input path> <output path>");
System.exit(-1);
}
Configuration conf = new Configuration();
//Used to compress map output
//conf.setBoolean("mapred.compres.map.output", true);
//conf.setClass("mapred.map.output.compression.code", GzipCodec.class, CompressionCodec.class);
Job job = new Job(conf);
job.setJarByClass(FuzzyJoinDriver.class);
job.setJobName("Fuzzy Join");
//Distributed Cache
//DistributedCache.addCacheFile(new URI("/cache/ReducerCount.txt"), job.getConfiguration());
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(FuzzyJoinMapper.class);
job.setReducerClass(FuzzyJoinReducer.class);
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(RelationTuple.class);
job.setPartitionerClass(JoinKeyPartitioner.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);
//Used to compress output from reducer
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, LzopCodec.class);
//SequenceFileOutputFormat.setOutputCompressionType(job, org.apache.hadoop.io.SequenceFile.CompressionType.BLOCK);
return(job.waitForCompletion(true) ? 0 : 1);
}
}
Он компилирует без ошибок.
Я волнуюсь, что мое отсутствие понимания конфигурации и других шагов ведет меня по неправильному пути, и, возможно, я пропускаю что-то простое для тех, кто лучше разбирается в этом вопросе, чем я. Спасибо, что сделали это так далеко. Я знаю, что это длинный пост.
в первую очередь: спасибо, что нашли время, чтобы ответить. Этот вопрос не получает активности, которую я надеялся. Если вы видите из моего класса драйвера, я даже не пытаюсь сжать промежуточный вывод, а только выход редуктора. Вы все еще думаете, что мне нужно добавить это свойство? –
не уверен, по мне Да и не забудьте перезагрузить hadoop после изменения. Также убедитесь, что вы установили 32-битный и 64-разрядный liblzo2. –
Дополнительная информация, https://github.com/toddlipcon/hadoop-lzo и https://code.google.com/a/apache-extras.org/p/hadoop-gpl-compression/wiki/FAQ?redir = 1 –