Spark无法写数据到hbase

ks767682 2017-08-29 02:13:15
具体代码如下。一直spark能够代码正常运行,hbase也能正常连接。但是在spark的foreachPartition中连接hbase时即没有报错,也没有成功将数据写入到hbase。已验证foreachPartition中的代码单独运行时没有问题的!


HiveContext hv = new HiveContext(sc);
DataFrame data = hv.sql("select * from url_pending limit 10");
data.show(2);
data.toJavaRDD().foreachPartition(new VoidFunction<Iterator<Row>>() {
@Override
public void call(Iterator<Row> rows) {
Row row;
Configuration conf = conf = HBaseConfiguration.create();
conf.set("hbase.rootdir", "hdfs://archive.cloudera.com:9000/hbase");
conf.set("zookeeper.znode.parent", "/hbase");
conf.set("hbase.zookeeper.quorum", "GDLT10471");
HConnection connection;
try {
connection = HConnectionManager.createConnection(conf);
HTableInterface table = connection.getTable("url_matched");
table.setAutoFlush(true);
List<Put> list = new ArrayList<Put>();
Put put ;
while(rows.hasNext()){
row = rows.next();
put = new Put(Bytes.toBytes(UUID.randomUUID().toString()));
String url = row.getString(0);
put.add(Bytes.toBytes("baseData"), Bytes.toBytes("url"),Bytes.toBytes(url));
put.add(Bytes.toBytes("baseData"), Bytes.toBytes("phone"),Bytes.toBytes(row.getString(1)));
System.out.println("URL:"+row.getString(0)+"phone:"+row.getString(1));
list.add(put);
}
table.put(list);
table.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
...全文
555 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
HBaseConnectionManager是我写的一个自定义类,所以它不是重点
  • 打赏
  • 举报
回复
我先给你一段我写的好使的

 df.rdd.map(message => {
      val key= message.key
      val value= message.value
      val put: Put = new Put(key.getBytes())
      put.addColumn("data".getBytes(), "value".getBytes(), value.getBytes())
      put
    }).foreachPartition(list => {
        val table: Table = HBaseConnectionManager.getConnection().getTable(TableName.valueOf(tableName))
        table.put(JavaConversions.seqAsJavaList(list.toSeq))
        table.close()
    })
HBaseConnectionManager这个类是个scala的object,java里相当于单例,目的是不重复创建数据库连接。 我这段代码是能执行的但是foreachPartition里数量有点多,时间长了就提示我put提交次数过多,所以我现在在优化这段代码 但是当我把代码改成下边这样,只能进入第一个Partition,然后打印出来的数组大小居然是0,if和下边的打印冲突,这个我暂时还没研究明白是为什么

.foreachPartition(list => {
        if(list.size>0){
        println("数组大小:"+list.size)
        val table: Table = HBaseConnectionManager.getConnection().getTable(TableName.valueOf(tableName))
        table.put(JavaConversions.seqAsJavaList(list.toSeq))
        table.close()
        }

    })
  • 打赏
  • 举报
回复
我遇到了和你一样的问题,CSDN没什么狠人了,你这个问题很难有人回答,这个问题已经卡了我一天了,我好了告诉你

1,261

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