我有一个用Scala编写的Apache Spark应用程序,它试图从HBase读取数据并用它做一些事情。
我遇到了像这样做到这一点的方法,以及如何使用 Spark 流来实现
所以我写了以下代码:
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表是这样创建的: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)
在这里阅读了此异常后,我可能应该将其添加为堆栈跟踪的一部分:
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
我的问题是:
- 有人可以展示一些使用 Spark 从 HBase 检索数据的基本方法吗?最好是比我显示的链接更新的内容,并且
- 另外,如果我在代码中做错了什么,如果您能告诉我什么,我将不胜感激
如果我能以某种方式将数据作为数据帧读取,那就更好
了我正在使用 Spark 1.6.0 和 HBase 1.2.0
提前致谢
所以显然这是一个意想不到的依赖关系问题(就像它没有任何意义时一样)。
这些是我为了解决这个问题而采取的步骤(希望它们能帮助未来的开发人员):
- 我用完全相同的代码创建了一个干净的项目。这没有任何问题,这立即让我怀疑这是某种依赖性问题
- 为了确保这一点,我将 HBase 依赖项放在依赖项的顶部。这创建了一个与Spark和安全性相关的不同异常,更具体地说:javax.servlet.FilterRegistration
- 然后我遇到了这个有用的解决方案,为我解决了这个问题。我不得不从我的pom中排除所有的javax和mortbay码头。这解决了我所有的问题
就是这样:)