kudu的原理及java调用

Kudu是为了解决HDFS不适合单条记录更新和HBase批处理性能不足的问题而设计的。它支持列式存储和随机读写,适合OLAP分析和实时写入更新。Kudu提供了Java API用于创建表、插入、更新、删除和查询数据,弥补了HDFS和HBase在特定场景下的不足。
摘要由CSDN通过智能技术生成

hdfs与hbase数据存储的缺点

目前数据存储有了HDFS与hbase,为什么还要额外的弄一个kudu呢?

  • HDFS:

使用列式存储格式Apache Parquet,Apache ORC,适合离线分析,不支持单条纪录级别的update操作,随机读写性能差。

  • HBASE:

可以进行高效随机读写,却并不适用于基于SQL的数据分析方向,大批量数据获取时的性能较差。

正因为HDFS与HBASE有上面这些缺点,KUDU较好的解决了HDFS与HBASE的这些缺点,它不及HDFS批处理快,也不及HBase随机读写能力强,但是反过来它比HBase批处理快(适用于OLAP(在线数据处理)的分析场景),而且比HDFS随机读写能力强(适用于实时写入或者更新的场景),这就是它能解决的问题。

KUDU的java操作

<dependency>
    <groupId>org.apache.kudu</groupId>
    <artifactId>kudu-client</artifactId>
    <version>${kudu.version}</version>
    <scope>test</scope>
</dependency>

<!--导入kudu的客户端工具-->
<dependency>
    <groupId>org.apache.kudu</groupId>
    <artifactId>kudu-client-tools</artifactId>
    <version>${kudu.version}</version>
</dependency>
  1. 表创建
 /**
     * 创建表
     * @throws Exception
     */
    public static void createTable() throws Exception{
        //1、创建一个client
        KuduClient client = new KuduClientBuilder(KUDU_MASTER).build();
        //2、创建schema信息
        List<ColumnSchema> columns = new ArrayList<ColumnSchema>();
        columns.add(new ColumnSchema.ColumnSchemaBuilder("id", Type.INT32).key(true).nullable(false).build());
        columns.add(new ColumnSchema.ColumnSchemaBuilder("name", Type.STRING).key(false).nullable(false).build());
        columns.add(new ColumnSchema.ColumnSchemaBuilder("age", Type.INT32).key(false).nullable(false).build());
        Schema schema = new Schema(columns);
        //3、指定分区字段
        List<String> partions = new ArrayList<String>();
        partions.add("id");
        //4、指定分区方式为hash分区、6个分区,一个副本
        CreateTableOptions options = new CreateTableOptions().addHashPartitions(partions, 6).setNumReplicas(1);
        //5、创建表,
        client.createTable("person",schema,options);

        client.close();
    }

Insert

/**
     * 插入数据
     * @throws Exception
     */
    public static void add() throws Exception{
        //1、创建一个client
        KuduClient client = new KuduClientBuilder(KUDU_MASTER).build();
        //2、打开表
        KuduTable table = client.openTable("person");
        //3、创建一个session会话
        KuduSession session = client.newSession();
        //4、创建插入
        Insert insert = table.newInsert();
        //5、指定插入数据
        insert.getRow().addInt("id",1);
        insert.getRow().addInt("age",18);
        insert.getRow().addString("name","张三");
        //6、应用插入
        session.apply(insert);

        session.close();

        client.close();

    }

update

/**
     * 更新数据
     * @throws Exception
     */
    public static void update() throws Exception{
        //1、创建kudu client
        KuduClient client = new KuduClientBuilder(KUDU_MASTER).build();
        //2、打开表
        KuduTable table = client.openTable("person");

        KuduSession session = client.newSession();

        Update update = table.newUpdate();
        update.getRow().addInt("id",1);
        update.getRow().addString("name","李四");

        session.apply(update);
        session.flush();
        session.close();

        client.close();
    }

delete

 /**
     * 删除数据
     * @throws Exception
     */
    public static void delete() throws Exception{
        //1、创建kudu client
        KuduClient client = new KuduClientBuilder(KUDU_MASTER).build();
        //2、打开表
        KuduTable table = client.openTable("person");

        KuduSession session = client.newSession();

        Delete delete = table.newDelete();
        delete.getRow().addInt("id",1);


        session.apply(delete);
        session.flush();
        session.close();

        client.close();
    }

query

 /**
     * 条件查询 select * from person where id=1
     * @throws Exception
     */
    public static void query() throws Exception{
        //1、创建kudu client
        KuduClient client = new KuduClientBuilder(KUDU_MASTER).build();
        //2、打开表
        KuduTable table = client.openTable("person");
        //3、创建scanner扫描器
        KuduScanner.KuduScannerBuilder kuduScannerBuilder = client.newScannerBuilder(table);
        //4、创建查询条件
        KuduPredicate filter = KuduPredicate.newComparisonPredicate(table.getSchema().getColumn("id"), KuduPredicate.ComparisonOp.EQUAL, 1);
        //5、将查询条件加入到scanner中
        KuduScanner scanner = kuduScannerBuilder.addPredicate(filter).build();
        //6、获取查询结果
        while (scanner.hasMoreRows()){
            RowResultIterator rows = scanner.nextRows();
            while (rows.hasNext()){
                RowResult row = rows.next();
                Integer id = row.getInt("id");
                String name = row.getString("name");
                int age = row.getInt("age");
                System.out.println(id+"---"+name+"---"+age);
            }
        }
        //7、关闭client
        client.close();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵豸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值