最近在学习spark,遇到了一个问题,也花费了一天时间去解决,问题如下:
Exception in thread “main” java.lang.RuntimeException: Error in configuring object
at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:109)
at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:75)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)
说实话这个问题一开始我遇到有点懵逼,为什么呢,因为我一开始是在spark local模式下执行的一个程序,完全没有问题,但是来到spark on yarn 模式下就这样了。看日志说我缺失lzo的类,没有道理的,我cdh的hdfs其实已经配置了这个压缩格式了,然后我的yarn也有了,如下图:下图1 显示其实我已经配置了com.hadoop.compression.lzo.LzopCodec这种压缩格式了
图1
然后我又去yarn配置上看一下,也配置了lzo
所以应该不是我的hdfs和yarn的问题,应该是我的spark没有这个类来进行解压缩,那我猜测应该要去spark的conf目录下配置一下,
当然怎么配我还是不清楚,所以也参考了很多文章,比如下面这篇文章
https://blog.csdn.net/stark_summer/article/details/48375999
写的很详细,我就配置了如下:
export SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:/opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/native
export SPARK_CLASSPATH=$SPARK_CLASSPATH:/opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/*
配置完继续跑程序,发现还会报错:
java.lang.UnsatisfiedLinkError: no gplcompression in java.library.path
这个问题也是尴尬,我也实在无奈了,一下子也看不懂,
找了好久终于发现一位大哥写的文章解决了我的疑惑:
https://www.cnblogs.com/LiuYanYGZ/p/6110822.html
原因如下:
Java一般使用两个path:classpath 和 java.library.path
classpath是指向jar包的位置
java.library.path是非java类包的位置如(dll,so)
解决办法:
第一种方法,在代码里设置环境变量
第二种方法:执行时在vm arguments里添加-Djava.library.path= /usr/local/lib,例如java -Djava.library.path=. xxx(xxx是某个类文件的名字,不包括后缀)
第三种方法:设置环境变量java.library.path
1:Linux下的系统变量LD_LIBRARY_PATH来添加java.library.path
2:Windows下设置哪个环境变量???
由于我的是在Linux环境下的,所以我的解决办法就是:添加系统变量LD_LIBRARY_PATH
所以最终要在spark-env.sh 下添加的是:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/native
export SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:/opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/native
export SPARK_CLASSPATH=$SPARK_CLASSPATH:/opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/*
OK,最终解决了我的问题了,不过花的时间也是多啊,本人小菜鸟一名,请多多指教