问题重现:关于alluxio+spark报错,Jackson version is too old,不能生成sparkContext
在搭建alluxio(原tachyon)+spark时,我们需要将alluxio-core-client-1.3.0-jar-with-dependencies.jar这个jar包添加到spark的classpath里,这样spark才能访问alluxio上的文件,才能把alluxio文件系统作为输入输出源。
但是,当我们用bin/spark-shell测试时,会出错,不能生成sparkContext,错误截图如下:
关键错误信息 Jackson version is too old 2.4.2
解决办法:
我们进入spark目录的jars目录下,发现:
spark 所用到的jackson版本都是2.6.5,因此一定是alluxio-core-client-1.3.0-jar-with-dependencies.jar中的jackson版本过于低,导致之后的种种错误。
首先,进入产生alluxio-core-client-1.3.0-jar-with-dependencies.jar的这个alluxio子项目
打开pom.xml
可以看到,在编译alluxio时候,激活spark 的profile,会激活以下的依赖项。
我们找到这里的设置,这里的jackson版本是2.6.6,但是由于编译的时候 没有激活spark 的profile,所以从maven库中将2.4的jackson加入到jar包中。因此导致,jackson的版本太老。
为了进一步验证我的猜想,我将alluxio-core-client-1.3.0-jar-with-dependencies.jar这个jar进行解压。
$ jar -xvf alluxio-core-client-1.3.0-jar-with-dependencies.jar
进入该路径,检查版本
果然版本太低,这样说明,这个jar包里的关于jackson的class文件都是低版本2.4的。
所以,我们需要做一下替换。
于是,我们到spark jars目录下,拿到关于jackson的3个2.6.5版本的jar包,在一个目录下解压开,然后将文件夹 com(里面盛放着class文件) 和META-INF(maven等的索引)递归考入到解压的alluxio-core-client-1.3.0-jar-with-dependencies.jar目录里。
$jar -cvf alluxio-core-client-1.3.0-jar-with-dependencies.jar ./*
这样,我们得到了一个新的alluxio-core-client-1.3.0-jar-with-dependencies.jar包,用这个包替换调原来的包
执行
$bin/spark-shell
启动成功。
原因分析:这个锅不得不由maven来背,工具有时候你很爱它,有时候你很恨他
由于没有激活spark profile,jackson的版本就没有更新到2.6,因为即使hadoop2.7,也只不过用jackson2.2,所以2.4对于2.2已经很新了,但是对于spark就too old了。但是-Pspark 去编译alluxio项目,alluxio-core-client-1.3.0-jar-with-dependencies.jar又不完整,所以可能是一个坑吧。
也许有更好的解决方法,但是目前来说,网上真心落地到实事的关于alluxio的文章,blog还是很少,只能自己爬坑呗。