使用phoenix在Hbase

时间:2017-06-30 16:08:51

标签: java scala hadoop hbase phoenix

正如标题所说,我想用凤凰保存我的DataFrame。 我在scala上有一个spark代码,我在intellij IDEA上运行。 这很简单:

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

object MainTest extends App {
  val sparkSession = SparkSession.builder()
    .config("spark.sql.warehouse.dir", "file:///c:/tmp/spark-warehouse")
    .master("local[*]")
    .appName("spark-to-hbase")
    .getOrCreate()

  val sc = sparkSession.sparkContext
  val sqlC = sparkSession.sqlContext
  import sqlC.implicits._

  val myRdd = sc.parallelize(List(("a",1), ("b", 2)))
  myRdd.collect.foreach(println)
  val myDf = myRdd.toDF("column1", "column2")
  myDf.show()
  myDf.saveToPhoenix("MY_TABLE", zkUrl = Some("localhost:16000"))
}

我还有一个HBase数据库在端口16000上的同一台PC上运行。 问题是该行

myDf.saveToPhoenix("MY_TABLE", zkUrl = Some("localhost:16000"))

抛出此异常:

  

线程“main”中的异常java.lang.NoClassDefFoundError:   org / apache / hadoop / hbase / types / DataType at   java.lang.ClassLoader.defineClass1(Native Method)at   java.lang.ClassLoader.defineClass(ClassLoader.java:763)at   java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)     在java.net.URLClassLoader.defineClass(URLClassLoader.java:467)at   java.net.URLClassLoader.access $ 100(URLClassLoader.java:73)at   java.net.URLClassLoader $ 1.run(URLClassLoader.java:368)at   java.net.URLClassLoader $ 1.run(URLClassLoader.java:362)at   java.security.AccessController.doPrivileged(Native Method)at   java.net.URLClassLoader.findClass(URLClassLoader.java:361)at   java.lang.ClassLoader.loadClass(ClassLoader.java:424)at   sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:335)at at   java.lang.ClassLoader.loadClass(ClassLoader.java:357)at   org.apache.phoenix.spark.DataFrameFunctions $$ anonfun $ getFieldArray $ 2.适用(DataFrameFunctions.scala:72)     在   org.apache.phoenix.spark.DataFrameFunctions $$ anonfun $ getFieldArray $ 2.适用(DataFrameFunctions.scala:72)     在   scala.collection.TraversableLike $$ anonfun $表$ 1.适用(TraversableLike.scala:234)     在   scala.collection.TraversableLike $$ anonfun $表$ 1.适用(TraversableLike.scala:234)     在   scala.collection.IndexedSeqOptimized $ class.foreach(IndexedSeqOptimized.scala:33)     在   scala.collection.mutable.ArrayOps $ ofRef.foreach(ArrayOps.scala:186)     在   scala.collection.TraversableLike $ class.map(TraversableLike.scala:234)     在scala.collection.mutable.ArrayOps $ ofRef.map(ArrayOps.scala:186)     在   org.apache.phoenix.spark.DataFrameFunctions.getFieldArray(DataFrameFunctions.scala:72)     在   org.apache.phoenix.spark.DataFrameFunctions.saveToPhoenix(DataFrameFunctions.scala:35)     在MainTest $ .delayedEndpoint $ MainTest $ 1(MainTest.scala:23)at   MainTest $ delayedInit $ body.apply(MainTest.scala:8)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   MainTest $ .main(MainTest.scala:8)在MainTest.main(MainTest.scala)   引起:java.lang.ClassNotFoundException:   org.apache.hadoop.hbase.types.DataType at   java.net.URLClassLoader.findClass(URLClassLoader.java:381)at   java.lang.ClassLoader.loadClass(ClassLoader.java:424)at   sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:335)at at   java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 33更多

据我了解,似乎java找不到一些类。 我该怎么办?

我的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"
)

2 个答案:

答案 0 :(得分:0)

方法saveToPhoenix需要RDD。对于数据框架,请使用save(有关详情,请参阅此doc):

myDf.save("org.apache.phoenix.spark", SaveMode.Overwrite,
  Map("MY_TABLE" -> "OUTPUT_TABLE", "zkUrl" -> "localhost:16000"))

答案 1 :(得分:0)

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

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

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

异常消失了。