2015-08-20 5 views
3

Я хочу использовать сжатие 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

enter image description here

Я изменил мои конфигурации как таковые. Вот мое ядро-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

enter image description here

Для чего это стоит, вот мой класс 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); 
    } 
} 

Он компилирует без ошибок.

Я волнуюсь, что мое отсутствие понимания конфигурации и других шагов ведет меня по неправильному пути, и, возможно, я пропускаю что-то простое для тех, кто лучше разбирается в этом вопросе, чем я. Спасибо, что сделали это так далеко. Я знаю, что это длинный пост.

ответ

0

Вы должны установить следующие свойства в вашем mapred-site.xml:

<property> 
    <name>mapred.compress.map.output</name> 
    <value>true</value> 
</property> 

<property> 
    <name>mapred.map.output.compression.codec</name> 
    <value>org.apache.hadoop.io.compress.LzoCodec</value> 
</property> 

Если вы хотите сделать это на работу на работу основе, вы можете также непосредственно осуществить это в коде в 1 одним из следующих способов:

conf.set("mapred.compress.map.output", "true") 
conf.set("mapred.map.output.compression.codec", "org.apache.hadoop.io.compress.LzoCodec"); 

или

jobConf.setMapOutputCompressorClass(LzoCodec.class); 
+0

в первую очередь: спасибо, что нашли время, чтобы ответить. Этот вопрос не получает активности, которую я надеялся. Если вы видите из моего класса драйвера, я даже не пытаюсь сжать промежуточный вывод, а только выход редуктора. Вы все еще думаете, что мне нужно добавить это свойство? –

+0

не уверен, по мне Да и не забудьте перезагрузить hadoop после изменения. Также убедитесь, что вы установили 32-битный и 64-разрядный liblzo2. –

+0

Дополнительная информация, https://github.com/toddlipcon/hadoop-lzo и https://code.google.com/a/apache-extras.org/p/hadoop-gpl-compression/wiki/FAQ?redir = 1 –

 Смежные вопросы

  • Нет связанных вопросов^_^