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 }

 

posted @ 2020-07-24 15:31  MalcolmFeng  阅读(3665)  评论(0编辑  收藏  举报