我想使用 Sparkd 1.4.1 中提供的scala示例HBaseTest2.scala
创建我的第一个scala程序。目标是连接到HBase并执行一些基本操作,例如计算行或扫描行。但是,当我尝试执行程序时,出现错误。似乎Spark无法找到类HBaseConfiguration
。假设我们找到了项目HBaseTest2 /usr/local/Cellar/spark/programs/HBaseTest2
的根路径。以下是例外的一些细节:
./ src / main / scala / com / orange / spark / examples / HBaseTest2.scala
package com.orange.spark.examples
import org.apache.hadoop.hbase.client.HBaseAdmin
import org.apache.hadoop.hbase.{HBaseConfiguration, HTableDescriptor, TableName}
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.spark._
object HBaseTest2 {
def main(args: Array[String]) {
val sparkConf = new SparkConf().setAppName("HBaseTest2")
val sc = new SparkContext(sparkConf)
val tableName = "personal-cloud-test"
// please ensure HBASE_CONF_DIR is on classpath of spark driver
// e.g: set it through spark.driver.extraClassPath property
// in spark-defaults.conf or through --driver-class-path
// command line option of spark-submit
val conf = HBaseConfiguration.create()
// Other options for configuring scan behavior are available. More information available at
// http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/TableInputFormat.html
conf.set(TableInputFormat.INPUT_TABLE, tableName)
// Initialize hBase table if necessary
val admin = new HBaseAdmin(conf)
if (!admin.isTableAvailable(tableName)) {
val tableDesc = new HTableDescriptor(TableName.valueOf(tableName))
admin.createTable(tableDesc)
}
val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],
classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
classOf[org.apache.hadoop.hbase.client.Result])
println("hbaseRDD.count()")
println(hBaseRDD.count())
sc.stop()
admin.close()
}
}
./ build.sbt
我在这个文件中添加了依赖项,以确保所有调用的类都包含在jar文件中。
name := "HBaseTest2"
version := "1.0"
scalaVersion := "2.11.7"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.1"
libraryDependencies ++= Seq(
"org.apache.hadoop" % "hadoop-core" % "1.2.1",
"org.apache.hbase" % "hbase" % "1.0.1.1",
"org.apache.hbase" % "hbase-client" % "1.0.1.1",
"org.apache.hbase" % "hbase-common" % "1.0.1.1",
"org.apache.hbase" % "hbase-server" % "1.0.1.1"
)
运行应用
MacBook-Pro-de-Mincong:spark-1.4.1 minconghuang$ bin/spark-submit \
--class "com.orange.spark.examples.HBaseTest2" \
--master local[4] \
../programs/HBaseTest2/target/scala-2.11/hbasetest2_2.11-1.0.jar
异常
15/08/18 12:06:17 INFO storage.BlockManagerMaster: Registered BlockManager
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
at com.orange.spark.examples.HBaseTest2$.main(HBaseTest2.scala:21)
at com.orange.spark.examples.HBaseTest2.main(HBaseTest2.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:665)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:170)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:193)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:112)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.HBaseConfiguration
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 11 more
15/08/18 12:06:17 INFO spark.SparkContext: Invoking stop() from shutdown hook
问题可能来自HBaseTest2.scala
第16行中提到的HBase配置:
//请确保HBASE_CONF_DIR位于火花驱动器的类路径上 //例如:通过spark.driver.extraClassPath属性设置它 //在spark-defaults.conf中或通过--driver-class-path
// spark-submit的命令行选项
但我不知道如何配置它...我已在命令行中将HBASE_CONF_DIR
添加到CLASSPATH
。 CLASSPATH现在是/usr/local/Cellar/hadoop/hbase-1.0.1.1/conf
。什么都没发生...... T_T那么我该怎么做才能解决这个问题呢?如果需要,我可以添加/删除详细信息。非常感谢!!
答案 0 :(得分:0)
你试过吗
sparkConf.set("spark.driver.extraClassPath", "/usr/local/Cellar/hadoop/hbase-1.0.1.1/conf")
答案 1 :(得分:0)
问题来自于HBaseTest2.scala第33行中提到的类路径设置:
//请确保HBASE_CONF_DIR位于火花驱动器的类路径上 //例如:通过spark.driver.extraClassPath属性设置它 //在spark-defaults.conf中或通过--driver-class-path
// spark-submit的命令行选项
由于我使用的是 MAC OS X ,因此设置与Linux不同。当我尝试echo $CLASSPATH
时,它返回空。似乎Mac不使用CLASSPATH来执行驱动程序作业。所以我需要通过spark-defaults.conf文件中的spark.driver.extraClassPath添加所有jar文件。我的同事在Linux中做了同样的事情。我认为有一种更好的方式来优雅地处理它,但我们没有发现。如果您知道答案,请分享。感谢。
Mac / Linux
在conf / spark-defaults.conf
spark.driver.extraClassPath /path/to/a.jar:/path/to/b.jar:/path/to/c.jar