更新时间:2024-11-29 GMT+08:00

使用HBase2ES工具迁移HBase数据

操作场景

该操作指导工程师在Elasticsearch正常运行时,使用TableScanMR并发和HBase直接扫描方式从HBase中获取数据并导入到Elasticsearch集群中。

前提条件

  • 集群正常运行。
  • HBase数据已准备好。
  • 已安装HBase客户端,且客户端节点与Elasticsearch集群互通。
  • 已安装集群客户端,例如安装目录为“/opt/client”。

操作步骤

修改配置文件

  1. 替换xml配置文件。

    切换到HBase客户端安装目录,将HBase客户端中conf目录下的“core-site.xml”“hbase-site.xml”“hdfs-site.xml”“mapred-site.xml”“yarn-site.xml”文件拷贝到“/opt/client/Elasticsearch/tools/elasticsearch-data2es/hbase2es/conf”目录下。

    xml文件是访问HBase/Mapreduce必用的工具配置文件。

  2. 在Manager界面选择“集群 > 待操作集群的名称 > 集群属性”,确认集群的认证模式是否为安全模式。

    • 是,执行3
    • 否,执行8

  3. 创建用户。

    1. 在Manager界面选择系统 > 权限 > 用户 > 添加用户
    2. 填写用户名,例如test。基于用户和角色鉴权模式下,将test加入用户组“elasticsearch”和“supergroup”,选择“主组”为“supergroup”,并绑定角色“Manager_administrator”取得权限。基于Ranger鉴权模式下,在Ranger中为test用户添加Elasticsearch访问权限策略,具体操作参考添加Elasticsearch的Ranger访问权限策略
    3. 单击“确定”

  4. 选择“系统 > 权限 > 用户”,选择新创建用户后的“更多 > 下载认证凭据”,选择集群信息后单击“确定”,下载文件。
  5. 将解压压缩包后得到的“user.keytab”“krb5.conf”文件上传到“/opt/client/Elasticsearch/tools/elasticsearch-data2es/hbase2es/conf”目录下。
  6. root用户登录HBase客户端所在节点。
  7. 执行以下命令修改jaas.conf文件中的“principal”参数。

    cd /opt/client/Elasticsearch/tools/elasticsearch-data2es/hbase2es/conf

    vi jaas.conf

    如下所示,test是用户名,即修改为与espara.properties的principal配置一致。
    Client {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/opt/client/Elasticsearch/tools/elasticsearch-data2es/hbase2es/conf/user.keytab"
    principal="test@<系统域名>"
    useTicketCache=false
    storeKey=true
    debug=true;
    };

    用户可登录Manager,选择“系统 > 权限 > 域和互信”,查看“本端域”参数,即为当前系统域名。

  8. 执行以下命令修改espara.properties参数配置文件:

    vi espara.properties

    参考表1进行配置,配置样例如下:

    #para for both index and search
    esServerHost=ip1:port1,ip2:port2,ip3:port3
    index=es_index
    
    isSecurity=true
    
    addindex=0
    numberofshards=6
    numberofreplicas=2
    needsource=false
    
    #para for hbase
    principal=test
    HBase_table=hbase_table
    familyName=info
    
    splitFamily=@
    splitColum=_
    splitField=& 
    
    #1:string 2:long 3:binary 4:byte 5:double 6:float 7:int
    #exmple 20&1_30&1_40&1@name&1_age&7_addr&1&|
    qualifier=name&1_age&7_address&1&|
    
    outputDir=/tmp/out1
    
    batch_size=20000
    hbasescannum=20000
    #hbase rowkey encode type, 0:none 1:Base64
    encodeType=0
    threadNum=1
    
    #Log for Test, 0:on 1:off
    isTestLogOn=1
    #json file max length for MR, unit:M
    max_content_length=1024
    表1 espara.properties参数配置说明

    参数

    默认值

    说明

    esServerHost

    ip1:port1,ip2:port2,ip3:port3

    数据从HBase导入到Elasticsearch中的实例配置。便于负载均衡,该参数配置了多组IP及端口号,格式为“IP:端口”,多组配置之间以英文逗号分隔。IP为Elasticsearch集群任意节点业务平面IP地址,端口号为该节点对外http(s)端口号。

    IP地址查看方法如下:登录Manager后选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 实例”,可查看到集群运行的实例IP地址。

    端口号查看方法如下:登录Manager后选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 配置 > 全部配置”,在搜索框中输入“SERVER_PORT”,可查看到对应的端口号。端口号范围24100~24149。

    index

    es_index

    Elasticsearch索引名称。允许同时配置多个索引,以英文逗号分隔。客户需要按照自己的要求建立索引,若没有可按照默认索引。可登录集群内任意Elasticsearch节点使用curl命令查看Elasticsearch中所建的索引。查看索引curl命令使用方法,可参考Linux下curl命令的使用章节。

    isSecurity

    true

    Elasticsearch集群是否是安全模式。true表示安全模式,false表示普通模式。

    addindex

    0

    若采用默认mapping,设为大于0的值。实际使用场景中建议设为0,用户使用自己的mapping。

    numberofshards

    6

    addindex大于0时设置,表示主分片数。

    numberofreplicas

    2

    addindex大于0时设置,表示副本分片数。

    needsource

    false

    addindex大于0时设置,是否启用_source。

    principal

    test

    鉴权用户名。创建该用户时为其添加elasticsearch、supergroup用户组。

    HBase_table

    hbase_table

    HBase表名。允许同时配置多个表,以英文逗号分隔。

    familyName

    info

    列族名,允许同时配置多个列族名,以英文逗号分隔。

    splitFamily

    @

    列族分隔符,用户可自定义,默认值@。

    splitColum

    _

    列名分隔符,用户可自定义,默认值_。

    splitField

    &

    字段与字段类型分隔符,用户可自定义,默认值&。

    qualifier

    name&1_age&7_addr&1&|

    列名,允许同时配置多个列族的列名。默认情况下,多个列族以@分隔,多个列名以下划线分隔,字段与字段类型以&分隔。请根据splitFamily、splitColum、splitField实际配置设置。

    列族个数需要和familyName配置的列族个数一致。

    若为string类型,允许配置分隔符。例如addr&1&|,假设HBase的addr列存放的是字符串“city1|city2”,则索引到Elasticsearch数据中是以“|”符号分隔的[“city1”,“city2”]数组。

    支持string、long、binary、byte、double、float和int数据类型。在本版本中,用数字定义数据类型,1表示string,2表示long,3表示binary,4表示byte,5表示double,6表示float,7表示int类型。

    格式为:字段名称&字段类型[&分隔符]。示例20&1_30&1_40&1@name&1_age&7_addr&1&|表示qualifier包含20&1_30&1_40和name&1_age&7_addr&1&|两个列族的列名配置,分别与familyName定义的info和info1两个列族对应;info列族包含20、30、40三个列,info1包含name、age、addr三个列。20、30、40以及name、addr是string类型,age是int类型。

    说明:

    splitFamily、splitColum、splitField三者之间定义的分隔符不可重复,且不能与HBase表中的列族、列名、字段中设置的分隔符重复。

    outputDir

    /tmp/out1

    HDFS路径。TableScanMR方式,通过http方式写数据失败时,数据内容写入HDFS。若有多个table,必须配置多个路径,以英文逗号分隔,否则数据会被覆盖。

    batch_size

    20000

    Elasticsearch批量写任务个数。

    hbasescannum

    20000

    HBase scan缓存条数。如果设置为0,将使用默认值100000,请确保该项的值不大于HBase的配置项hbase.client.scanner.caching.max,该配置默认值为2147483647。

    encodeType

    0

    HBase rowkey编码方式。0表示none,无编码;1表示Base64编码。

    threadNum

    1

    线程池大小,线程池大小设置太大,同时写Elasticsearch的并发量过多会导致http请求read time out。使用TableScanMR方式时,建议设为1,顺序执行。

    isTestLogOn

    1

    是否开启scan调试日志,hbasescan扫描时可以选择打印或不打印错误日志。0表示打印日志,1表示不打印日志。

    max_content_length

    1024

    TableScanMR方式生成文件大小配置,单位:MB。

    • 当配置多表时,上述配置的列族、列名字段需确保多个表均存在。即多个表使用相同的familyName、qualifier。
    • 当使用HBase直接扫描,index/HBase_table配置项多表时顺序、个数需一一对应。
    • 当使用TableScanMR方式时,index/HBase_table/outputDir配置项多表时顺序、个数需一一对应。

