使用saveToPhoenix方法在Hbase上加载/保存RDD时出现异常

时间:2017-07-01 10:28:40

标签: scala apache-spark phoenix

我想使用apache-phoenix框架。 问题是我一直有异常告诉我无法找到类HBaseConfiguration。 这是我想要使用的代码:

import org.apache.spark.SparkContext
import org.apache.spark.sql._
import org.apache.phoenix.spark._

// Load INPUT_TABLE
object MainTest2 extends App {
  val sc = new SparkContext("local", "phoenix-test")
  val sqlContext = new SQLContext(sc)
  val df = sqlContext.load("org.apache.phoenix.spark", Map("table" -> "INPUT_TABLE",
    "zkUrl" -> "localhost:3888"))
}

以下是我正在使用的SBT:

name := "spark-to-hbase"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.apache.hadoop" % "hadoop-mapreduce-client-core" % "2.3.0",
  "org.apache.phoenix" % "phoenix-core" % "4.11.0-HBase-1.3",
  "org.apache.spark" % "spark-core_2.11" % "2.1.1",
  "org.apache.spark" % "spark-sql_2.11" % "2.1.1",
  "org.apache.phoenix" % "phoenix-spark" % "4.11.0-HBase-1.3"
)

以下是例外:

  

线程中的异常" main" java.lang.NoClassDefFoundError:   org / apache / hadoop / hbase / HBaseConfiguration at   org.apache.phoenix.query.ConfigurationFactory $ ConfigurationFactoryImpl $ 1.call(ConfigurationFactory.java:49)     在   org.apache.phoenix.query.ConfigurationFactory $ ConfigurationFactoryImpl $ 1.call(ConfigurationFactory.java:46)     在   org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:76)     在   org.apache.phoenix.util.PhoenixContextExecutor.callWithoutPropagation(PhoenixContextExecutor.java:91)     在   org.apache.phoenix.query.ConfigurationFactory $ ConfigurationFactoryImpl.getConfiguration(ConfigurationFactory.java:46)     在   org.apache.phoenix.jdbc.PhoenixDriver.initializeConnectionCache(PhoenixDriver.java:151)     在   org.apache.phoenix.jdbc.PhoenixDriver。(PhoenixDriver.java:142)     在   org.apache.phoenix.jdbc.PhoenixDriver。(PhoenixDriver.java:69)     在org.apache.phoenix.spark.PhoenixRDD。(PhoenixRDD.scala:43)     在   org.apache.phoenix.spark.PhoenixRelation.schema(PhoenixRelation.scala:52)     在   。org.apache.spark.sql.execution.datasources.LogicalRelation(LogicalRelation.scala:40)     在   org.apache.spark.sql.SparkSession.baseRelationToDataFrame(SparkSession.scala:389)     在   org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:146)     在   org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:125)     在org.apache.spark.sql.SQLContext.load(SQLContext.scala:965)at   MainTest2 $ .delayedEndpoint $ MainTest2 $ 1(MainTest2.scala:9)at at   MainTest2 $ delayedInit $ body.apply(MainTest2.scala:6)at   scala.Function0 $ class.apply $ mcV $ sp(Function0.scala:34)at   scala.runtime.AbstractFunction0.apply $ MCV $ SP(AbstractFunction0.scala:12)     在scala.App $$ anonfun $ main $ 1.apply(App.scala:76)at   scala.App $$ anonfun $ main $ 1.apply(App.scala:76)at   scala.collection.immutable.List.foreach(List.scala:381)at   scala.collection.generic.TraversableForwarder $ class.foreach(TraversableForwarder.scala:35)     在scala.App $ class.main(App.scala:76)at   MainTest2的MainTest2 $ .main(MainTest2.scala:6)(MainTest2.scala)   引起: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   sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:331)at at   java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 26更多

我已经尝试更改hadoop-env.sh中的HADOOP_CLASSPATH,就像之前的post中所述。

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。正如例外所述,我的编译器无法找到类HBaseConfiguration。 HBaseConfiguration在org.apache.hadoop.hbase库中使用,因此需要编译。我注意到HBgConfiguration类并没有像我想象的那样存在于org.apache.hadoop库中。对于我的PC计算机上安装的hbase 1.3.1版本,我设法在位于HBASE_HOME / lib文件夹中的hbase-common-1.3.1 jar中找到该类。

然后我将此依赖项包含在我的built.SBT中:

" org.apache.hbase" %" hbase-common" %" 1.3.1"

异常消失了。