Hadoop-Hbase

news2024/11/24 9:25:20

1. Hbase安装

1.1  安装zookeeper、 hbase

解压至/opt/soft,并分别改名

配置环境变量并source生效

#ZK

export ZOOKEEPER_HOME=/opt/soft/zk345

export PATH=$ZOOKEEPER_HOME/bin:$PATH

#HBASE_HOME

export HBASE_HOME=/opt/soft/hbase235

export PATH=$HBASE_HOME/bin:$PATH

hbase235/conf目录下的

编辑hbase-env.sh:[root@kb129 conf]# vim ./hbase-env.sh

export JAVA_HOME=/opt/soft/jdk180

编辑hbase-site.xml

[root@kb129 conf]# vim ./hbase-site.xml

<property>

    <name>hbase.rootdir</name>

    <value>hdfs://192.168.142.129:9000/hbase</value>

  </property>

  <property>

    <name>hbase.cluster.distributed</name>

    <value>true</value>

  </property>

  <property>

    <name>hbase.zookeeper.property.dataDir</name>

    <value>/opt/soft/zk345/zkdata</value>

  </property>

  <property>

    <name>hbase.zookeeper.property.clientPort</name>

    <value>2181</value>

  </property>

拷贝配置文件准备配置zookeeper

[root@kb129 conf]# pwd

/opt/soft/zk345/conf

[root@kb129 conf]# cp zoo_sample.cfg zoo.cfg

创建目录

[root@kb129 conf]# mkdir /opt/soft/zk345/logs

[root@kb129 conf]# mkdir /opt/soft/zk345/zkdata

编辑配置文件,增加目录指向

[root@kb129 conf]# vim  ./zoo.cfg

dataDir=/opt/soft/zk345/zkdata

dataLogDir=/opt/soft/zk345/logs

server.0=192.168.142.129:2287:3387

追加节点id

[root@kb129 conf]# cd ../zkdata/

[root@kb129 zkdata]# echo "0">myid

启动zookeeper

[root@kb129 zkdata]# zkServer.sh start

启动hbase

(启动前解决Hbase和hadoop中log4j的jar包冲突报错问题:将Hbase中的jar包改名就不会读取,解决掉冲突报错:mv /opt/soft/hbase235/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar /opt/soft/hbase235/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar.bak)

[root@kb129 zkdata]# start-hbase.sh

网页访问http://kb129:16010/

2.Hbase shell相关操作

[root@kb129 conf]# hbase shell

创建命名空间

hbase(main):001:0> create_namespace 'kb23'

查看命名空间

hbase(main):001:0>list _namespace

 

创建表

hbase(main):007:0> create 'bigdata:student','baseinfo','schoolinfo'

查看表

hbase(main):008:0> list_namespace_tables 'bigdata'

查看描述

hbase(main):009:0> desc 'bigdata:student'

删除表之前先禁用表

禁用表

hbase(main):011:0> disable 'bigdata:student'

查看是否禁用/启用

hbase(main):011:0> is_disabled/is_enabled 'bigdata:student'

启用表

hbase(main):011:0> enable 'bigdata:student'

插入数据(原有数据的话会覆盖)

hbase(main):006:0> put 'bigdata:student','rowkey1','baseinfo:name','tom'

查看指定rowkey的所有数据

hbase(main):008:0> get 'bigdata:student','rowkey1'

COLUMN                        CELL                                                                               

 baseinfo:age                 timestamp=2023-09-13T14:21:26.095, value=30                                        

 baseinfo:name                timestamp=2023-09-13T14:21:22.385, value=tom    

查看指定列族数据

hbase(main):011:0> get 'bigdata:student','rowkey1','baseinfo'

COLUMN                        CELL                                                                               

 baseinfo:age                 timestamp=2023-09-13T14:21:26.095, value=30                                        

 baseinfo:name                timestamp=2023-09-13T14:21:22.385, value=tom   

查看指定列族中某列数据

hbase(main):012:0> get 'bigdata:student','rowkey1','baseinfo:name'

COLUMN                        CELL                                                                               

 baseinfo:name                timestamp=2023-09-13T14:21:22.385, value=tom