扫描HBase数据导入到Elasticsearch中

  1. 工具包目录下扫描并导入数据。

    • 方式一:TableScanMR并发:

      cd /opt/client/Elasticsearch/tools/elasticsearch-data2es/hbase2es

      java -cp ./conf/:./../lib/* com.*.fusioninsight.es.tool.hbase2es.MRTool

    • 方式二:HBase直接扫描:

      cd /opt/client/Elasticsearch/tools/elasticsearch-data2es/hbase2es

      java -cp ./conf/:./../lib/* com.*.fusioninsight.es.tool.hbase2es.HBaseTool

  2. 通过curl命令查看索引确认数据是否导入,例如:

    • 安全模式:

      curl -XGET --tlsv1.2 --negotiate -k -u : "https://IP:port/my_store1/_search"

    • 普通模式:

      curl -XGET "http://IP:port/my_store1/_search"

    curl命令的使用请参考Linux下curl命令的使用

  3. 数据导入完成后,若个别索引导入失败,会在数据导入工具包sbin目录中新生成“json”目录,执行sbin目录下的input.sh脚本单独导入失败的数据。

    cd /opt/client/Elasticsearch/tools/elasticsearch-data2es/hbase2es

    ./sbin/input.sh

    集群客户端的“Elasticsearch/tools/elasticsearch-data2es/hbase2es/logs”目录内的日志文件,可以查看导入过程的日志信息。