HBase的详细使用

HBase

1、安装

  • 第一步:将文件 hbase-1.3.1-bin.tar.gz 上传到服务器,并解压

  • 第二步:修改 hbase 目录下的 conf 目录下的 hbase-env.sh 文件

    export JAVA_HOME=/opt/software/jdk/jdk1.8.0_281
    export HBASE_MANAGES_ZK=false
    
  • 第三步:修改 hbase 目录下的 conf 目录下的 hbase-site.xml 文件

        <property>
            <name>hbase.rootdir</name>
            <value>hdfs://hadoop151:8020/HBase</value>
        </property>
        <property>
            <name>hbase.cluster.distributed</name>
            <value>true</value>
        </property>
        <!-- 0.98 后的新变动,之前版本没有.port,默认端口为 60000 -->
        <property>
            <name>hbase.master.port</name>
            <value>16000</value>
        </property>
        <property> 
            <name>hbase.zookeeper.quorum</name>
            <value>hadoop151,hadoop152,hadoop153</value>
        </property>
        <property> 
            <name>hbase.zookeeper.property.dataDir</name>
            <value>/opt/software/zookeeper/zookeeper-3.4.10/zkData</value>
        </property>
    
  • 第四步:修改 hbase 目录下的 conf 目录下的 regionservers 文件

    hadoop151
    hadoop152
    hadoop153
    
  • 第五步:将Hadoopetc/hadoop 目录下的 core-site.xml、hdfs-site.xml 文件软连接到 HBaseconf 目录中上

    ln -s /opt/software/hadoop/hadoop-3.1.4/etc/hadoop/core-site.xml \
    /opt/software/hbase/hbase-1.3.1/conf/core-site.xml
    
    ln -s /opt/software/hadoop/hadoop-3.1.4/etc/hadoop/hdfs-site.xml \
    /opt/software/hbase/hbase-1.3.1/conf/hdfs-site.xml
    
  • 第六步:将整个 hbase 文件分发到其他服务器上

  • 第七步:启动 Zookeeper 集群Hadoop

  • 第八步:启动 Hbase

    #方式一
    bin/start-hbase.sh
    
    #方式二
    bin/hbase-daemon.sh start master
    bin/hbase-daemon.sh start regionserver
    
  • 第九步:访问

    • http://hadoop151:16010




2、shell命令

基本操作

  • 进入 HBase 客户端命令行

    bin/hbase shell
    
  • 查看帮助命令(客户端命令行中执行)

    help
    
  • 查看当前数据库中有哪些表(客户端命令行中执行)

    list
    



表的操作

  • 创建表

    create '表名','列族名称'
    
    #示例,单个列族
    create 'fzk','info'
    #示例,多个列族
    create 'fzk','info1','info2'
    
  • 查看表结构

    describe '表名'
    
    #示例
    describe 'fzk'
    
  • 变更表信息

    alter '表名',{NAME=>'列族',VERSIONS=>版本数量}
    
    #示例:将 info 列族中的数据存放 3 个版本
    alter 'student',{NAME=>'info',VERSIONS=>3}
    
  • 删除表

    • 首先需要先让该表为 disable 状态,然后删除表

      disable '表名'
      drop '表名'
      
      # 示例
      disable 'fzk'
      drop 'fzk'
      



数据的操作

  • 插入和修改 数据到表

    put '表名','Row_Key值','列族:列字段名','值'
    
    #示例
    put 'fzk','1001','info:name','fff'
    
  • 删除数据

    delete '表名','Row_Key值','列族:列字段名'
    
    #示例
    delete 'fzk','1001','info:name'
    
  • 查看“指定行”或“指定列族:列”的数据

    #查看“指定行”
    get 'fzk','1001'
    #查看“指定行”的“指定列族:列”
    get 'fzk','1001','info:name'
    
  • 扫描查看表数据

    #查看全表
    scan 'fzk'
    #查看 Row_Key值从1001 到 1003,左闭右开
    scan 'fzk',{STARTROW=>'1001', STOPROW=>'1003'}
    




3、API

准备环境

  • 创建Maven工程,导入依赖(pom.xml)

    <dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>
    



表操作API(DDL)

判断表是否存在

