Spark saveAsNewAPIHadoopDataset算子将数据写入到HBase底层实现分析

    因为组内要做一次Spark读写HBase的分享,之前写过一篇Spark读取HBase数据分析的文章,这一次来分析下Spark是如何将数据写入到HBase中的。本文只打算分析下saveAsNewAPIHadoopDataset算子的写入方式,有其他方式后续再另外分析。

    算子使用示例如下:

      val sc = sparkSession.sparkContext
      sc.hadoopConfiguration.set("hbase.zookeeper.quorum", "Ips")
      sc.hadoopConfiguration.set("hbase.zookeeper.property.clientPort", "2181")
      sc.hadoopConfiguration.set(TableOutputFormat.OUTPUT_TABLE, "TABLE1")
      //为每条数据构造一个put,转换为PairRDD才有saveHadoop这个方法,而且这种格式也是写入要求
      val rdd = df.rdd.map(row => {
        val rowKeyBytes = Bytes.toBytes(row.getString(0))
        //rowKey
        val put = new Put(rowKeyBytes)
        put.addColumn(family, column1, Bytes.toBytes(row.getString(1)))
        new ImmutableBytesWritable(rowKeyBytes) -> put
      })
      val job = Job.getInstance(sc.hadoopConfiguration)
      job.setOutputKeyClass(classOf[ImmutableBytesWritable])
      job.setOutputValueClass(classOf[Result])
      job.setOutputFormatClass(classOf[TableOutputFormat[ImmutableBytesWritable]])
      rdd.saveAsNewAPIHadoopDataset(job.getConfiguration)

 

分析下算子的内部实现:

 

   

看方法的注释,setupJob()是job初始化的一些操作,commitJob()是任务成功运行完毕之后的一些操作,核心的逻辑在runJob()这个方法里面。

runJob方法第二个形参需要传入一个方法,这个形参的含义是:a function to run on each partition of the RDD,意思是对每个Partition中的数据都会调用这个方法进行处理。所以writeShard()方法就是算子的核心。

 

来分析下writeShard()方法:

 

    这个format就是上述代码job中设置的TableOutputFormat,writeShard()方法内部会从TableOutputFormat对象中获取一个RecordWriter对象,然后调用RecordWriter对象中的write()方法逐条处理Partition中的数据。

    RecordWriter是一个基类,对应的实现类为TableRecordWriter,看下它的write()方法:

 

    发现这个方法只支持Put和Delete,以后使用这个API的时候要注意点这里的逻辑了。核心是Matator.mutate(value)方法。它的具体实现如下:

    每插入一条数据都要计算下集合的大小:

 

    默认情况下会将待写入的数据缓存到一个writeAsyncBuffer这个集合中,当集合的大小大于writeBufferSize时会将集合中的数据异步Flush到HBase中。

 

    writeBufferSize通过“hbase.client.write.buffer”参数来进行配置,默认情况下大小为:2097152(2M),即默认情况下每写入2M大小的数据会后台异步Flush到HBase中,所以这个算子的速度会比这个在程序中显示调用Put批量写入要快,因为显示是同步写入。

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值