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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM