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 }