更新时间:2022-09-30 GMT+08:00

批量导入数据时创建二级索引

操作场景

您可以按照自定义的方式,通过命令批量导入数据到HBase中。

  • 列的名称不能包含特殊字符,只能由字母、数字和下划线组成。
  • 当将列的类型设置为string时,不能设置其长度。例如“<column index="1" type="string" length="1" >COLOUMN_1</column>”,此类型不支持。
  • 当将列的类型设置为date时,不能设置其日期格式。例如“<column index="13" type="date" format="yyyy-MM-dd hh:mm:ss">COLOUMN_13</column>”,此类型不支持。
  • 不能针对组合列建立二级索引。

操作步骤

  1. 将数据导入到HDFS中。

    hdfs dfs -mkdir <inputdir>

    hdfs dfs -put <local_data_file> <inputdir>

    例如定义数据文件“data.txt”,内容如下:

    001,Hadoop,citya
    002,HBaseFS,cityb
    003,HBase,cityc
    004,Hive,cityd
    005,Streaming,citye
    006,Mapreduce,cityf
    007,Kerberos,cityg
    008,LdapServer,cityh

    执行以下命令:

    hdfs dfs -mkdir /datadirIndexImport

    hdfs dfs -put data.txt /datadirIndexImport

  2. 建表IndexImportTable并创建“configuration_index.xml”文件(该文件可以参考模板文件进行编辑,模板文件获取路径为:“${client path}/HBase/hbase/conf/index_import.xml.template”)。

    例如执行以下命令建表:

    create 'IndexImportTable', {NAME => 'f1',COMPRESSION => 'SNAPPY', DATA_BLOCK_ENCODING => 'FAST_DIFF'},{NAME=>'f2'}

    例如自定义导入模板文件configuration_index.xml:

    • column_num要和数据文件中的列的数量对应。
    • family的指定要和表的列族名称对应。
    • 索引类型的首字母需要大写,例如“type”=“String”。
    <?xml version="1.0" encoding="UTF-8"?> 
      
     <configuration> 
             <import id="first" column_num="3"> 
                     <columns> 
                             <column index="1" type="int">SMS_ID</column> 
                             <column index="2" type="string">SMS_NAME</column> 
                             <column index="3" type="string">SMS_ADDRESS</column> 
                     </columns> 
      
                     <rowkey> 
                             SMS_ID+'_'+substring(SMS_NAME,1,4)+'_'+reverse(SMS_ADDRESS) 
                     </rowkey> 
      
                     <qualifiers> 
                             <normal family="f1"> 
                                     <qualifier column="SMS_ID">H_ID</qualifier> 
                                     <qualifier column="SMS_NAME">H_NAME</qualifier> 
                                     <qualifier column="SMS_ADDRESS">H_ADDRESS</qualifier> 
                             </normal> 
      
                             <!-- Define composite columns --> 
                             <composite family="f2"> 
                                     <qualifier class="com.huawei.H_COMBINE_1">H_COMBINE_1</qualifier> 
                                     <columns> 
                                             <column>SMS_ADDRESS</column> 
                                             <column>SMS_NAME</column> 
                                     </columns> 
                             </composite> 
      
                     </qualifiers> 
      
                         <indices> 
                             <index name="IDX1"> 
                                     <index_column family="f1"> 
                                             <qualifier type="String" length="30">H_ID</qualifier> 
                                     </index_column> 
                             </index> 
                     </indices> 
      
                     <badlines>SMS_ID &lt; 7000 &amp;&amp; SMS_NAME == 'HBase'</badlines> 
             </import> 
     </configuration>     

    上述片段信息中“length="30"”指索引列“H_ID”的列值不能超过30个字符。

  3. 执行如下命令,生成HFile文件。

    hbase com.huawei.hadoop.hbase.tools.bulkload.IndexImportData -Dimport.skip.bad.lines=true -Dimport.separator=<separator> -Dimport.bad.lines.output=</path/badlines/output> -Dimport.hfile.output=</path/for/output> <configuration xmlfile> <tablename> <inputdir>

    • -Dimport.skip.bad.lines:指定值为false,表示遇到不适用的行则停止执行。指定值为true,表示遇到不适用的数据行则跳过该行继续执行,如果没有在configuration.xml中定义不适用行,该参数不需要添加。
    • -Dimport.separator:分隔符。例如,-Dimport.separator=','
    • -Dimport.bad.lines.output=</path/badlines/output>:指的是不适用的数据行输出路径,如果没有在configuration.xml中定义不适用行,该参数不需要添加。
    • -Dimport.hfile.output=< /path/for/output>:指的是执行结果输出路径。
    • <configuration xmlfile>:指向configuration配置文件。
    • <tablename>:指的是要操作的表名。
    • <inputdir>:指的是要批量上传的数据目录。

    例如执行以下命令:

    hbase com.huawei.hadoop.hbase.tools.bulkload.IndexImportData -Dimport.skip.bad.lines=true -Dimport.separator=',' -Dimport.bad.lines.output=/badline -Dimport.hfile.output=/hfile configuration_index.xml IndexImportTable /datadirIndexImport

    • 当HBase已经配置透明加密后,在执行bulkload命令生成HFile时,“-Dimport.hfile.output”指定的HFile路径必须为“/HBase根目录/extdata”的子目录,例如“/hbase/extdata/bulkloadTmp/hfile”。
    • 当HBase已经配置透明加密后,执行bulkload命令的HBase用户需要添加到对应集群的hadoop用户组(非FusionInsight Manager下第一个安装的集群,用户组为“c<集群ID>_hadoop”,例如“c2_hadoop”),且具有HBase根目录的加密key的读权限。

  4. 执行如下命令将HFile导入HBase。

    hbase org.apache.hadoop.hbase.hindex.mapreduce.HIndexLoadIncrementalHFiles </path/for/output> <tablename>

    例如执行以下命令:

    hbase org.apache.hadoop.hbase.hindex.mapreduce.HIndexLoadIncrementalHFiles /hfile IndexImportTable