public boolean isTableExists(String tableName) throws IOException {
    //获取配置文件信息
    Configuration configuration = HBaseConfiguration.create();
    configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");

    //创建HBase对象(Admin)
    //使用 ConnectionFactory 类创建 Connection 对象
    Connection connection = ConnectionFactory.createConnection(configuration);
    //通过 Connection 对象创建 Admin 对象
    Admin admin = connection.getAdmin();

    //判断表是否存在
    boolean tableExists = admin.tableExists(TableName.valueOf(tableName));

    //关闭连接
    if(admin != null){
        admin.close();
    }
    if(connection != null){
        connection.close();
    }

    //返回结果
    return tableExists;
}



创建表

public void createTable(String tableName, String... columns) throws IOException {
    //获取配置文件信息
    Configuration configuration = HBaseConfiguration.create();
    configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");

    //创建HBase对象(Admin)
    //使用 ConnectionFactory 类创建 Connection 对象
    Connection connection = ConnectionFactory.createConnection(configuration);
    //通过 Connection 对象创建 Admin 对象
    Admin admin = connection.getAdmin();

    //创建表
    //校验列族
    if(columns.length <= 0){
        System.out.println("列族不能为空");
        return ;
    }
    //校验表名是否存在
    if(admin.tableExists(TableName.valueOf(tableName))){
        System.out.println("表名存在");
        return ;
    }
    //创建表描述器
    HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
    //循环添加列族信息
    for (String column : columns) {
        //创建列族描述器
        HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(column);
        //添加列族信息
        hTableDescriptor.addFamily(hColumnDescriptor);
    }
    //创建表
    admin.createTable(hTableDescriptor);


    //关闭连接
    if(admin != null){
        admin.close();
    }
    if(connection != null){
        connection.close();
    }
}



删除表

public void dropTable(String tableName) throws IOException {
    //获取配置文件信息
    Configuration configuration = HBaseConfiguration.create();
    configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");

    //创建HBase对象(Admin)
    //使用 ConnectionFactory 类创建 Connection 对象
    Connection connection = ConnectionFactory.createConnection(configuration);
    //通过 Connection 对象创建 Admin 对象
    Admin admin = connection.getAdmin();

    //删除表
    //校验表名是否存在
    if(!admin.tableExists(TableName.valueOf(tableName))){
        System.out.println(tableName + " -- 表名不存在");
        return ;
    }
    //使表不可用
    admin.disableTable(TableName.valueOf(tableName));
    //删除表
    admin.deleteTable(TableName.valueOf(tableName));

    //关闭连接
    if(admin != null){
        admin.close();
    }
    if(connection != null){
        connection.close();
    }
}



创建命名空间

public void createNameSpace(String nameSpace) {
    //获取配置文件信息
    Configuration configuration = HBaseConfiguration.create();
    configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");

    //创建HBase对象(Admin)
    //使用 ConnectionFactory 类创建 Connection 对象
    Connection connection = null;
    try {
        connection = ConnectionFactory.createConnection(configuration);
    } catch (IOException e) {
        e.printStackTrace();
    }
    //通过 Connection 对象创建 Admin 对象
    Admin admin = null;
    try {
        admin = connection.getAdmin();
    } catch (IOException e) {
        e.printStackTrace();
    }

    //创建命名空间
    //创建命名空间描述器
    NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(nameSpace).build();
    //创建命名空间
    try {
        admin.createNamespace(namespaceDescriptor);
    } catch (NamespaceExistException e) {
        System.out.println(namespaceDescriptor + " -- 命名空间已存在");
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    //关闭连接
    if(admin != null){
        admin.close();
    }
    if(connection != null){
        connection.close();
    }
}



数据操作API(DML)

插入数据

public void putData(String tableName, String rowKey, String cf, String cn, String value) throws IOException {
    //获取配置文件信息
    Configuration configuration = HBaseConfiguration.create();
    configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");

    //创建Table对象
    //使用 ConnectionFactory 类创建 Connection 对象
    Connection connection = ConnectionFactory.createConnection(configuration);
    Table table = connection.getTable(TableName.valueOf(tableName));

    //插入数据
    //创建Put对象
    Put put = new Put(Bytes.toBytes(rowKey));
    //给put对象赋值
    put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));
    //插入数据
    table.put(put);

    //关闭连接
    if (table != null) {
        table.close();
    }
    if (connection != null) {
        connection.close();
    }
}



获取数据(get)