添加列族

hbase(main):021:0> alter 'kb23:student','teacherinfo'

删除列族

hbase(main):023:0> alter 'kb23:student',{NAME=>'teacherinfo',METHOD=>'delete'}

更改版本个数(VERSIONS默认为1)

hbase(main):026:0> alter 'kb23:student',{NAME=>'baseinfo',VERSIONS=>3}

全表扫描

hbase(main):027:0> scan 'kb23:student'

删除指定列族中的列

hbase(main):055:0> delete 'kb23:student','rowkey2','baseinfo:name'

删除所有rowkey2信息

hbase(main):060:0> deleteall 'kb23:student','rowkey2'

查看不同版本信息

hbase(main):070:0> get 'kb23:student','rowkey1',COLUMN=>'baseinfo:name',VERSIONS=>3

查看范围内rowkey的数据(左闭右开)

hbase(main):094:0> scan 'kb23:student', {COLUMNS => 'baseinfo:name', STARTROW => 'rowkey',STOPROW=> 'rowkey3'}

查看时使用limit

hbase(main):096:0> scan 'kb23:student', {COLUMNS => 'baseinfo:name', STARTROW => 'rowkey',STOPROW=> 'rowkey3', VERSIONS=> 3, LIMIT=> 1}

过滤查找value包含11开头的信息(可查到多个版本)

hbase(main):099:0> scan 'kb23:student',FILTER=>"ValueFilter(=,'binary:11')"

过滤查找value包含andemen开头的信息(可查到多个版本)

hbase(main):102:0> scan 'kb23:student',FILTER=>"ValueFilter(=,'substring:andemen')"

过滤查找列名birth开头的信息(可查到多个版本)

hbase(main):104:0> scan 'kb23:student',FILTER=>"ColumnPrefixFilter('birth')"

多条件AND查询

hbase(main):110:0> scan 'kb23:student',FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter(=,'substring:200')"

AND或OR查询

hbase(main):005:0>scan 'kb23:student',FILTER=>"ColumnPrefixFilter('birth') AND (ValueFilter(=,'substring:200')) OR ValueFilter(=,'substring:20')"

3.Hbase运行原理

3.1  HBase物理架构

1)StoreFile

保存实际数据的物理文件,StoreFile以Hfile的形式存储在HDFS上。每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的。

2)MemStore

写缓存,由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile,每次刷写都会形成一个新的HFile。

3)WAL

由于数据要经MemStore排序后才能刷写到HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入MemStore中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

4)BlockCache

读缓存,每次查询出的数据会缓存在BlockCache中,方便下次查询。

3.2  写流程

1)Client先访问zookeeper,获取hbase:meta表位于哪个Region Server。

2)访问对应的Region Server,获取hbase:meta表,根据写请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。

3)与目标Region Server进行通讯;

4)将数据顺序写入(追加)到WAL;

5)将数据写入对应的MemStore,数据会在MemStore进行排序;

6)向客户端发送ack;

7)等达到MemStore的刷写时机后,将数据刷写到HFile。

3.3  MemStore Flush

MemStore刷写时机:

1.当某个memstroe的大小达到了hbase.hregion.memstore.flush.size(默认值128M),其所在region的所有memstore都会刷写。

当memstore的大小达到了

hbase.hregion.memstore.flush.size(默认值128M)* hbase.hregion.memstore.block.multiplier(默认值4)时,会阻止继续往该memstore写数据。

2.当region server中memstore的总大小达到

java_heapsize*hbase.regionserver.global.memstore.size(默认值0.4)*hbase.regionserver.global.memstore.size.lower.limit(默认值0.95),

region会按照其所有memstore的大小顺序(由大到小)依次进行刷写。直到region server中所有memstore的总大小减小到上述值以下。

当region server中memstore的总大小达到

java_heapsize*hbase.regionserver.global.memstore.size(默认值0.4)时,会阻止继续往所有的memstore写数据。

3. 到达自动刷写的时间,也会触发memstore flush。自动刷新的时间间隔由该属性进行配置hbase.regionserver.optionalcacheflushinterval(默认1小时)。

