2016-04-14 5 views
0

Ich versuche, die Komprimierungsbibliotheken von Hadoop in einem vereinfachten Java-Programm zu verwenden. Allerdings kann ich den Snappy-Codec nicht verwenden: Ausführung ergibt NullPointerException in Methode SnappyCodec.createCompressor.SnappyCodec kann nicht mit hadoop jar verwendet werden: NullPointerException

Hinweis, dass ich nicht die typischen java.lang.UnsatisfiedLinkError erhalten, die Variablen von nicht Einstellung LD_LIBRARY_PATH und JAVA_LIBRARY_PATH Umwelt führen würde. Snappy ist ordnungsgemäß mit CDH installiert, gemeldet als verfügbar unter hadoop checknative und Snappy Dekompression funktioniert, wenn ich eine hdfs dfs -text auf eine bissige Datei mache.

$ hadoop jar SnappyTool-0.0.1-SNAPSHOT.jar com.mycorp.SnappyCompressor 
Exception in thread "main" java.lang.NullPointerException 
     at org.apache.hadoop.io.compress.SnappyCodec.createCompressor(SnappyCodec.java:145) 
     at org.apache.hadoop.io.compress.CodecPool.getCompressor(CodecPool.java:152) 
     at org.apache.hadoop.io.compress.CodecPool.getCompressor(CodecPool.java:165) 
     at com.mycorp.SnappyCompressor.main(SnappyCompressor.java:19) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
     at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 
$ 
$ hadoop checknative | grep snappy 2>/dev/null 
$ snappy: true /opt/cloudera/parcels/CDH-5.5.1-1.cdh5.5.1.p0.11/lib/hadoop/lib/native/libsnappy.so.1 
$ ls /opt/cloudera/parcels/CDH-5.5.1-1.cdh5.5.1.p0.11/lib/hadoop/lib/native/ 
libhadoop.a  libhadoop.so.1.0.0 libnativetask.a   libsnappy.so 
libhadooppipes.a libhadooputils.a libnativetask.so  libsnappy.so.1 
libhadoop.so  libhdfs.a   libnativetask.so.1.0.0 
libsnappy.so.1.1.4 
$ export LD_LIBRARY_PATH=/opt/cloudera/parcels/CDH-5.5.1-1.cdh5.5.1.p0.11/lib/hadoop/lib/native/ 
$ java -Djava.library.path=/opt/cloudera/parcels/CDH-5.5.1-1.cdh5.5.1.p0.11/lib/hadoop/lib/native/ -cp `hadoop classpath`:SnappyTool-0.0.1-SNAPSHOT.jar com.mycorp.SnappyCompressor 
Exception in thread "main" java.lang.NullPointerException 
     at org.apache.hadoop.io.compress.SnappyCodec.createCompressor(SnappyCodec.java:145) 
     at org.apache.hadoop.io.compress.CodecPool.getCompressor(CodecPool.java:152) 
     at org.apache.hadoop.io.compress.CodecPool.getCompressor(CodecPool.java:165) 
     at com.mycorp.SnappyCompressor.main(SnappyCompressor.java:19) 

Der Java-Code sieht wie folgt aus, die letzte Zeile der Täter zu sein:

 SnappyCodec.checkNativeCodeLoaded(); 
     CompressionCodec codec = new SnappyCodec(); 
     Compressor comp = CodecPool.getCompressor(codec); 

Was habe ich verpasst?

Antwort

0

Okay, so stellte sich das Problem heraus, dass CompressionCodec erfordert eine ordnungsgemäße Konfiguration, wie in this answer hingewiesen.

Die einfache Art und Weise einen konfigurierte Snappy Kompressor zu erhalten, ist in etwa so:

Configuration conf = new Configuration(); 
CompressionCodecFactory ccf = new CompressionCodecFactory(conf); 
CompressionCodec codec = ccf.getCodecByClassName(SnappyCodec.class.getName()); 
Compressor comp = codec.createCompressor(); 

Das resultierende Glas kann in der ursprünglichen Frage mit den verwendeten Befehlszeilen ausgeführt werden.

Verwandte Themen