Spark上用saveAsHadoopDataset向hbase保存数据,长时间等待!

pjh159 2016-08-25 05:49:15
先说一下环境,
3台server:master, slave01, slave02
hadoop cluster、hbase cluster、spark cluster 同样的部署在这3台机器上。

首先是代码:
object SparkOnHBase {
def convertScanToString(scan: Scan) = {
val proto = ProtobufUtil.toScan(scan)
Base64.encodeBytes(proto.toByteArray)
}

def main(args: Array[String]) {
val conf = new SparkConf().setAppName("FileAna").setMaster("spark://master:7077").
set("spark.driver.host", "192.168.1.139").
setJars(List("/home/pang/woozoomws/spark-service.jar",
"/home/pang/woozoomws/spark-service/lib/hbase/hbase-common-1.2.2.jar",
"/home/pang/woozoomws/spark-service/lib/hbase/hbase-client-1.2.2.jar",
"/home/pang/woozoomws/spark-service/lib/hbase/hbase-protocol-1.2.2.jar",
"/home/pang/woozoomws/spark-service/lib/hbase/htrace-core-3.1.0-incubating.jar",
"/home/pang/woozoomws/spark-service/lib/hbase/hbase-server-1.2.2.jar"))
val sc = new SparkContext(conf)

val hbaseConf = HBaseConfiguration.create()

val jobConf = new JobConf(hbaseConf, this.getClass)
jobConf.setOutputFormat(classOf[TableOutputFormat])
jobConf.set(TableOutputFormat.OUTPUT_TABLE, "MissionItem")

def convert(triple: (Int, String, Int)) = {
val p = new Put(Bytes.toBytes(triple._1))
p.addColumn(Bytes.toBytes("data"), Bytes.toBytes("name"), Bytes.toBytes(triple._2))
p.addColumn(Bytes.toBytes("data"), Bytes.toBytes("age"), Bytes.toBytes(triple._3))
(new ImmutableBytesWritable, p)
}

// step 3: read RDD data from somewhere and convert
val rawData = List((1, "lilei", 14), (2, "hanmei", 18), (3, "someone", 38))
val localData = sc.parallelize(rawData).map(convert)

//step 4: use `saveAsHadoopDataset` to save RDD to HBase
localData.saveAsHadoopDataset(jobConf)
}
}

在scala sdk当中直接运行,在下面几行日志之后,会出现长时间等待:
16/08/25 00:02:00 INFO BlockManagerInfo: Added broadcast_0_piece0 in memory on 192.168.1.247:55383 (size: 28.2 KB, free: 366.3 MB)

从web site可以看到大量的下面这样的信息:

16/08/25 22:50:23 INFO client.RpcRetryingCaller: Call exception, tries=10, retries=35, started=38411 ms ago, cancelled=false, msg=row 'MissionItem,,99999999999999' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=master,16020,1472135364343, seqNum=0


但是如果是下面这样的代码,就没有问题:
val hbaseConf = HBaseConfiguration.create()
val table = new HTable(hbaseConf, TableName.valueOf("MissionItem"))
for (i <- 0 until 100) {
val put = new Put(Bytes.toBytes(String.valueOf(i)))
put.addColumn(Bytes.toBytes("data"), Bytes.toBytes("x"),
Bytes.toBytes(String.valueOf(i)));
table.put(put);
}
谁能告诉我是怎么回事?
...全文
2159 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
AhoBric 2018-08-29
  • 打赏
  • 举报
回复
引用 3 楼 link0007 的回复:
好吧,现在有更舒爽的API了:引入hbase-spark依赖,用HBaseContext.bulkLoad生成HFile,然后通过LoadIncrementalHFiles.doBulkLoad导入到HBase表。非常非常快!


cloudera的那个依赖? 我在maven上下载不了,而且没有找到jar包,请问你有否?
LinkSe7en 2018-08-29
  • 打赏
  • 举报
回复
引用 6 楼 qq_31215163 的回复:
[quote=引用 3 楼 link0007 的回复:]
好吧,现在有更舒爽的API了:引入hbase-spark依赖,用HBaseContext.bulkLoad生成HFile,然后通过LoadIncrementalHFiles.doBulkLoad导入到HBase表。非常非常快!


cloudera的那个依赖? 我在maven上下载不了,而且没有找到jar包,请问你有否?[/quote]
pom的repositories标签添加如下项目:

<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
西红小柿 2017-10-18
  • 打赏
  • 举报
回复
引用 3 楼 link0007 的回复:
好吧,现在有更舒爽的API了:引入hbase-spark依赖,用HBaseContext.bulkLoad生成HFile,然后通过LoadIncrementalHFiles.doBulkLoad导入到HBase表。非常非常快!
能贴出使用该方式成功运行的代码吗?
1024没有人 2017-07-21
  • 打赏
  • 举报
回复
我也遇到这个问题,检查之后发现每次调用saveAsHadoopDataset方法后,没有释放zookeeper的session,导致zookeeper的session达到最大值(默认60),可以通过设置zookeeper的最大连接数,但是一直不释放session才是根本问题! 到现在我也没找到解决办法,觉得通过设置zookeeper的最大连接数不是最好的解决办法
LinkSe7en 2017-07-19
  • 打赏
  • 举报
回复
好吧,现在有更舒爽的API了:引入hbase-spark依赖,用HBaseContext.bulkLoad生成HFile,然后通过LoadIncrementalHFiles.doBulkLoad导入到HBase表。非常非常快!
1024没有人 2017-07-19
  • 打赏
  • 举报
回复
我也遇到一样的问题,请问楼主问题解决了吗?
LinkSe7en 2016-08-26
  • 打赏
  • 举报
回复
建议用foreachPartition的方法用put存HBASE。

1,258

社区成员

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

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