4.当WAL文件的数量超过hbase.regionserver.max.logs,region会按照时间顺序依次进行刷写,直到WAL文件数量减小到hbase.regionserver.max.log以下(该属性名已经废弃,现无需手动设置,最大值为32)。

3.4  读流程

1)Client先访问zookeeper,获取hbase:meta表位于哪个Region Server。

2)访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。

3)与目标Region Server进行通讯;

4)分别在MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。

5)将查询到的新的数据块(Block,HFile数据存储单元,默认大小为64KB)缓存到Block Cache。

6)将合并后的最终结果返回给客户端。

3.5  StoreFile Compaction

由于memstore每次刷写都会生成一个新的HFile,且同一个字段的不同版本(timestamp)和不同类型(Put/Delete)有可能会分布在不同的HFile中,因此查询时需要遍历所有的HFile。为了减少HFile的个数,以及清理掉过期和删除的数据,会进行StoreFile Compaction。

Compaction分为两种,分别是Minor Compaction和Major Compaction。Minor Compaction会将临近的若干个较小的HFile合并成一个较大的HFile,并清理掉部分过期和删除的数据。Major Compaction会将一个Store下的所有的HFile合并成一个大HFile,并且会清理掉所有过期和删除的数据。

3.6  Region Split

默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的Region Server,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的Region Server。

Region Split时机:

1.当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize (10G),该Region就会进行拆分(0.94版本之前)。

