Scala 编译Spark代码时出错:对象mapreduce不是包org.apache.hadoop.hbase的成员
编辑:我将顶级pom文件中定义的hbase依赖项添加到项目级pom中,现在它可以找到包了 我有一个scala对象从Spark(1.0.1)中的HBase(0.98.4-hadoop2)表读取数据。但是,在尝试导入org.apache.hadoop.hbase.mapreduce.TableInputFormat时,使用maven编译会导致错误Scala 编译Spark代码时出错:对象mapreduce不是包org.apache.hadoop.hbase的成员,scala,maven,hbase,apache-spark,Scala,Maven,Hbase,Apache Spark,编辑:我将顶级pom文件中定义的hbase依赖项添加到项目级pom中,现在它可以找到包了 我有一个scala对象从Spark(1.0.1)中的HBase(0.98.4-hadoop2)表读取数据。但是,在尝试导入org.apache.hadoop.hbase.mapreduce.TableInputFormat时,使用maven编译会导致错误 error: object mapreduce is not a member of package org.apache.hadoop.hbase 代
error: object mapreduce is not a member of package org.apache.hadoop.hbase
代码和相关pom如下所示:
import org.apache.hadoop.hbase.util.Bytes
import org.apache.spark.rdd.NewHadoopRDD
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.mapred.JobConf
import org.apache.spark.SparkContext
import java.util.Properties
import java.io.FileInputStream
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
object readDataFromHbase {
def main(args: Array[String]): Unit = {
var propFileName = "hbaseConfig.properties"
if(args.size > 0){
propFileName = args(0)
}
/** Load properties **/
val prop = new Properties
val inStream = new FileInputStream(propFileName)
prop.load(inStream)
//set spark context and open input file
val sparkMaster = prop.getProperty("hbase.spark.master")
val sparkJobName = prop.getProperty("hbase.spark.job.name")
val sc = new SparkContext(sparkMaster,sparkJobName )
//set hbase connection
val hbaseConf = HBaseConfiguration.create()
hbaseConf.set("hbase.rootdir", prop.getProperty("hbase.rootdir"))
hbaseConf.set(TableInputFormat.INPUT_TABLE, prop.getProperty("hbase.table.name"))
val hBaseRDD = sc.newAPIHadoopRDD(hbaseConf, classOf[org.apache.hadoop.hbase.mapreduce.TableInputFormat],
classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
classOf[org.apache.hadoop.hbase.client.Result]
)
val hBaseData = hBaseRDD.map(t=>t._2)
.map(res =>res.getColumnLatestCell("cf".getBytes(), "col".getBytes()))
.map(c=>c.getValueArray())
.map(a=> new String(a, "utf8"))
hBaseData.foreach(println)
}
}
pom文件的Hbase部分是(Hbase.version=0.98.4-hadoop2):
org.apache.hbase
数据库
${hbase.version}
org.apache.hbase
hbase客户端
${hbase.version}
org.apache.hbase
hbase服务器
${hbase.version}
org.apache.hbase
hbase通用
${hbase.version}
org.apache.hbase
hbase-hadoop2-compat
${hbase.version}
org.apache.hbase
hbase hadoop compat
${hbase.version}
org.apache.hbase
hbase hadoop compat
${hbase.version}
org.apache.hbase
hbase协议
${hbase.version}
我把包裹洗干净了,运气不好。我从导入中需要的主要内容是用于设置RDD的classOf(TableInputFormat)。我怀疑我的pom文件中缺少一个依赖项,但无法确定是哪一个。非常感谢您的帮助。在spark 1.0及更高版本中: 将所有hbase jar放入spark/assembly/lib或spark/core/lib目录。希望您有docker来自动化所有这些 a) 对于CDH版本,relate hbase jar通常位于/usr/lib/hbase/*.jar下,它是指向正确jar的符号链接
b) 从
org.apache.hadoop.hbase.mapreduce中可以看到一篇很好的文章
packacge,它是工件的一部分,因此您需要将其作为依赖项添加,如@commented:
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>${hbase.version}</version>
</dependency>
org.apache.hbase
hbase服务器
${hbase.version}
好的。对我来说,它在hbase服务器中。
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>${hbase.version}</version>
</dependency>