$ cd /usr/lib/spark/bin $ ./spark-sql java.lang.ClassNotFoundException: org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:247) at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:319) at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75) at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) Failed to load Spark SQL CLI main class org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver. You need to build Spark with -Phive.
在 cdh5.4 中会出现下面异常:
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.cli.CliDriver at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 18 more
从上可以知道 Spark-SQL 编译时没有集成 Hive,故需要重新编译 spark 源代码。
编译 Spark-SQL以下内容参考 编译Spark源代码。
下载cdh5-1.3.0_5.4.0分支的代码:
$ git clone git@github.com:cloudera/spark.git $ cd spark $ git checkout -b origin/cdh5-1.3.0_5.4.0
使用maven 编译,先修改根目录下的 pom.xml,添加一行 <module>sql/hive-thriftserver</module>:
<modules> <module>core</module> <module>bagel</module> <module>graphx</module> <module>mllib</module> <module>tools</module> <module>streaming</module> <module>sql/catalyst</module> <module>sql/core</module> <module>sql/hive</module> <module>sql/hive-thriftserver</module> <!--添加的一行--> <module>repl</module> <module>assembly</module> <module>external/twitter</module> <module>external/kafka</module> <module>external/flume</module> <module>external/flume-sink</module> <module>external/zeromq</module> <module>external/mqtt</module> <module>examples</module> </modules>
然后运行:
$ export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m" $ mvn -Pyarn -Dhadoop.version=2.6.0-cdh5.4.0 -Phive -Phive-thriftserver -DskipTests clean package
如果编译成功之后, 会在 assembly/target/scala-2.10 目录下生成:spark-assembly-1.3.0-cdh5.4.0.jar,在 examples/target/scala-2.10 目录下生成:spark-examples-1.3.0-cdh5.4.0.jar,然后将 spark-assembly-1.3.0-cdh5.4.0.jar 拷贝到 /usr/lib/spark/lib 目录,然后再来运行 spark-sql。
但是,经测试 cdh5.4.0 版本中的 spark 的 sql/hive-thriftserver 模块存在编译错误,最后无法编译成功,故需要等到 cloudera 官方更新源代码或者等待下一个 cdh 版本集成 spark-sql。
虽然 spark-sql 命令用不了,但是我们可以在 spark-shell 中使用 SQLContext 来运行 sql 语句,限于篇幅,这里不做介绍,你可以参考 。
6. 总结本文主要介绍了 CDH5 集群中 Spark 的安装过程以及三种集群运行模式:
Standalone – spark-shell --master spark://host:port
Apache Mesos – spark-shell --master mesos://host:port
Hadoop YARN – spark-shell --master yarn
如果以本地模式运行,则为 spark-shell --master local。
--------------------------------------分割线 --------------------------------------