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 }