最近想将spark升级到1.0,看了看官网的介绍,1.0的变动还是蛮大的,包括提交的方式,加入对kafka,flume等的支持。于是官网下载1.0的source自己用maven编译。

    首先需要升级下scala,0.9对应的是scala-2.9.x,1.0需要升级到scala-2.10.x。然后按照spark官网的提示首先设置maven的java虚拟机参数

export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"

    如果不设置的话,会在编译的时候出现outOfMemory。然后结合安装的hadoop版本使用maven进行编译。

mvn -Pyarn -Dhadoop.version=2.3.0-cdh5.0.0 -DskipTests clean package

    编译需要等的时间比较长,一般会比较顺利,maven会自动下载需要的jar。

    编译完成之后,做个简单的本地测试

./bin/run-example SparkPi 10

    搞定之后,对spark on yarn进行测试。官网的文档和我实际下的spark的提交命令还是有些出入,最好在提交之前,先用 ./bin/spark-submit --help命令看下参数,否则直接用官网给的参数会报错。

    我的提交命令是

./bin/spark-submit --class org.apache.spark.examples.SparkPi \
    --master yarn \
    --deploy-mode cluster \
    --num-executors 3 \
    --driver-memory 4g \
    --executor-memory 2g \
    --executor-cores 1 \
    --queue yarn \
    examples/target/spark-examples_2.10-1.0.0.jar \
    10

    紧接着就直接抛出异常

INFO service.AbstractService: Service org.apache.hadoop.yarn.client.api.impl.YarnClientImpl failed in state STARTED; cause: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.lang.reflect.InvocationTargetException

org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.lang.reflect.InvocationTargetException

Caused by: java.lang.VerifyError: class org.apache.hadoop.yarn.proto.YarnServiceProtos$GetQueueInfoRequestProto overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;

    猜测可能是protobuf的jar有版本冲突,find / -name protobuf-java*.jar了下,果然发现spark编译用的是2.4.1版本,而hadoop用的则是2.5.0版本,这样在进行rpc通信的时候,会导致失败。于是将$SPARK_HOME下的pom.xml中的protobuf版本改为2.5.0,重新进行编译,测试后问题解决。

    但是spark1.0与protobuf2.5.0是否完全兼容,还要看后续更多的测试来验证。



参考资料

    http://apache-spark-user-list.1001560.n3.nabble.com/Using-ProtoBuf-2-5-for-messages-with-Spark-Streaming-td3396.html

    http://apache-spark-user-list.1001560.n3.nabble.com/Error-reading-HDFS-file-using-spark-0-9-0-hadoop-2-2-0-incompatible-protobuf-2-5-and-2-4-1-td2158.html#a2807