public void getData(String tableName, String rowKey, String cf, String cn) throws IOException {
    //获取配置文件信息
    Configuration configuration = HBaseConfiguration.create();
    configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");

    //创建Table对象
    //使用 ConnectionFactory 类创建 Connection 对象
    Connection connection = ConnectionFactory.createConnection(configuration);
    Table table = connection.getTable(TableName.valueOf(tableName));

    //获取数据
    //创建Get对象
    Get get = new Get(Bytes.toBytes(rowKey));
    //给Get对象赋值
    if (cf != null && !"".equals(cf)) {
        if (cn != null && !"".equals(cn)) {
            get.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));
        } else {
            get.addFamily(Bytes.toBytes(cf));
        }
    }
    //获取数据
    Result result = table.get(get);
    //解析Result,并打印数据
    for (Cell cell : result.rawCells()) {
        byte[] columeFamily = CellUtil.cloneFamily(cell);
        byte[] columnName = CellUtil.cloneQualifier(cell);
        byte[] value = CellUtil.cloneValue(cell);
        System.out.println("CF:" + Bytes.toString(columeFamily) + " -- " +
                           "CN:" + Bytes.toString(columnName) + " -- " +
                           "Value:" + Bytes.toString(value));
    }

    //关闭连接
    if (table != null) {
        table.close();
    }
    if (connection != null) {
        connection.close();
    }
}



获取数据(scan)

public void scanData(String tableName, String startRow, String stopRow) throws IOException {
    //获取配置文件信息
    Configuration configuration = HBaseConfiguration.create();
    configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");

    //创建Table对象
    //使用 ConnectionFactory 类创建 Connection 对象
    Connection connection = ConnectionFactory.createConnection(configuration);
    Table table = connection.getTable(TableName.valueOf(tableName));

    //获取数据
    //创建Scan对象
    Scan scan = null;
    if (stopRow != null && !"".equals(stopRow)) {
        scan = new Scan(Bytes.toBytes(startRow), Bytes.toBytes(stopRow));
    } else {
        scan = new Scan(Bytes.toBytes(startRow));
    }
    //获取数据
    ResultScanner resultScanner = table.getScanner(scan);
    //解析ResultScanner
    for (Result result : resultScanner) {
        //解析Result
        Cell[] cells = result.rawCells();
        //打印数据
        for (Cell cell : cells) {
            byte[] row = CellUtil.cloneRow(cell);
            byte[] columeFamily = CellUtil.cloneFamily(cell);
            byte[] columnName = CellUtil.cloneQualifier(cell);
            byte[] value = CellUtil.cloneValue(cell);
            System.out.println("Row:" + Bytes.toString(row) + " -- " +
                               "CF:" + Bytes.toString(columeFamily) + " -- " +
                               "CN:" + Bytes.toString(columnName) + " -- " +
                               "Value:" + Bytes.toString(value));
        }
    }

    //关闭连接
    if (table != null) {
        table.close();
    }
    if (connection != null) {
        connection.close();
    }
}



删除数据

public void deleteData(String tableName, String rowKey, String cf, String cn) throws IOException {
    //获取配置文件信息
    Configuration configuration = HBaseConfiguration.create();
    configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");

    //创建Table对象
    //使用 ConnectionFactory 类创建 Connection 对象
    Connection connection = ConnectionFactory.createConnection(configuration);
    Table table = connection.getTable(TableName.valueOf(tableName));

    //获取数据
    //创建Delete对象
    Delete delete = new Delete(Bytes.toBytes(rowKey));
    if (cf != null && !"".equals(cf)) {
        if (cn != null && !"".equals(cn)) {
            delete.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));
        } else {
            delete.addFamily(Bytes.toBytes(cf));
        }
    }
    //删除数据
    table.delete(delete);

    //关闭连接
    if (table != null) {
        table.close();
    }
    if (connection != null) {
        connection.close();
    }
}



MapReduce

