DataX/hbase20xsqlwriter/doc/hbase20xsqlwriter.md
2019-03-11 11:19:41 +08:00

4.7 KiB
Raw Blame History

HBase20xsqlwriter插件文档

1. 快速介绍

HBase20xsqlwriter实现了向hbase中的SQL表(phoenix)批量导入数据的功能。Phoenix因为对rowkey做了数据编码所以直接使用HBaseAPI进行写入会面临手工数据转换的问题麻烦且易错。本插件提供了SQL方式直接向Phoenix表写入数据。

在底层实现上通过Phoenix QueryServer的轻客户端驱动执行UPSERT语句向Phoenix写入数据。

1.1 支持的功能

  • 支持带索引的表的数据导入,可以同步更新所有的索引表

1.2 限制

  • 要求版本为Phoenix5.x及HBase2.x
  • 仅支持通过Phoenix QeuryServer导入数据因此您Phoenix必须启动QueryServer服务才能使用本插件
  • 不支持清空已有表数据
  • 仅支持通过phoenix创建的表不支持原生HBase表
  • 不支持带时间戳的数据导入

2. 实现原理

通过Phoenix轻客户端连接Phoenix QueryServer服务执行UPSERT语句向表中批量写入数据。因为使用上层接口所以可以同步更新索引表。

3. 配置说明

3.1 配置样例

{
  "job": {
    "entry": {
      "jvm": "-Xms2048m -Xmx2048m"
    },
    "content": [
      {
        "reader": {
          "name": "txtfilereader",
          "parameter": {
            "path": "/Users/shf/workplace/datax_test/hbase20xsqlwriter/txt/normal.txt",
            "charset": "UTF-8",
            "column": [
              {
                "index": 0,
                "type": "String"
              },
              {
                "index": 1,
                "type": "string"
              },
              {
                "index": 2,
                "type": "string"
              },
              {
                "index": 3,
                "type": "string"
              }
            ],
            "fieldDelimiter": ","
          }
        },
        "writer": {
          "name": "hbase20xsqlwriter",
          "parameter": {
            "batchSize": "100",
            "column": [
              "UID",
              "TS",
              "EVENTID",
              "CONTENT"
            ],
            "queryServerAddress": "http://127.0.0.1:8765",
            "nullMode": "skip",
            "table": "目标hbase表名大小写有关"
          }
        }
      }
    ],
    "setting": {
      "speed": {
        "channel": 5
      }
    }
  }
}

3.2 参数说明

  • name

    • 描述:插件名字,必须是hbase11xsqlwriter
    • 必选:是
    • 默认值:无
  • table

    • 描述要导入的表名大小写敏感通常phoenix表都是大写表名
    • 必选:是
    • 默认值:无
  • column

    • 描述列名大小写敏感通常phoenix的列名都是大写
      • 需要注意列的顺序必须与reader输出的列的顺序一一对应。
      • 不需要填写数据类型会自动从phoenix获取列的元数据
    • 必选:是
    • 默认值:无
  • queryServerAddress

    • 描述Phoenix QueryServer地址为必填项格式http://${hostName}:${ip}如http://172.16.34.58:8765
    • 必选:是
    • 默认值:无
  • serialization

    • 描述QueryServer使用的序列化协议
    • 必选:否
    • 默认值PROTOBUF
  • batchSize

    • 描述:批量写入的最大行数
    • 必选:否
    • 默认值256
  • nullMode

    • 描述读取到的列值为null时如何处理。目前有两种方式
      • skip跳过这一列即不插入这一列(如果该行的这一列之前已经存在,则会被删除)
      • empty插入空值值类型的空值是0varchar的空值是空字符串
    • 必选:否
    • 默认值skip

4. 性能报告

5. 约束限制

writer中的列的定义顺序必须与reader的列顺序匹配。reader中的列顺序定义了输出的每一行中列的组织顺序。而writer的列顺序定义的是在收到的数据中writer期待的列的顺序。例如

reader的列顺序是 c1, c2, c3, c4

writer的列顺序是 x1, x2, x3, x4

则reader输出的列c1就会赋值给writer的列x1。如果writer的列顺序是x1, x2, x4, x3则c3会赋值给x4c4会赋值给x3.

6. FAQ

  1. 并发开多少合适?速度慢时增加并发有用吗? 数据导入进程默认JVM的堆大小是2GB并发(channel数)是通过多线程实现的开过多的线程有时并不能提高导入速度反而可能因为过于频繁的GC导致性能下降。一般建议并发数(channel)为5-10.

  2. batchSize设置多少比较合适 默认是256但应根据每行的大小来计算最合适的batchSize。通常一次操作的数据量在2MB-4MB左右用这个值除以行大小即可得到batchSize。