从Spark Streaming写入HBase

时间:2016-04-06 08:25:00

标签: apache-spark hbase spark-streaming

我在Spark Streaming(使用Scala)中输入了由(key,value)对组成的文件,如果密钥满足某个条件,我需要做的是将值存储在HBase中。 因为我有:

val pair: DStream[(String, String)]

我试图做的是地图中的条件,并从那里尝试在HBase中插入值:

pair.map(x => {
if (x._1 == "condition")
{ val hconf = HBaseConfiguration.create()
val hTable = new HTable(hconf, "mytab")
val thePut = new Put(Bytes.toBytes(1))
thePut.add(Bytes.toBytes("colfamily"), Bytes.toBytes("c1"), Bytes.toBytes(x._2)
hTable.put(thePut)
})
}

然而,这并不起作用,并且在使用spark-submit说明时出现错误:没有注册输出操作,因此无需执行

这是我能想到将值插入HBase的唯一方法,我做错了吗?你能帮我解决一下吗?

以下是更新后的代码:

pair.foreachRDD(rdd => rdd.map( p =>
{val hconf = HBaseConfiguration.create()
 val hTable = new HTable(hconf,"mytab")
 val thePut = new Put(Bytes.toBytes(1))
 thePut.add(Bytes.toBytes("colfamily"), Bytes.toBytes(p._1), Bytes.toBytes(p._2)
 hTable.put(thePut)
})

当我使用Spark-submit运行它时,我收到错误说"任务不可序列化" ,你知道这意味着什么以及如何解决它吗?

提前谢谢

1 个答案:

答案 0 :(得分:0)

- 琼,

您收到错误消息的原因是您在代码中缺少名为 pair 的RDD上的操作。

请参阅以下更正的代码。

  pair.foreachRDD((rdd : [RDD(String,String)]) => {  
 val newRdd = rdd.map(p=> (p._1,p._2))
        if (mewRdd._1 == "condition")
        {
         /* Your code*/
        }})

要通过spark streaming在hbase中插入数据,请参阅此文https://www.mapr.com/blog/spark-streaming-hbase 我希望这有帮助。