本人捣鼓两天,希望能给其他人一点提示
https://zhuanlan.zhihu.com/p/101997567
上边的楼主总结的不错,但是有两个问题:
第一个是环境即:--archives,用虚拟环境比自己打包方便,可以参考https://www.cnblogs.com/nucdy/p/8569606.html;
第二个是小版本的问题:主要是json4s,https://github.com/dmlc/xgboost/tree/master/jvm-packages从这里下的xgboost的zip文件和jar文件,是0.90版本,如果用Scala2.11的话,应该对应这json4s-core_2.11-3.5.3这个jackson版本,也就是spark-2.4以后比较新的spark版本。如果是spark2.2-spark2.3的话,建议使用
--jars ./xgboost4j-spark-0.80.jar,.xgboost4j-0.80.jar ;
如果是更低的spark版本只能使用0.72版本了,本人在spark2.3使用0.80没问题,使用0.90就会报错:
File "xgtest.py", line 105, in <module>
model.write().overwrite().save("/titanic/xgboost_class_test")
File "/opt/cloudera/parcels/SPARK2-2.3.0.cloudera3-1.cdh5.13.3.p0.458809/lib/spark2/python/lib/pyspark.zip/pyspark/ml/util.py", line 165, in save
File "/opt/cloudera/parcels/SPARK2-2.3.0.cloudera3-1.cdh5.13.3.p0.458809/lib/spark2/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
File "/opt/cloudera/parcels/SPARK2-2.3.0.cloudera3-1.cdh5.13.3.p0.458809/lib/spark2/python/lib/pyspark.zip/pyspark/sql/utils.py", line 63, in deco
File "/opt/cloudera/parcels/SPARK2-2.3.0.cloudera3-1.cdh5.13.3.p0.458809/lib/spark2/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o676.save.
: java.lang.NoSuchMethodError: org.json4s.jackson.JsonMethods$.parse$default$3()Z
jackson版本不一致,和py4j没啥关系,问题在于xgboost4j-spark的编译jar包。
以下是spark2.4.5的json4s版本:
以下是spark2.3.1的json4s版本,0.80里边的编译包应该就是用的这个:
总结:jackson是大数据组件版本更新的标杆,容易出现小版本的问题。