使用 Apache Spark 从 HBase 读取数据

Reading data from HBase using Apache Spark

我有一个用 Scala 编写的 Apache Spark 应用程序,它试图从 HBase 读取数据并对其进行处理。

我遇到过像 this and also how to do so using Spark Streaming

这样的方法

所以我写了下面的代码:

def main(args: Array[String]): Unit = {
    val configuration = HBaseConfiguration.create()
    configuration.set(TableInputFormat.INPUT_TABLE, "urls")
    configuration.set(TableInputFormat.SCAN_COLUMNS, "values:words")
    val hbaseRdd = sc.newAPIHadoopRDD(configuration,
        classOf[TableInputFormat],
        classOf[ImmutableBytesWritable],
        classOf[Result]
    )
    val data = hbaseRdd.map(entry => {
      val result = entry._2
      Bytes.toString(result.getRow)
    })
    data.foreach(println)
}

我的 HBase table 是这样创建的:create 'urls', {NAME => 'values', VERSIONS => 5}

我得到的是:

16/03/10 17:10:17 ERROR TableInputFormat: java.io.IOException: java.lang.reflect.InvocationTargetException
    at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:240)
    at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:218)
    at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:119)
    at org.apache.hadoop.hbase.mapreduce.TableInputFormat.initialize(TableInputFormat.java:183)
    at org.apache.hadoop.hbase.mapreduce.TableInputFormatBase.getSplits(TableInputFormatBase.java:241)
    at org.apache.hadoop.hbase.mapreduce.TableInputFormat.getSplits(TableInputFormat.java:237)

读完这个异常后 here 我可能应该将其添加为堆栈跟踪的一部分:

Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:238)
    ... 34 more
Caused by: java.lang.ClassCastException: org.apache.hadoop.hbase.ipc.RpcClientImpl cannot be cast to org.apache.hadoop.hbase.ipc.RpcClient
    at org.apache.hadoop.hbase.ipc.RpcClientFactory.createClient(RpcClientFactory.java:64)
    at org.apache.hadoop.hbase.ipc.RpcClientFactory.createClient(RpcClientFactory.java:48)
    at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.<init>(ConnectionManager.java:637)
    ... 39 more

我的问题是:

  1. 有人可以展示一些使用 Spark 从 HBase 检索数据的基本方法吗?最好是比我显示的链接更更新的内容
  2. 此外,如果我在代码中做错了什么,如果你能告诉我什么,我将不胜感激

如果我能以某种方式将数据读取为数据帧,那就更好了

我正在使用 Spark 1.6.0 和 HBase 1.2.0

提前致谢

好吧,很明显这是一个意外的依赖关系问题(因为它总是在没有任何意义的时候)。

这些是我为解决这个问题所采取的步骤(希望它们能帮助未来的开发人员):

  1. 我用完全相同的代码创建了一个干净的项目。这没有任何问题立即让我怀疑这是某种依赖性问题
  2. 为了确保,我将 HBase 依赖项放在依赖项的顶部。这创建了一个与 Spark 和安全相关的不同异常,更具体地说:javax.servlet.FilterRegistration
  3. 然后我遇到了 解决方案,为我解决了这个问题。我不得不从我的 pom.xml 中排除所有的 javax 和 mortbay jetty。这解决了我所有的问题

就是这样:)