java.lang.classnotfoundexception:org.apache.hadoop.hbase.hbaseconfiguration

6g8kf2rb  于 2021-06-09  发布在  Hbase
关注(0)|答案(2)|浏览(720)

我想使用scala示例创建我的第一个scala程序 HBaseTest2.scala ,见sparkd 1.4.1。目标是连接到hbase并执行一些基本操作,例如计算行数或扫描行。然而,当我试图执行程序时,我得到了一个错误。看来斯帕克找不到班级了 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()
  }
}

/构建.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

问题可能来自中提到的hbase配置 HBaseTest2.scala 第16行:
//请确保hbase\u conf\u dir位于spark驱动程序的类路径上
//例如:通过spark.driver.extraclasspath属性进行设置
//在spark-defaults.conf中或通过--driver类路径
//spark submit的命令行选项
但我不知道如何配置它。。。我添加了 HBASE_CONF_DIRCLASSPATH 在我的命令行中。类路径现在是 /usr/local/Cellar/hadoop/hbase-1.0.1.1/conf . 什么都没发生。。。那我该怎么做才能把它修好呢?如果需要,我可以添加/删除详细信息。谢谢!!

moiiocjp

moiiocjp1#

问题来自hbasetest2.scala第33行中提到的类路径设置:
//请确保hbase\u conf\u dir位于spark驱动程序的类路径上
//例如:通过spark.driver.extraclasspath属性进行设置
//在spark-defaults.conf中或通过--driver类路径
//spark submit的命令行选项
因为我使用的是MacOSX,所以设置与linux不同。当我试着 echo $CLASSPATH ,它返回空的。mac似乎没有使用类路径来完成驱动程序的工作。所以我需要通过spark-defaults.conf文件中的spark.driver.extraclasspath添加所有jar文件。我的同事在linux上也是这样做的。我认为有更好的方法来优雅地处理它,但我们没有发现。如果你知道答案,请分享。谢谢。
mac/linux系统
在conf/spark-defaults.conf中添加所有外部jar

spark.driver.extraClassPath    /path/to/a.jar:/path/to/b.jar:/path/to/c.jar
6gpjuf90

6gpjuf902#

你试过了吗

sparkConf.set("spark.driver.extraClassPath", "/usr/local/Cellar/hadoop/hbase-1.0.1.1/conf")

相关问题