2.当1个region中的某个Store下所有StoreFile的总大小超过Min(initialSize*R^3 ,hbase.hregion.max.filesize"),该Region就会进行拆分。其中initialSize的默认值为2*hbase.hregion.memstore.flush.size,R为当前Region Server中属于该Table的Region个数(0.94版本之后)。

具体的切分策略为:

第一次split:1^3 * 256 = 256MB

第二次split:2^3 * 256 = 2048MB

第三次split:3^3 * 256 = 6912MB

第四次split:4^3 * 256 = 16384MB > 10GB,因此取较小的值10GB

后面每次split的size都是10GB了。

3.Hbase 2.0引入了新的split策略:如果当前RegionServer上该表只有一个Region,按照2 * hbase.hregion.memstore.flush.size分裂,否则按照hbase.hregion.max.filesize分裂。

4.hive映射hbase

hive中创建表格,关联hbase中的表

(1)

create external table student(
    id string,
    stuname string,
    birthdate string,
    age int,
    schoolname string,
    location string
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with
    serdeproperties
('hbase.columns.mapping'=':key,baseinfo:name,baseinfo:birthday,baseinfo:age,schoolinfo:name,schoolinfo:location')
tblproperties ('hbase.table.name'='kb23:student');

select * from student;

(2)rowkey之间不同字段

create external table kb23factory(

    id string,

    usrname string,

    age string,

    gender string,

    email string,

    partname string,

    permission string

  )

  stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with

    serdeproperties

        ('hbase.columns.mapping'=':key,usr:name,usr:age,usr:gender,usr:email,part:name,part:permission')

  tblproperties ('hbase.table.name'='kb23:kb23factory');

  

  select * from kb23factory;

5.Hbase API

5.1   pom依赖

<dependency>
  <groupId>org.apache.hbase</groupId>
  <artifactId>hbase-client</artifactId>
  <version>2.3.5</version>
</dependency>
<dependency>
  <groupId>org.apache.hbase</groupId>
  <artifactId>hbase-common</artifactId>
  <version>2.3.5</version>
</dependency>

5.2  增删改查等具体操作

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.FamilyFilter;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;

/**
 * Unit test for simple App.
 */
public class AppTest {

    private Connection connection = null;

    // 获取配置类
    private Configuration config = HBaseConfiguration.create();

    //创建连接
    @Before
    public void init() throws IOException {
        // 给配置类添加配置
        config.set("hbase.zookeeper.quorum", "kb129");
        config.set("hbase.zookeeper.property.clientPort", "2181");
        // 获取连接
        connection = ConnectionFactory.createConnection(config);
    }

    //打印连接,测试连接
    @Test
    public void testConnection() throws IOException {
        System.out.println(connection);
    }

    //创建表
    @Test
    public void createTable() throws IOException {
        // 获取admin
        Admin admin = connection.getAdmin();
        TableName tableName = TableName.valueOf("kb23:test2");
        /*HTableDescriptor desc = new HTableDescriptor(tableName);
        HColumnDescriptor family1 = new HColumnDescriptor("info");
        HColumnDescriptor family2 = new HColumnDescriptor("info2");
        desc.addFamily(family1);
        desc.addFamily(family2);*/

        // 获取descriptor的builder
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);

        // 添加列族
        ColumnFamilyDescriptor columnFamilyDescriptor1 = ColumnFamilyDescriptorBuilder.of("baseinfo");
        ColumnFamilyDescriptor columnFamilyDescriptor2 = ColumnFamilyDescriptorBuilder.of("schoolinfo");

        // 将单个列族的descriptor添加到builder中
        tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptor1);
        tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptor2);
        TableDescriptor descriptor = tableDescriptorBuilder.build();

        //创建表
        admin.createTable(descriptor);

    }

    //插入数据
    @Test
    public void putValue() throws IOException {
        // 1.获取table
        Table table = connection.getTable(TableName.valueOf("kb23:test1"));
        // 2.创建Put对象
        Put put = new Put(Bytes.toBytes("liuxin"));
        // 3.添加put属性
        put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("刘鑫"));
        put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes("Male"));
        put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("height"), Bytes.toBytes("180"));
        // 4.put数据
        table.put(put);
        // 5.关闭资源
        table.close();
    }

    //通过集合插入多条数据
    @Test
    public void putValueList() throws IOException {
        // 1.获取table
        Table table = connection.getTable(TableName.valueOf("kb23:test1"));
        // 2.创建Put对象
        Put zs = new Put(Bytes.toBytes("zhangsan"));
        // 3.添加put属性
        zs.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("张三"));
        zs.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes("Female"));
        zs.addColumn(Bytes.toBytes("info"), Bytes.toBytes("height"), Bytes.toBytes("160"));

        Put ls = new Put(Bytes.toBytes("lisi"));
        // 3.添加put属性
        ls.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("李四"));
        ls.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes("Male"));
        ls.addColumn(Bytes.toBytes("info"), Bytes.toBytes("height"), Bytes.toBytes("180"));
        // 4.put数据
        ArrayList<Put> puts = new ArrayList<Put>();
        puts.add(zs);
        puts.add(ls);
        table.put(puts);
        // 5.关闭资源
        table.close();
    }


    @Test
    public void putValueMutator() throws IOException {
        BufferedMutatorParams bufferedMutatorParams = new BufferedMutatorParams(TableName.valueOf("kb23:test1 "));
        bufferedMutatorParams.setWriteBufferPeriodicFlushTimeoutMs(10000);//设置超时flush时间最大值
        bufferedMutatorParams.writeBufferSize(10*1024*1024);//设置缓存大小flush
        BufferedMutator bufferedMutator = connection.getBufferedMutator(bufferedMutatorParams) ;
        /*// 3.添加put属性
        Put zs = new Put(Bytes.toBytes("zhangsan"));
        zs.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("张三"));
        zs.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes("Female"));
        zs.addColumn(Bytes.toBytes("info"), Bytes.toBytes("height"), Bytes.toBytes("160"));

        Put ls = new Put(Bytes.toBytes("lisi"));
        // 3.添加put属性
        ls.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("李四"));
        ls.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes("Male"));
        ls.addColumn(Bytes.toBytes("info"), Bytes.toBytes("height"), Bytes.toBytes("180"));*/
        // 4.put数据
        ArrayList<Put> puts = new ArrayList<Put>();
        //puts.add(zs);
        //puts.add(ls);
        bufferedMutator.mutate(puts);
    }

    //删除数据
    @Test
    public void delete() throws IOException {
        // 1.获取table
        Table table = connection.getTable(TableName.valueOf("kb23:test1"));
        //删除具体的列
        /*Delete delname = new Delete(Bytes.toBytes("lisi"));
        delname.addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"));
        table.delete(delname);*/

        //通过rowkey整个删除
        Delete lisi = new Delete(Bytes.toBytes("lisi"));
        table.delete(lisi);
    }

    //查询数据
    @Test
    public void getValue() throws IOException {
        // 1.获取table
        Table table = connection.getTable(TableName.valueOf("kb23:test1"));

        // 2.获取Get对象
        Get zhangsan = new Get(Bytes.toBytes("zhangsan"));

        // 3. 获取result
        Result result = table.get(zhangsan);
        byte[] name = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"));
        byte[] gender = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("gender"));
        byte[] height = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("height"));
        System.out.println(Bytes.toString(name) + Bytes.toString(gender) + Bytes.toString(height));
    }

    //扫描数据
    @Test
    public void scanValue() throws IOException {
        // 1.获取table
        Table table = connection.getTable(TableName.valueOf("kb23:test1"));

        // 2.创建Scan对象
        Scan scan = new Scan();

        // 3.扫描数据
        scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
        scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"));
        scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("height"));
        ResultScanner scanner = table.getScanner(scan);

        // 4.获取结果
        for (Result result : scanner) {
            byte[] name = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"));
            byte[] gender = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("gender"));
            byte[] height = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("height"));
            System.out.println(Bytes.toString(name) + Bytes.toString(gender) + Bytes.toString(height));
        }
    }

    //过滤器,查找数据
    @Test
    public void getFilterRowKey() throws IOException {
        TableName tableName = TableName.valueOf("kb23:student");
        Table table = connection.getTable(tableName);
        FamilyFilter familyFilter =
                new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("baseinfo")));
        Scan scan = new Scan();
        scan.setFilter(familyFilter);
        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            byte[] name = result.getValue(Bytes.toBytes("baseinfo"), Bytes.toBytes("name"));
            byte[] age = result.getValue(Bytes.toBytes("baseinfo"), Bytes.toBytes("age"));
            byte[] birthday = result.getValue(Bytes.toBytes("baseinfo"), Bytes.toBytes("birthday"));
            System.out.println(Bytes.toString(name) + "\t" + Bytes.toString(age) + "\t" + Bytes.toString(birthday));
            System.out.println("----------------------");
        }
    }
   
    //关闭连接
    @After
    public void closeConnection() throws IOException {
        if (connection != null) {
            // 关闭连接
            connection.close();
        }
    }
}

