2016-04-14 22 views
0

Hadoop'un sıkıştırma kitaplıklarını basit bir java programında kullanmaya çalışıyorum. Ancak, Snappy kodekini kullanamıyorum: yürütme, yöntemini SnappyCodec.createCompressor yönteminde verir.SnappyCodec, ayçiçeği kavanozuyla kullanılamıyor: NullPointerException

Not I LD_LIBRARY_PATH ve JAVA_LIBRARY_PATH ortam değişkenlerini ayarlama değil doğuracağı tipik java.lang.UnsatisfiedLinkError alamıyorum. Snappy, CDH ile düzgün şekilde yüklenir, hadoop checknative çalıştırılarak kullanılabilir olarak bildirilir ve Snappy sıkıştırması, bir Snappy dosyasında hdfs dfs -text yaptığımda çalışır.

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

Ne kaçırdım:

$ 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) 

Java kodu, böyle suçlu olmaktan son satırı görünüyor?

cevap

0

Pekala, sorun, this answer'da belirtildiği gibi sorunun CompressionCodec düzgün yapılandırılmasını gerektirdiği ortaya çıktı.

yapılandırılmış Snappy kompresörü almak kolay yolu böylece gibidir:

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

çıkan kavanoz

asıl soruya kullanılan komut hatları ile çalıştırılabilir.