环境准备

  • 第一步:将HBase的lib中的文件添加到Hadoop中

    • 在hadoop目录下的 etc/hadoop/ 目录下的 hadoop-env.sh 文件添加配置
    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/$HBASE_HOME/lib/*
    
  • 第二步:将 hadoop-env.sh 文件分发到其他服务器上



官方案例

  • 案例一:统计 fzk 表中有多少行数据

    /hadoop目录/bin/yarn jar \
    /hbase目录/lib/hbase-server-1.3.1.jar rowcounter fzk
    
    #事例
    /opt/software/hadoop/hadoop-3.1.4/bin/yarn jar \ 
    /opt/software/hbase/hbase-1.3.1/lib/hbase-server-1.3.1.jar rowcounter fzk
    
  • 案例二:使用 MapReduce 将本地数据导入到 HBase

    • 第一步:在本地创建一个 tsv 格式的文件:my.tsv

      1001	fff	111
      1002	zzz	222
      1003	kkk	333
      
    • 第二步:在hdfs上创建 user 目录,并将 my.tsv 文件上传到 user 目录中

      hadoop fs -mkdir /user
      hadoop fs -put my.tsv /user
      
    • 第三步:创建 Hbase 表

      create 'user', 'info'
      
    • 第四步:执行 MapReduce 到 HBase 的 user 表中

      /hadoop目录/bin/yarn jar \
      /hbase目录/lib/hbase-server-1.3.1.jar importtsv \ 
      -Dimporttsv.columns=HBASE_ROW_KEY,列族:字段,列族:字段 表名 \
      文件的hdfs地址
      
      /opt/software/hadoop/hadoop-3.1.4/bin/yarn jar \
      /opt/software/hbase/hbase-1.3.1/lib/hbase-server-1.3.1.jar importtsv \ 
      -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:password user \
      hdfs://hadoop151:8020/user
      



自定义Hbase-MapReduce

将 HDFS 中的数据写入到 Hbase 表中(打成jar包上传到服务器运行)
  • 第一步:导入依赖(pom.xml)

    <dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>
    
  • 第二步:编写Mapper类

    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    import java.io.IOException;
    
    public class MRMapper extends Mapper<LongWritable, Text, LongWritable, Text> {
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            //写出到reduce中
            context.write(key, value);
        }
    }
    
  • 第三步:编写Reducer类

    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.mapreduce.TableReducer;
    import org.apache.hadoop.hbase.util.Bytes;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import java.io.IOException;
    
    public class MRReducer extends TableReducer<LongWritable, Text, NullWritable> {
        @Override
        protected void reduce(LongWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
    
            for (Text value : values) {
                //切割数据
                String[] datas = value.toString().split("\t");
                
                //创建Put对象
                Put put = new Put(Bytes.toBytes(datas[0]));
                //给put对象赋值,三个参数分别是:列族、字段名、数据
                put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes(datas[1]));
                put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("password"), Bytes.toBytes(datas[2]));
                
                //写出到hbase的表中
                context.write(NullWritable.get(), put);
            }
        }
    }
    
  • 第四步:编写Driver类

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.util.Tool;
    import java.io.IOException;
    
    public class MRDriver {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
            //1、获取配置信息以及 job 对象
            Configuration configuration = new Configuration();
            Job job = Job.getInstance(configuration);
    
            //2、关联 Driver 的 jar
            job.setJarByClass(MRDriver.class);
    
            //3、设置 Mapper 和 Reducer
            job.setMapperClass(MRMapper.class);
            TableMapReduceUtil.initTableReducerJob(args[1],  //表名
                    MRReducer.class,   //reducer类
                    job);  //job对象
    
            //4、设置 Mapper 输出的 key-value
            job.setMapOutputKeyClass(LongWritable.class);
            job.setMapOutputValueClass(Text.class);
    
            //5、设置 Reducer 输出的 key-value
            job.setOutputKeyClass(NullWritable.class);
            job.setOutputValueClass(Put.class);
    
            //6、设置 输入和输出 路径
            FileInputFormat.setInputPaths(job, new Path(args[0]));
    
            //7、提交 job
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }
    
  • 第五步:将程序打包并上传到服务器(HBase目录的lib目录中)

  • 第六步:运行

    hadoop命令目录 jar jar包目录和名称 类的全限定名称 \
    /hdfs上的数据目录 hbase的表名
    
    # 事例
    /opt/software/hadoop/hadoop-3.1.4/bin/hadoop jar /opt/software/hbase/hbase-1.3.1/lib/mr.jar \
    com.itfzk.hbase.mr.MRDriver /users user
    



将一张表中的部分数据通过 MR 迁入到另一张表中(在本地运行)

需求:将 user 表中字段为‘name’的数据,通过 MR 迁入到 users 表中

  • 第一步:导入依赖(pom.xml)

    <dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>
    
  • 第二步:将服务器上的HBase目录的conf目录的 hbase-site.xml 文件拷贝到项目的 resources 目录下

  • 第三步:Mapper类

    import org.apache.hadoop.hbase.Cell;
    import org.apache.hadoop.hbase.CellUtil;
    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.client.Result;
    import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
    import org.apache.hadoop.hbase.mapreduce.TableMapper;
    import org.apache.hadoop.hbase.util.Bytes;
    import java.io.IOException;
    
    public class MRMapper extends TableMapper<ImmutableBytesWritable, Put> {
        @Override
        protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {
            //创建Put对象
            Put put = new Put(key.get());
    
            //遍历rowKey数据并将 类字段为‘name’ 的数据赋值给put对象
            for (Cell cell : value.rawCells()) {
                if ("name".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))){
                    //将数据赋值给put对象
                    put.add(cell);
                    break;
                }
            }
    
            //写出到reduce中
            context.write(key, put);
        }
    }
    
  • 第四步:Reducer类

    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
    import org.apache.hadoop.hbase.mapreduce.TableReducer;
    import org.apache.hadoop.io.NullWritable;
    import java.io.IOException;
    
    public class MRReducer extends TableReducer<ImmutableBytesWritable, Put, NullWritable> {
        @Override
        protected void reduce(ImmutableBytesWritable key, Iterable<Put> values, Context context) throws IOException, InterruptedException {
            //将数据写出到hbase的表中
            for (Put put : values) {
                context.write(NullWritable.get(), put);
            }
        }
    }
    
  • 第五步:Driver类

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.client.Scan;
    import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
    import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.mapreduce.Job;
    import java.io.IOException;
    
    public class MRDriver2 {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
            //1、获取配置信息以及 job 对象
            Configuration configuration = HBaseConfiguration.create();
            Job job = Job.getInstance(configuration);
    
            //2、关联 Driver 的 jar
            job.setJarByClass(MRDriver2.class);
    
            //3、设置 Mapper 和 输出的 key-value 类型
            TableMapReduceUtil.initTableMapperJob("user",  //表名
                    new Scan(),  //Scan查询对象
                    MRMapper.class,  //mapper对象
                    ImmutableBytesWritable.class,  //mapper的key的输出类型
                    Put.class,  //mapper的value的输出类型
                    job);  //job
    
            //4、设置Reducer
            TableMapReduceUtil.initTableReducerJob("users",  //表名
                    MRReducer.class,   //reducer类
                    job);  //job对象
    
    
            //5、设置 Reducer 输出的 key-value 类型
            job.setOutputKeyClass(NullWritable.class);
            job.setOutputValueClass(Put.class);
    
    
            //6、提交 job
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }
    




4、优化

高可用

  • 在hbase目录下创建并编辑 conf/backup-masters 文件

    # 另外两台服务器的 host 名称(作用:启动hbase时,这两台也启动master成Backup Master,当master挂掉后,Backup Master会又一个成为master)
    hadoop152
    hadoop153
    



预分区(四种方式)

每一个 region 维护着 StartRow 与 EndRow,如果加入的数据符合某个 Region 维护的 RowKey 范围,则该数据交给这个 Region 维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高 HBase 性能。

  • 第一种:手动设定预分区

    # 五个分区:(负无穷,1000),(1000,2000),(2000,3000),(3000,4000),(4000,正无穷)
    create 'table1001','info',SPLITS=>['1000','2000','3000','4000']
    
  • 第二种:生成 16 进制序列预分区(不推荐)

    #生成15个分区,按 16 进行分区
    create 'table1002','info',{NUMREGIONS => 15, SPLITALGO =>'HexStringSplit'}
    
  • 第三种:按照文件中设置的规则预分区

    #按 splits.txt 文件进行分区
    create 'table1003',SPLITS_FILE =>'splits.txt'
    
  • 第四种:使用 JavaAPI 创建预分区

    public void createTable(String tableName, String... columns) throws IOException {
        //获取配置文件信息
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");
    
        //创建HBase对象(Admin)
        //使用 ConnectionFactory 类创建 Connection 对象
        Connection connection = ConnectionFactory.createConnection(configuration);
        //通过 Connection 对象创建 Admin 对象
        Admin admin = connection.getAdmin();
    
        //创建表描述器
        HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
        //循环添加列族信息
        for (String column : columns) {
            //创建列族描述器
            HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(column);
            //添加列族信息
            hTableDescriptor.addFamily(hColumnDescriptor);
        }
    
        / JavaAPI 创建预分区
        //自定义算法,产生一系列 hash 散列值存储在二维数组中
        byte[][] splitKeys = 某个散列值函数;
        //创建表(通过 HTableDescriptor 实例和散列值二维数组创建带有预分区的 Hbase 表)
        admin.createTable(hTableDescriptor, splitKeys);
    
        //关闭连接
        if(admin != null){
            admin.close();
        }
        if(connection != null){
            connection.close();
        }
    }
    



基础优化

  • 允许在 HDFS 的文件中追加内容(hdfs-site.xml、hbase-site.xml)

    属性:dfs.support.append
    解释:开启 HDFS 追加同步,可以优秀的配合 HBase 的数据同步和持久化。默认值为 true
    
  • 优化 DataNode 允许的最大文件打开数(hdfs-site.xml )

    属性:dfs.datanode.max.transfer.threads
    解释:HBase 一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作,设置为 4096 或者更高。默认值:4096
    
  • 优化延迟高的数据操作的等待时间(hdfs-site.xml)

    属性:dfs.image.transfer.timeout
    解释:如果对于某一次数据操作来讲,延迟非常高,socket 需要等待更长的时间,建议把该值设置为更大的值(默认 60000 毫秒),以确保 socket 不会被 timeout 掉。
    
  • **优化数据的写入效率 **(mapred-site.xml)

    属性:	
        mapreduce.map.output.compress
        mapreduce.map.output.compress.codec
    解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec 或者其他压缩方式。
    
  • 设置 RPC 监听数量(hbase-site.xml )

    属性:Hbase.regionserver.handler.count
    解释:默认值为 30,用于指定 RPC 监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值。
    
  • 优化 HStore 文件大小(hbase-site.xml )

    属性:hbase.hregion.max.filesize
    解释:默认值 10737418240(10GB),如果需要运行 HBase 的 MR 任务,可以减小此值,因为一个 region 对应一个 map 任务,如果单个 region 过大,会导致 map 任务执行时间过长。该值的意思
    
  • 优化 HBase 客户端缓存(hbase-site.xml )

    属性:hbase.client.write.buffer
    解释:用于指定 Hbase 客户端缓存,增大该值可以减少 RPC 调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少 RPC 次数的目的。
    
  • 指定 scan.next 扫描 HBase 所获取的行数(hbase-site.xml)

    属性:hbase.client.scanner.caching
    解释:用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是连接 HBase 的 Spring Boot 详细步骤示例: 1. 添加 HBase 依赖 在 pom.xml 中添加以下依赖: ``` <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>${hbase-version}</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>${hbase-version}</version> </dependency> ``` 其中 ${hbase-version} 是 HBase 的版本号。 2. 配置 HBase 连接信息 在 application.properties 中添加以下配置信息: ``` hbase.zookeeper.quorum=zk_host1,zk_host2,zk_host3 hbase.zookeeper.property.clientPort=2181 ``` 其中,hbase.zookeeper.quorum 是 ZooKeeper 的地址列表,hbase.zookeeper.property.clientPort 是 ZooKeeper 的端口号。 3. 创建 HBase 连接 使用 HBaseConfiguration.create() 方法创建 HBase 连接: ``` Configuration config = HBaseConfiguration.create(); ``` 4. 创建 HBase 连接池 使用 HConnectionManager.createConnection(config) 方法创建 HBase 连接池: ``` Connection connection = ConnectionFactory.createConnection(config); ``` 5. 获取 HBase使用 connection.getTable(TableName.valueOf("tableName")) 方法获取 HBase 表: ``` Table table = connection.getTable(TableName.valueOf("tableName")); ``` 其中,tableName 是 HBase 表的名称。 6. 操作 HBase 表 可以使用 Table 接口提供的方法操作 HBase 表,例如: ``` Put put = new Put(Bytes.toBytes("rowKey")); put.addColumn(Bytes.toBytes("columnFamily"), Bytes.toBytes("columnName"), Bytes.toBytes("columnValue")); table.put(put); ``` 其中,rowKey、columnFamily、columnName、columnValue 分别是 HBase 表中的行键、列族、列名和列值。 7. 关闭连接 使用 close() 方法关闭连接: ``` table.close(); connection.close(); ``` 以上就是连接 HBase 的 Spring Boot 详细步骤示例,希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值