zoukankan      html  css  js  c++  java
  • Kudu的安装和使用

    1、下载rpm

      地址:https://archive.cloudera.com/cdh5/redhat/7/x86_64/cdh/5/RPMS/x86_64/

      下载所有kudu开头的rpm包

    2、安装:
      rpm -ivh * --nodeps


    3、启动:
      service kudu-master start
      service kudu-tserver start

    4、指令:

         查看集群
      kudu cluster ksck localhost

         查看master状态或flag
      kudu master status localhost
      kudu master get_flags localhost
      可以查看到bound_http_addresses的port,则访问地址:localhost:port 则是web管理页面。

         查看tserver状态或flag
      kudu tserver status localhost
      kudu tserver get_flags localhost

         查看表
      kudu table list 172.22.19.143


    5、DDL、DML
      • 若使用impala,可以直接执行create sql。
      • 若使用Java API,可以直接连接kudu并创建表、增删改查操作。


    6、用户
      kudu没有用户的概念,需要依赖 kerberos进行实现。

    7、表权限设置
    kudu没有用户、角色、权限等概念,需要用 CDH的sentry+impala实现用户权限的分配。

    [cdh01-dev:21000]>grant select on table a_kudu_database.a_kudu_table to role read;
    [cdh01-dev:21000]>grant all on table b_kudu_database.b_kudu_table to role ddl;
    [cdh01-dev:21000]>grant role read to group a_user;
    [cdh01-dev:21000]>grant role ddl to group b_user;
    [cdh01-dev:21000]>

    8、Java API 连接Kudu

    由于kerberos和impala都比较重,暂时不进行安装,直接使用Java api的方式直接访问kudu,执行DDL、DML等操作。

    注意:修改客户端的hosts文件(Kudu服务器的hostname为Icloud_143,ip为172.22.19.143),则需要在客户端hosts添加
    172.22.19.143   Icloud_143

    否则会报connect fail等问题。

    示例代码

      1 package com.example.kudu;
      2 
      3 import org.apache.kudu.ColumnSchema;
      4 import org.apache.kudu.Schema;
      5 import org.apache.kudu.Type;
      6 import org.apache.kudu.client.*;
      7 import org.junit.Before;
      8 import org.junit.jupiter.api.Test;
      9 import org.springframework.boot.test.context.SpringBootTest;
     10 
     11 import java.util.ArrayList;
     12 import java.util.LinkedList;
     13 import java.util.List;
     14 
     15 @SpringBootTest
     16 class KuduApplicationTests {
     17 
     18     private KuduClient kuduClient;
     19 
     20     private String kuduMaster;
     21 
     22     private String tableName;
     23 
     24     @Before
     25     public void init() {
     26         try{
     27             System.out.println("initing........................");
     28             //初始化操作
     29             kuduMaster = "172.22.19.143:7051";
     30             //指定表名
     31             tableName = "student";
     32             KuduClient.KuduClientBuilder kuduClientBuilder = new KuduClient.KuduClientBuilder(kuduMaster);
     33             kuduClientBuilder.defaultOperationTimeoutMs(1800000);
     34             kuduClient = kuduClientBuilder.build();
     35             System.out.println("服务器地址" + kuduMaster + ":客户端"+ kuduClient +"初始化成功...");
     36         }catch (Exception e){
     37             System.out.println(e);
     38         }
     39     }
     40 
     41     private static ColumnSchema newColumn(String name, Type type, boolean iskey) {
     42         ColumnSchema.ColumnSchemaBuilder column = new ColumnSchema.ColumnSchemaBuilder(name, type);
     43         column.key(iskey);
     44         return column.build();
     45     }
     46     /**
     47      * 创建无分区表
     48      */
     49     @Test
     50     public void createTable() throws KuduException {
     51         init();
     52 
     53         // 设置表的schema
     54         List<ColumnSchema> columns = new LinkedList<ColumnSchema>();
     55         columns.add(newColumn("id", Type.STRING, true));
     56         columns.add(newColumn("name", Type.STRING, false));
     57         columns.add(newColumn("age", Type.INT32, false));
     58         columns.add(newColumn("sex", Type.INT32, false));
     59         Schema schema = new Schema(columns);
     60 
     61         // 设置表的replica备份和分区规则
     62         List<String> parcols = new LinkedList<String>();
     63         parcols.add("id");
     64 
     65         //创建表时提供的所有选项
     66         CreateTableOptions options = new CreateTableOptions();
     67         options.setNumReplicas(1);  //设置表的备份数
     68         options.setRangePartitionColumns(parcols);  //设置range分区
     69         options.addHashPartitions(parcols, 3);  //设置hash分区和数量
     70         try {
     71             kuduClient.createTable("student",schema, options);
     72         } catch (KuduException e) {
     73             e.printStackTrace();
     74         }finally {
     75             if (kuduClient != null){
     76                 kuduClient.close();
     77             }
     78         }
     79     }
     80 
     81 
     82 
     83     /**
     84      * 向表加载数据
     85      */
     86     @Test
     87     public void insertTable() throws KuduException {
     88         init();
     89         //向表加载数据需要一个 kuduSession 对象
     90         KuduSession kuduSession = kuduClient.newSession();
     91 //        kuduSession.set
     92         kuduSession.setTimeoutMillis(100000);
     93         kuduSession.setFlushMode(SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC);
     94         //需要使用 kuduTable 来构建 Operation 的子类实例对象
     95         KuduTable kuduTable = kuduClient.openTable(tableName);
     96         for (int i = 1; i <= 10; i++) {
     97             Insert insert = kuduTable.newInsert();
     98             PartialRow row = insert.getRow();
     99             row.addString("id", i+"");
    100             row.addString("name", "zhangsan-" + i);
    101             row.addInt("age", 20 + i);
    102             row.addInt("sex", i % 2);
    103             //最后实现执行数据的加载操作
    104             kuduSession.apply(insert);
    105         }
    106     }
    107 
    108 
    109 
    110 
    111     /**
    112      * 查询表的数据结果
    113      */
    114     @Test
    115     public void queryData() throws KuduException {
    116         init();
    117         //构建一个查询的扫描器
    118         KuduScanner.KuduScannerBuilder kuduScannerBuilder =
    119                 kuduClient.newScannerBuilder(kuduClient.openTable(tableName));
    120         ArrayList<String> columnsList = new ArrayList<String>();
    121         columnsList.add("id");
    122         columnsList.add("name");
    123         columnsList.add("age");
    124         columnsList.add("sex");
    125         kuduScannerBuilder.setProjectedColumnNames(columnsList);
    126         //返回结果集
    127         KuduScanner kuduScanner = kuduScannerBuilder.build();
    128         //遍历
    129         while (kuduScanner.hasMoreRows()) {
    130             RowResultIterator rowResults = kuduScanner.nextRows();
    131             while (rowResults.hasNext()) {
    132                 RowResult row = rowResults.next();
    133                 String id = row.getString("id");
    134                 String name = row.getString("name");
    135                 int age = row.getInt("age");
    136                 int sex = row.getInt("sex");
    137                 System.out.println(">>>>>>>>>>  id=" + id + " name=" + name + " age=" + age + "sex = " + sex);
    138             }
    139         }
    140     }
    141 
    142 
    143 
    144 
    145     /**
    146      * 修改表的数据
    147      */
    148     @Test
    149     public void updateData() throws KuduException {
    150         init();
    151         //修改表的数据需要一个 kuduSession 对象
    152         KuduSession kuduSession = kuduClient.newSession();
    153         kuduSession.setFlushMode(SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC);
    154         //需要使用 kuduTable 来构建 Operation 的子类实例对象
    155         KuduTable kuduTable = kuduClient.openTable(tableName);
    156         //Update update = kuduTable.newUpdate();
    157         //如果 id 存在就表示修改,不存在就新增
    158         Upsert upsert = kuduTable.newUpsert();
    159         PartialRow row = upsert.getRow();
    160         row.addInt("id", 100);
    161         row.addString("name", "zhangsan-100");
    162         row.addInt("age", 100);
    163         row.addInt("sex", 0);
    164         //最后实现执行数据的修改操作
    165         kuduSession.apply(upsert);
    166     }
    167 
    168 
    169 
    170 
    171     /**
    172      * 删除数据
    173      */
    174     @Test
    175     public void deleteData() throws KuduException {
    176         init();
    177         //删除表的数据需要一个 kuduSession 对象
    178         KuduSession kuduSession = kuduClient.newSession();
    179         kuduSession.setFlushMode(SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC);
    180         //需要使用 kuduTable 来构建 Operation 的子类实例对象
    181         KuduTable kuduTable = kuduClient.openTable(tableName);
    182         Delete delete = kuduTable.newDelete();
    183         PartialRow row = delete.getRow();
    184         row.addInt("id", 100);
    185         kuduSession.apply(delete);//最后实现执行数据的删除操作
    186     }
    187 
    188 
    189 
    190 
    191     @Test
    192     public void dropTable() throws KuduException {
    193         init();
    194         if (kuduClient.tableExists(tableName)) {
    195             kuduClient.deleteTable(tableName);
    196         }
    197     }
    198 
    199 }
  • 相关阅读:
    慎用SELECT INTO复制表
    Log4net 配置使用总结(一)
    清除Chrome浏览器的历史记录、缓存
    System.Runtime.InteropServices.COMException (0x80040154)错误
    MS SQL开发命名规则
    查看数据库、表、索引的物理存储情况
    (转)ASP.NET调用javascript脚本的方法总结
    SQL Server ——动态SQL
    SQL性能调优实践——SELECT COUNT
    养成随时注释的好习惯
  • 原文地址:https://www.cnblogs.com/malcolmfeng/p/13372218.html
Copyright © 2011-2022 走看看