另外在加入声明的时候注意,value各个之间不要留有空格,否则会报出各种class not found的异常
java.lang.IllegalArgumentException: Compression codec org.apache.hadoop.io.compress.SnappyCodec not found
我的机器是64位的,所以安装了64为的包。你也可以自己去查找适合的rpm包,然后自己安装。如果自己通过rmp包安装,记得需要三个依赖。可以通过该rpm网站去查找适合的包,rpmfinder。
安装好lzo就需要编译hadoop lzo。
进入上面下载的hadoop-lzo文件夹下的含有build.xml的路径下,执行命令 ~/apache-ant-1.8.2/bin/ant compile-native tar。这里对于/apache-ant-1.8.2/bin/ant 请注意,它是你的ant所在的路径,请使用你的路径代替这个路径。当没有错误的执行完成之后,就可以发现有一个build目录。在build目录下有一个native文件夹,把native的文件夹下的内容拷贝到你hadoop的本地目录下,重启hadoop。OK,搞定。
如果上面的Snappy安装成功的话,其实LZO只是执行了相同的步骤而已。
对于安装LZO可能遇到的问题如下几个
1:最常见的应该是如下错误了。
java.io.IOException: java.lang.RuntimeException: native-lzo library not available
at org.apache.hadoop.hive.ql.exec.FetchOperator.getNextRow(FetchOperator.java:544)
at org.apache.hadoop.hive.ql.exec.FetchOperator.pushRow(FetchOperator.java:488)
at org.apache.hadoop.hive.ql.exec.FetchTask.fetch(FetchTask.java:136)
at org.apache.hadoop.hive.ql.Driver.getResults(Driver.java:1412)
at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:271)
at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:216)
at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:413)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:756)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:614)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:156)
Caused by: java.lang.RuntimeException: native-lzo library not available
at com.hadoop.compression.lzo.LzopCodec.createDecompressor(LzopCodec.java:104)
at com.hadoop.compression.lzo.LzopCodec.createInputStream(LzopCodec.java:89)
at com.hadoop.mapred.DeprecatedLzoLineRecordReader.<init>(DeprecatedLzoLineRecordReader.java:59)
at com.hadoop.mapred.DeprecatedLzoTextInputFormat.getRecordReader(DeprecatedLzoTextInputFormat.java:158)
at org.apache.hadoop.hive.ql.exec.FetchOperator.getRecordReader(FetchOperator.java:432)
at org.apache.hadoop.hive.ql.exec.FetchOperator.getNextRow(FetchOperator.java:508)
... 13 more
这个错误引发的地方很多,我从以下几个可能的地方。
1)你的hadoop的本地目录中没有编译好的文件,hadoop的本地文件目录一般是hadoop_home/lib/native/<your_LInux>;
2)JAVA_LIBRARY_PATH没有设定。其实这点很奇怪,有的节点上不设定依旧可以跑。不过过遇到这问题之后,修改一下没命令尝试一下也好。如果解决了问题更好,解决不了那再想办法。使用命令 export JAVA_LIBRARY_PATH=/hadoop/hadoop-1.2.0/lib/native/Linux-amd64-64
3)没有编译hadoop-lzo,按章上面安装步骤编译一遍。
2:可能某个节点上会报有Cannot load liblzo2.so.2 (liblzo2.so.2: cannot open shared object file: No such file or directory)!但是在其他节点上正常。
那这个时候也没有办法就在该节点上安装LZO,使用上述安装命令。