5.3  写缓存  HBase客户端的批量写缓存BufferedMutator

HBase的每一个put操作实际上是一个RPC操作,将客户端的数据传输到服务器再返回结果,这只适用于小数据量的操作,如果数据量多的话,每次put都需要建立一次RPC的连接(TCP连接),而建立连接传输数据是需要时间的,因此减少RPC的调用可以提高数据传输的效率,减少建立连接的时间和IO消耗。

HBase的客户端API提供了写缓存区,put的数据一开始放在缓存区内,当数量到达指定的容量或者用户强制提交是才将数据一次性提交到HBase的服务器。这个缓冲区可以通过调用 HTable.setAutoFlush(false) 来开启。而新版HBbase的API中使用了BufferedMutator替换了老版的缓冲区,通过BufferedMutator对象提交的数据自动存放在缓冲区中。

BufferedMutator

通过获取 BufferedMutator 对象,并调用 mutator.mutate(List<Mutation> mutations) 方法来进行批量插入数据。可以使用 Put 类型的对象列表作为 mutations 参数进行插入。BufferedMutator 提供了自动管理缓冲区和写入操作的功能,可以提高插入数据的性能。

@Test
public void putValueMutator() throws IOException {
    BufferedMutatorParams bufferedMutatorParams = new BufferedMutatorParams(TableName.valueOf("kb23:test1 "));
    bufferedMutatorParams.setWriteBufferPeriodicFlushTimeoutMs(10000);//设置超时flush时间最大值
    bufferedMutatorParams.writeBufferSize(10*1024*1024);//设置缓存大小flush
    BufferedMutator bufferedMutator = connection.getBufferedMutator(bufferedMutatorParams) ;
    /*// 3.添加put属性
    Put zs = new Put(Bytes.toBytes("zhangsan"));
    zs.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("张三"));
    zs.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes("Female"));
    zs.addColumn(Bytes.toBytes("info"), Bytes.toBytes("height"), Bytes.toBytes("160"));

    Put ls = new Put(Bytes.toBytes("lisi"));
    // 3.添加put属性
    ls.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("李四"));
    ls.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes("Male"));
    ls.addColumn(Bytes.toBytes("info"), Bytes.toBytes("height"), Bytes.toBytes("180"));*/
    // 4.put数据
    ArrayList<Put> puts = new ArrayList<Put>();
    //puts.add(zs);
    //puts.add(ls);
    bufferedMutator.mutate(puts);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1009922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OS】操作系统课程笔记 第三章 进程管理

3.1 多道程序设计 吞吐率&#xff1a;衡量一个系统效率的一个指标 采用多道程序设计可以显著提高吞吐率&#xff1a; 但是&#xff0c;并不是内存程序数量越多越好&#xff0c;下面有三点否定&#xff1a; 内存的容量限制了系统可同时处理程序的数目设备数量有限程序道数过多…

✔ ★ 算法基础笔记(Acwing)(三)—— 搜索与图论(17道题)【java版本】

搜索与图论 1. DFS1. 排列数字(3分钟)2. n-皇后问题 2. BFS&#xff08;队列&#xff09;1. 走迷宫二刷总结&#xff08;队列存储一个节点pair<int,int>&#xff09;三刷总结 走过的点标记上距离(既可以记录距离&#xff0c;也可以判断是否走过) ★ ★ 例题2. 八数码二刷…

离线安装PX4日志分析工具Flight Review

使用Flight Review在线分析日志&#xff0c;有时会因为网络原因无法使用 使用离线安装的方式使用Flight Review&#xff0c;可以在无需网络的情况下使用Flight Review sudo apt-get install sqlite3 fftw3 libfftw3-devsudo apt-get install libatlas3-basegit clone --recur…

【Linux核心宝典】Linux 系统目录结构详解 - 01

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

Linux基础入门

一、操作系统安装方法 1、使用u盘安装 工具&#xff08;前提条件&#xff09;&#xff1a; <1>u盘 <2>镜像文件iso/msdn.itellyou.cn <3>把u盘做成PE&#xff1a;大白菜/老毛桃/winPE/软碟通/ultralSO 设置BIOS&#xff1a;通过u盘启动 安装系统&…

Vue项目中实现拖拽排序效果-demo

在Vue3中实现拖拽排序&#xff0c;可以借助一些浏览器自带的API&#xff0c;以及一些Vue3的特性&#xff1a; 使用<template>标签中的v-for指令渲染出一个列表&#xff0c;每个列表项绑定一个draggable属性&#xff0c;使其能够被拖拽。 <template><ul><…

一次I/O操作的过程

什么是IO呢&#xff1f; IO&#xff0c;英文全称是Input/Output&#xff0c;翻译过来就是输入/输出。平时我们听得挺多&#xff0c;就是什么磁盘IO&#xff0c;网络IO。那IO到底是什么呢&#xff1f;是不是有种懵懵懂懂的感觉呀&#xff0c;好像大概知道它是什么&#xff0c;又…

ARIMA模型

1、简介 ARIMA模型(Autoregressive Integrated Moving Average model)&#xff0c;差分整合移动平均自回归模型&#xff0c;又称整合移动平均自回归模型&#xff0c;时间序列预测分析方法之一。ARIMA(p,d,q)中&#xff0c;AR是"自回归"&#xff0c;p为自回归项数;MA…

二叉树题目:最大层内元素和

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;最大层内元素和 出处&#xff1a;1161. 最大层内元素和 难度 4 级 题目描述 要求 给定一个二叉树的根结点 ro…

zookeeper可视化工具ZooInspector用法

最近在做银行的项目&#xff0c;用到了thrift&#xff0c;rpc和zookeeper&#xff0c;所有应用都是注册到zookeeper上的&#xff0c;想知道哪些应用注册上了&#xff0c;就用到ZooInspector这个可视化的工具。 1&#xff0c;下载 链接&#xff1a;https://issues.apache.org/…

flex弹性盒模型与阿里图标的使用

华子目录 flex布局flex布局原理flex使用三要素 阿里图标&#xff08;字体&#xff09; flex布局 相关学习网站&#xff1a;http://c.biancheng.net/css3/flex.html 1.flex是当前最主流的布局方式&#xff1a;用它布局起来更方便&#xff0c;取代了浮动的作用。 2.浮动布局有缺…

BUG:阿里巴巴图标库引入链接后,icon有时候会不显示的话svg下载到本地使用

忽然icon图标就不显示&#xff0c;但是代码、icon链接地址都没有发生变化 解决办法&#xff1a;将icon图标下载到本地&#xff0c;记住前后引用本地的名字要保持一致

学习jQuery库的第一天

简介 什么是 jQuery &#xff1f; jQuery 是一个广泛使用的 JavaScript 库。它简化了网页开发中常见的许多任务&#xff0c;例如 HTML 文档遍历、操作 HTML 元素、处理事件、动画效果、Ajax 网络请求等。通过使用 jQuery&#xff0c;开发人员可以更加高效地编写跨浏览器兼容的…

如何制作一个成功的超市购物小程序

随着互联网的普及和移动支付的便捷性&#xff0c;越来越多的消费者选择在网上购物&#xff0c;这也促使越来越多的商家开始搭建自己的小程序商城。对于超市便利店来说&#xff0c;拥有一个便捷、易用的小程序商城能够吸引更多的消费者&#xff0c;提高销售效率。那么如何快速搭…

MyBatis初级

文章目录 一、mybatis1、概念2、JDBC缺点2.1、之前jdbc操作2.2 、原始jdbc操作的分析 3、mybatis的使用3.1、导入maven依赖3.2、新建表3.3、实体类3.4、编写mybatis的配置文件3.5、编写接口 和 映射文件3.6、编写测试类3.7、注意事项 4、代理方式开发5、mybatis和spring整合5.1…

数学实验-最佳分数近似值(Mathematica实现)

一、实验名称&#xff1a;最佳分数近似值 二、实验环境&#xff1a;Mathematica 10.3软件 三、实验目的&#xff1a;研究怎样用分数近似值去对给定的无理数作最佳逼近&#xff0c;“最佳”就是既要误差小&#xff0c;又要分母小。我们首先需要对“最佳”定出具体而明确的标准…

动态IP代理是什么?一文看懂动态代理IP

一、什么是动态IP代理&#xff1f; 动态IP代理是一种代理服务&#xff0c;而动态IP是由ISP动态分配给用户的IP地址&#xff0c;这些IP地址会周期性地更改。每次链接互联网时&#xff0c;用户会被分配一个新的IP地址&#xff0c;因而也称为”轮换IP”。 IP地址轮换是一个过程&…

Roreg复现

一、roreg复现 [github链接][参考] 1.1 报错1 Traceback (most recent call last): File "setup.py", line 52, in <module> import torch File "/home/w/anaconda3/envs/pty_roreg/lib/python3.7/site-packages/torch/__init__.py", line …

公司中一个好的管理者应该是什么样的?

一个好的管理者&#xff0c;不仅在公司中发挥着至关重要的作用&#xff0c;而且能够对组织的成功和员工的幸福产生深远的影响。那么&#xff0c;一个好的管理者应该具备哪些特质和技能呢&#xff1f;以下是我根据现有研究和经验总结出来的一些观点。 强大的领导力&#xff1a;…

【干货超全】国内外常见的Ai大模型汇总!!!

国内外常见的Ai大模型汇总: 点击文字即可跳转 1&#xff09;国内 讯飞星火大模型 https://xinghuo.xfyun.cn 百度文心一言 https://yiyan.baidu.com 阿里通义千问 https://tongyi.aliyun.com 华为盘古大模型 https://pangu.huaweicloud.com/ 清华智谱清言链接&#xff1…