Flink读Hbase

package tmp

import java.util
import org.apache.flink.api.scala._
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.functions.source.{RichSourceFunction, SourceFunction}
import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}
import org.apache.hadoop.conf
import org.apache.hadoop.hbase.client._
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.{Cell, HBaseConfiguration, HConstants, TableName}
import scala.collection.JavaConverters._


object Lucas {
  def main(args: Array[String]): Unit = {

    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    val data: DataStream[(String, String)] = env.addSource(new RichSourceFunction[(String, String)] {
      var scan: Scan = _
      var con: Connection = _
      var table: Table = _

      override def open(parameters: Configuration): Unit = {
        val config: conf.Configuration = HBaseConfiguration.create()
        config.set(HConstants.ZOOKEEPER_QUORUM, "linux121,linux123")
        config.set(HConstants.ZOOKEEPER_CLIENT_PORT, "2181")
        con = ConnectionFactory.createConnection(config)
        scan = new Scan()
        table = con.getTable(TableName.valueOf("dim_lagou_area"))
      }

      override def run(ctx: SourceFunction.SourceContext[(String, String)]): Unit = {

        val rs: ResultScanner = table.getScanner(scan)
        val iterator: util.Iterator[Result] = rs.iterator()
        while (iterator.hasNext) {
          val result: Result = iterator.next()
          val row: Array[Byte] = result.getRow
          val rowStr: String = Bytes.toString(row)
          val sb = new StringBuffer()

          val cells: util.List[Cell] = result.listCells()
          for(cell:Cell <- cells.asScala){
            val array: Array[Byte] = cell.getValueArray
            val offset: Int = cell.getValueOffset
            val length: Int = cell.getValueLength
            val str: String = Bytes.toString(array, offset, length)
            sb.append(str).append(",")
          }
          val valueString: String = sb.replace(sb.length() - 1, sb.length(), "").toString
          ctx.collect((rowStr, valueString))
        }

      }

      override def cancel(): Unit = {
        con.close()
      }
    })
    
    data.print()
    env.execute()

  }


}

Apache FlinkHBase 的集成主要通过其提供的连接器(connector)实现,这些连接器封装了与 HBase 交互的核心逻辑,并支持不同版本和使用场景的需求。Flink 提供了多个模块来满足不同的使用方式,包括基础连接、特定版本适配以及对 SQL 操作的支持。 在 FlinkHBase 集成的项目中,`flink-connector-hbase-base` 是一个基础模块,包含了与 HBase 进行连接和操作的核心功能。此模块定义了通用接口和抽象类,为其他具体实现提供了基础[^1]。对于需要兼容 HBase 2.x 版本的应用程序,则可以使用 `flink-connector-hbase-2.x` 模块,它针对 HBase 2.x 系列进行了优化和适配,确保能够充分利用新版 HBase 提供的功能特性[^1]。 此外,如果希望通过 Flink SQL 来操作 HBase 数据库,那么 `flink-sql-connector-hbase-2.x` 模块就显得尤为重要。该模块不仅简化了从 HBase读取数据的过程,还允许用户将处理后的结果写回到 HBase,极大地提升了开发效率和灵活性。 为了帮助开发者更好地理解和应用这些组件,官方文档通常会包含详细的说明和技术指南。例如,在项目的 `docs` 目录下可以找到相关的用户手册和开发指南,它们详细描述了如何配置环境、设置参数以及编写代码来实现 FlinkHBase 的集成。 当涉及到实际部署时,Maven 用户可以通过编辑 `pom.xml` 文件添加必要的依赖项来引入上述提到的各种模块。这样做的好处是可以自动下载并管理所有必需的库文件,使得构建过程更加简单快捷。 下面是一个简单的示例,展示如何使用 Flink SQL 创建一个表,并将其映射到 HBase 表: ```sql CREATE TABLE hbase_table ( rowkey STRING PRIMARY KEY, family1 ROW<col1 STRING> ) WITH ( 'connector' = 'hbase-2.x', 'table-name' = 'my_hbase_table', 'zookeeper-quorum' = 'localhost:2181' ); ``` 在这个例子中,首先定义了一个具有主键 `rowkey` 和一列族 `family1` 的表结构。接着,通过指定 `'connector'='hbase-2.x'` 来表明这个表将被连接至 HBase 2.x 版本;同时还需要提供目标 HBase 表名 (`'table-name'`) 以及 Zookeeper 集群地址 (`'zookeeper-quorum'`) 等信息。 测试也是整个开发流程中的重要环节之一。项目中的 `flink-connector-hbase-e2e-tests` 模块专门用于存放端到端测试相关的代码,这有助于验证整个系统的稳定性和可靠性。 最后值得一提的是,除了直接利用现有的连接器外,还可以根据业务需求定制开发新的连接器或扩展已有功能。比如,借助于 `tool` 目录下的辅助工具或脚本,可能更容易完成一些重复性的任务或者复杂配置的生成。 综上所述,Apache FlinkHBase 的集成方案既灵活又强大,无论是对于实时数据分析还是大规模数据处理场景都非常适用。通过合理选择合适的连接器模块,并结合适当的编程模型和最佳实践,就能够高效地构建出满足特定业务需求的数据处理流水线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值