±à¼ÍƼö: |
±¾ÎĽéÉÜÁËkuduÊÇʲô£¬ÎªÊ²Ã´ÐèÒªkudu?
»ù´¡¼Ü¹¹£¬´æ´¢»úÖÆ£¬kuduµÄ¹¤×÷»úÖÆ¼°KUDUµÄjava²Ù×÷°¸Àý¡£
±¾ÎÄÀ´×Ô csdn£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
1¡¢ kudu¼ò½é
1.1¡¢kuduÊÇʲô£¿
¼òµ¥À´Ëµ:duduÊÇÒ»¸öÓëhbaseÀàËÆµÄÁÐʽ´æ´¢·Ö²¼Ê½Êý¾Ý¿â¡£
¹Ù·½¸økuduµÄ¶¨Î»ÊÇ:ÔÚ¸üиü¼°Ê±µÄ»ù´¡ÉÏʵÏÖ¸ü¿ìµÄÊý¾Ý·ÖÎö
1.2¡¢ÎªÊ²Ã´ÐèÒªkudu£¿
1.2.1¡¢hdfsÓëhbaseÊý¾Ý´æ´¢µÄȱµã
ĿǰÊý¾Ý´æ´¢ÓÐÁËHDFSÓëhbase£¬ÎªÊ²Ã´»¹Òª¶îÍâµÄŪһ¸ökuduÄØ?
HDFS:ʹÓÃÁÐʽ´æ´¢¸ñʽApache Parquet£¬Apache
ORC£¬ÊʺÏÀëÏß·ÖÎö£¬²»Ö§³Öµ¥Ìõ¼Í¼¼¶±ðµÄupdate²Ù×÷£¬Ëæ»ú¶ÁдÐÔÄܲî
HBASE:¿ÉÒÔ½øÐиßÐ§Ëæ»ú¶Áд£¬È´²¢²»ÊÊÓÃÓÚ»ùÓÚSQLµÄÊý¾Ý·ÖÎö·½Ïò£¬´óÅúÁ¿Êý¾Ý»ñȡʱµÄÐÔÄܽϲ
ÕýÒòΪHDFSÓëHBASEÓÐÉÏÃæÕâЩȱµã£¬KUDU½ÏºÃµÄ½â¾öÁËHDFSÓëHBASEµÄÕâЩȱµã£¬Ëü²»¼°HDFSÅú´¦Àí¿ì£¬Ò²²»¼°HBaseËæ»ú¶ÁдÄÜÁ¦Ç¿£¬µ«ÊÇ·´¹ýÀ´Ëü±ÈHBaseÅú´¦Àí¿ì£¨ÊÊÓÃÓÚOLAPµÄ·ÖÎö³¡¾°£©£¬¶øÇÒ±ÈHDFSËæ»ú¶ÁдÄÜÁ¦Ç¿£¨ÊÊÓÃÓÚʵʱдÈë»òÕ߸üеij¡¾°£©£¬Õâ¾ÍÊÇËüÄܽâ¾öµÄÎÊÌâ¡£
2¡¢¼Ü¹¹½éÉÜ
2.1¡¢»ù±¾¼Ü¹¹

2.1.1¡¢¸ÅÄî
Table£¨±í£©£ºÒ»ÕÅtableÊÇÊý¾Ý´æ´¢ÔÚkuduµÄλÖá£Table¾ßÓÐschemaºÍÈ«¾ÖÓÐÐòµÄprimary
key(Ö÷¼ü)¡£Table±»·ÖΪºÜ¶à¶Î£¬Ò²¾ÍÊÇtablets.
Tablet (¶Î)£ºÒ»¸ötabletÊÇÒ»ÕÅtableÁ¬ÐøµÄsegment£¬ÓëÆäËûÊý¾Ý´æ´¢ÒýÇæ»ò¹ØÏµÐÍÊý¾ÝµÄpartitionÏàËÆ¡£Tablet´æÔÚ¸±±¾»úÖÆ£¬ÆäÖÐÒ»¸ö¸±±¾Îªleader
tablet¡£Èκθ±±¾¶¼¿ÉÒÔ¶Ô¶ÁÈ¡½øÐзþÎñ£¬²¢ÇÒдÈëʱÐèÒªÔÚËùÓи±±¾¶ÔÓ¦µÄtablet serverÖ®¼ä´ï³ÉÒ»ÖÂÐÔ¡£
Tablet server£º´æ´¢tabletºÍΪtabletÏòclientÌṩ·þÎñ¡£¶ÔÓÚ¸ø¶¨µÄtablet£¬Ò»¸ötablet
server³äµ±leader£¬ÆäËûtablet server³äµ±¸ÃtabletµÄfollower¸±±¾¡£Ö»ÓÐleader·þÎñдÇëÇó£¬leaderÓëfollowerΪÿ¸ö·þÎñÌṩ¶ÁÇëÇó¡£
Master£ºÖ÷ÒªÓÃÀ´¹ÜÀíÔªÊý¾Ý(ÔªÊý¾Ý´æ´¢ÔÚÖ»ÓÐÒ»¸ötabletµÄcatalog
tableÖÐ)£¬¼´tabletÓë±íµÄ»ù±¾ÐÅÏ¢£¬¼àÌýtserverµÄ״̬
Catalog Table: ÔªÊý¾Ý±í£¬ÓÃÀ´´æ´¢table(schema¡¢locations¡¢states)Óëtablet£¨ÏÖÓеÄtabletÁÐ±í£¬Ã¿¸ötablet¼°Æä¸±±¾Ëù´¦tserver£¬tabletµ±Ç°×´Ì¬ÒÔ¼°¿ªÊ¼ºÍ½áÊø¼ü£©µÄÐÅÏ¢¡£
3¡¢´æ´¢»úÖÆ
3.1 ´æ´¢½á¹¹È«¾°Í¼

3.2¡¢´æ´¢½á¹¹½âÎö
Ò»¸öTable°üº¬¶à¸öTablet£¬ÆäÖÐTabletµÄÊýÁ¿ÊǸù¾Ýhash»òÕßrange½øÐÐÉèÖÃ
Ò»¸öTabletÖаüº¬MetaDataÐÅÏ¢ºÍ¶à¸öRowSetÐÅÏ¢
Ò»¸öRowsetÖаüº¬Ò»¸öMemRowSetÓë0¸ö»ò¶à¸öDiskRowset£¬ÆäÖÐMemRowSet´æ´¢insertµÄÊý¾Ý£¬Ò»µ©MemRowSetдÂú»áflushµ½´ÅÅÌÉú³ÉÒ»¸ö»ò¶à¸öDiskRowSet£¬´ËʱMemRowSetÇå¿Õ¡£MemRowSetĬÈÏдÂú1G»òÕß120s
flushÒ»´Î
(×¢Òâ:memRowSetÊÇÐÐʽ´æ´¢£¬DiskRowSetÊÇÁÐʽ´æ´¢£¬MemRowSet»ùÓÚprimary
keyÓÐÐò)¡£Ã¿¸ôtabletÖлᶨÆÚ¶ÔһЩdiskrowset×öcompaction²Ù×÷£¬Ä¿µÄÊǶԶà¸ödiskRowSet½øÐÐÖØÐÂÅÅÐò£¬ÒÔ´ËÀ´Ê¹Æä¸üÓÐÐò²¢¼õÉÙdiskRowSetµÄÊýÁ¿£¬Í¬Ê±ÔÚcompactionµÄ¹ý³ÌÖлۻÛresolveµôdeltaStoresµ±ÖеÄdelete¼Ç¼
Ò»¸öDiskRowSet°üº¬baseDataÓëDeltaStoresÁ½²¿·Ö£¬ÆäÖÐbaseData´æ´¢µÄÊý¾Ý¿´ÆðÀ´²»¿É¸Ä±ä£¬DeltaStoresÖд洢µÄÊǸıäµÄÊý¾Ý
DeltaStores°üº¬Ò»¸öDeltaMemStoresºÍ¶à¸öDeltaFile,ÆäÖÐDeltaMemStores·ÅÔÚÄڴ棬ÓÃÀ´´æ´¢updateÓëdeleteÊý¾Ý£¬Ò»µ©DeltaMemStoresдÂú£¬»áflush³ÉDeltaFile¡£
µ±DeltaFile¹ý¶à»áÓ°Ïì²éѯÐÔÄÜ£¬ËùÒÔKUDUÿ¸ôÒ»¶Îʱ¼ä»áÖ´ÐÐcompaction²Ù×÷£¬½«ÆäºÏ²¢µ½baseDataÖУ¬Ö÷ÒªÊÇresolveµôupdateÊý¾Ý¡£
4¡¢kuduµÄ¹¤×÷»úÖÆ
4.1¡¢¸ÅÊö
1¡¢kuduÖ÷Òª½ÇÉ«·ÖΪmasterÓëtserver
2¡¢masterÖ÷Òª¸ºÔð:¹ÜÀíÔªÊý¾ÝÐÅÏ¢£¬¼àÌýserver£¬µ±serverå´»úºó¸ºÔðtabletµÄÖØ·ÖÅä
3¡¢tserverÖ÷Òª¸ºÔðtabletµÄ´æ´¢ÓëºÍÊý¾ÝµÄÔöɾ¸Ä²é
4.2 ÄÚ²¿ÊµÏÖÔÀíͼ

4.2¡¢¶ÁÁ÷³Ì
4.2.1¡¢¸ÅÊö
¿Í»§¶Ë½«Òª¶ÁÈ¡µÄÊý¾ÝÐÅÏ¢·¢Ë͸ømaster£¬master¶ÔÆä½øÐÐÒ»¶¨µÄУÑ飬±ÈÈç±íÊÇ·ñ´æÔÚ£¬×Ö¶ÎÊÇ·ñ´æÔÚ¡£Master·µ»ØÔªÊý¾ÝÐÅÏ¢¸øclient£¬È»ºóclientÓëtserver½¨Á¢Á¬½Ó£¬Í¨¹ýmetaDataÕÒµ½Êý¾ÝËùÔÚµÄRowSet£¬Ê×ÏȼÓÔØÄÚ´æÀïÃæµÄÊý¾Ý(MemRowSetÓëDeltMemStore),È»ºó¼ÓÔØ´ÅÅÌÀïÃæµÄÊý¾Ý£¬×îºó·µ»Ø×îÖÕÊý¾Ý¸øclient.
4.2.2¡¢Ïêϸ²½Öèͼ

4.2.3¡¢Ïêϸ²½Öè½âÎö
1¡¢¿Í»§¶ËmasterÇëÇó²éѯ±íÖ¸¶¨Êý¾Ý
2¡¢master¶ÔÇëÇó½øÐÐУÑ飬УÑé±íÊÇ·ñ´æÔÚ£¬schemaÖÐÊÇ·ñ´æÔÚÖ¸¶¨²éѯµÄ×ֶΣ¬Ö÷¼üÊÇ·ñ´æÔÚ
3¡¢masterͨ¹ý²éѯcatalog Table·µ»Ø±í£¬½«tablet¶ÔÓ¦µÄtserverÐÅÏ¢¡¢tserver״̬µÈÔªÊý¾ÝÐÅÏ¢·µ»Ø¸øclient
4¡¢clientÓëtserver½¨Á¢Á¬½Ó£¬Í¨¹ýmetaDataÕÒµ½primary
key¶ÔÓ¦µÄRowSet¡£
5¡¢Ê×ÏȼÓÔØRowSetÄÚ´æÖÐMemRowSetÓëDeltMemStoreÖеÄÊý¾Ý
6¡¢È»ºó¼ÓÔØ´ÅÅÌÖеÄÊý¾Ý£¬Ò²¾ÍÊÇDiskRowSetÖеÄBaseDataÓëDeltFileÖеÄÊý¾Ý
7¡¢·µ»ØÊý¾Ý¸øClient
8¡¢¼ÌÐø4-7²½Ö裬ֱµ½Äõ½ËùÓÐÊý¾Ý·µ»Ø¸øclient
4.3¡¢InsertÁ÷³Ì
4.3.1¡¢¸ÅÊö
ClientÊ×ÏÈÁ¬½Ómaster£¬»ñȡԪÊý¾ÝÐÅÏ¢¡£È»ºóÁ¬½Ótserver£¬²éÕÒMemRowSetÓëDeltMemStoreÖÐÊÇ·ñ´æÔÚÏàͬprimary
key£¬Èç¹û´æÔÚ£¬Ôò±¨´í;Èç¹û²»´æÔÚ£¬Ôò½«´ý²åÈëµÄÊý¾ÝдÈëWALÈÕÖ¾£¬È»ºó½«Êý¾ÝдÈëMemRowSet¡£
4.3.2¡¢Ïêϸ²½Öèͼ

4.3.3¡¢Ïêϸ²½Öè½âÎö
1¡¢clientÏòmasterÇëÇóԤд±íµÄÔªÊý¾ÝÐÅÏ¢
2¡¢master»á½øÐÐÒ»¶¨µÄУÑ飬±íÊÇ·ñ´æÔÚ£¬×Ö¶ÎÊÇ·ñ´æÔÚµÈ
3¡¢Èç¹ûmasterУÑéͨ¹ý£¬Ôò·µ»Ø±íµÄ·ÖÇø¡¢tabletÓëÆä¶ÔÓ¦µÄtserver¸øclient£»Èç¹ûУÑéʧ°ÜÔò±¨´í¸øclient¡£
4¡¢client¸ù¾Ýmaster·µ»ØµÄÔªÊý¾ÝÐÅÏ¢£¬½«ÇëÇó·¢Ë͸øtablet¶ÔÓ¦µÄtserver.
5¡¢tserverÊ×ÏÈ»á²éѯÄÚ´æÖÐMemRowSetÓëDeltMemStoreÖÐÊÇ·ñ´æÔÚÓë´ý²åÈëÊý¾ÝÖ÷¼üÏàͬµÄÊý¾Ý£¬Èç¹û´æÔÚÔò±¨´í
6¡¢tserver»á½²Ð´ÇëÇóԤдµ½WALÈÕÖ¾£¬ÓÃÀ´serverå´»úºóµÄ»Ö¸´²Ù×÷
7¡¢½«Êý¾ÝдÈëÄÚ´æÖеÄMemRowSetÖУ¬Ò»µ©MemRowSetµÄ´óС´ïµ½1G»ò120sºó£¬MemRowSet»áflush³ÉÒ»¸ö»òDiskRowSet,ÓÃÀ´½«Êý¾Ý³Ö¾Ã»¯
8¡¢·µ»ØclientÊý¾Ý´¦ÀíÍê±Ï
4.4¡¢Êý¾Ý¸üÐÂÁ÷³Ì
4.4.1¡¢¸ÅÊö
ClientÊ×ÏÈÏòmasterÇëÇóÔªÊý¾Ý£¬È»ºó¸ù¾ÝÔªÊý¾ÝÌṩµÄtabletÐÅÏ¢£¬Á¬½Ótserver£¬¸ù¾ÝÊý¾ÝËù´¦Î»ÖõIJ»Í¬£¬Óв»Í¬µÄ²Ù×÷:ÔÚÄÚ´æMemRowSetÖеÄÊý¾Ý£¬»á½«¸üÐÂÐÅϢдÈëÊý¾ÝËùÔÚÐеÄmutationÁ´±íÖУ»ÔÚ´ÅÅÌÖеÄÊý¾Ý£¬»á½«¸üÐÂÐÅϢдÈëDeltMemStoreÖС£
4.4.2¡¢Ïêϸ²½Öèͼ

4.4.3¡¢Ïêϸ²½Öè½âÎö
1¡¢clientÏòmasterÇëÇóÔ¤¸üбíµÄÔªÊý¾Ý£¬Ê×ÏÈmaster»áУÑé±íÊÇ·ñ´æÔÚ£¬×Ö¶ÎÊÇ·ñ´æÔÚ£¬Èç¹ûУÑéͨ¹ýÔò»á·µ»Ø¸øclient±íµÄ·ÖÇø¡¢tablet¡¢tabletËùÔÚtserverÐÅÏ¢
2¡¢clientÏòtserver·¢Æð¸üÐÂÇëÇó
3¡¢½«¸üвÙ×÷ԤдÈçWALÈÕÖ¾£¬ÓÃÀ´ÔÚserverå´»úºóµÄÊý¾Ý»Ö¸´
4¡¢¸ù¾ÝtserverÖдý¸üеÄÊý¾ÝËù´¦Î»ÖõIJ»Í¬£¬Óв»Í¬µÄ´¦Àí·½Ê½:
Èç¹ûÊý¾ÝÔÚÄÚ´æÖУ¬Ôò´ÓMemRowSetÖÐÕÒµ½Êý¾ÝËù´¦µÄÐУ¬È»ºóÔÚ¸ÄÐеÄmutationÁ´±íÖÐдÈë¸üÐÂÐÅÏ¢£¬ÔÚMemRowSet
flushµÄʱºò£¬½«¸üкϲ¢µ½baseDataÖÐ
Èç¹ûÊý¾ÝÔÚDiskRowSetÖУ¬Ôò½«¸üÐÂÐÅϢдÈëDeltMemStoreÖУ¬DeltMemStore´ïµ½Ò»¶¨´óСºó»áflush³ÉDeltFile¡£
5¡¢¸üÐÂÍê±Ïºó·µ»ØÏûÏ¢¸øclient¡£
5¡¢KUDUµÄjava²Ù×÷
5.1¡¢µ¼ÈëÒÀÀµ
<dependency> <groupId>org.apache.kudu</groupId>
<artifactId>kudu-client</artifactId>
<version>${kudu.version}</version>
<scope>test</scope> </dependency>
<!--µ¼ÈëkuduµÄ¿Í»§¶Ë¹¤¾ß--> <dependency>
<groupId>org.apache.kudu</groupId>
<artifactId>kudu-client-tools</artifactId>
<version>${kudu.version}</version>
</dependency> |
5.2¡¢API
5.2.1¡¢±í´´½¨
/**
* ´´½¨±í
* @throws Exception
*/
public static void createTable() throws Exception{
//1¡¢´´½¨Ò»¸öclient
KuduClient client new KuduClientBuilder(KUDU_MASTER).build();
//2¡¢´´½¨schemaÐÅÏ¢
List<ColumnSchema> columns = new ArrayList<ColumnSchema>();
columns.add (new ColumnSchema.ColumnSchemaBuilder
("id", Type.INT32).key(true).nullable(false).build());
columns.add(new ColumnSchema.ColumnSchemaBuilder
("name", Type.STRING).key(false).nullable(false).build());
columns.add(new ColumnSchema.ColumnSchemaBuilder("age",
Type.INT32).key(false).nullable(false).build());
Schema schema = new Schema(columns);
//3¡¢Ö¸¶¨·ÖÇø×Ö¶Î
List<String> partions = new ArrayList<String>();
partions.add("id");
//4¡¢Ö¸¶¨·ÖÇø·½Ê½Îªhash·ÖÇø¡¢6¸ö·ÖÇø£¬Ò»¸ö¸±±¾
CreateTableOptions options = new CreateTableOptions().addHashPartitions(partions,
6).setNumReplicas(1);
//5¡¢´´½¨±í£¬
client.createTable("person",schema,options);
client.close();
} |
5.2.2¡¢Insert
/**
* ²åÈëÊý¾Ý
* @throws Exception
*/
public static void add() throws Exception{
//1¡¢´´½¨Ò»¸öclient
KuduClient client = new KuduClientBuilder(KUDU_MASTER).build();
//2¡¢´ò¿ª±í
KuduTable table = client.openTable("person");
//3¡¢´´½¨Ò»¸ösession»á»°
KuduSession session = client.newSession();
//4¡¢´´½¨²åÈë
Insert insert = table.newInsert();
//5¡¢Ö¸¶¨²åÈëÊý¾Ý
insert.getRow().addInt("id",1);
insert.getRow().addInt("age",18);
insert.getRow().addString("name","ÕÅÈý");
//6¡¢Ó¦ÓòåÈë
session.apply(insert);
session.close();
client.close();
} |
5.2.3¡¢update
/**
* ¸üÐÂÊý¾Ý
* @throws Exception
*/
public static void update() throws Exception{
//1¡¢´´½¨kudu client
KuduClient client = new KuduClientBuilder (KUDU_MASTER).build();
//2¡¢´ò¿ª±í
KuduTable table = client.openTable ("person");
KuduSession session = client.newSession();
Update update = table.newUpdate();
update.getRow().addInt("id",1);
update.getRow().addString("name","ÀîËÄ");
session.apply(update);
session.flush();
session.close();
client.close();
} |
5.2.4¡¢delete
/**
* ɾ³ýÊý¾Ý
* @throws Exception
*/
public static void delete() throws Exception{
//1¡¢´´½¨kudu client
KuduClient client = new KuduClientBuilder(KUDU_MASTER).build();
//2¡¢´ò¿ª±í
KuduTable table = client.openTable("person");
KuduSession session = client.newSession();
Delete delete = table.newDelete();
delete.getRow().addInt("id",1); session.apply(delete);
session.flush();
session.close();
client.close();
} |
5.2.5¡¢query
/**
* Ìõ¼þ²éѯ select * from person where id=1
* @throws Exception
*/
public static void query() throws Exception{
//1¡¢´´½¨kudu client
KuduClient client = new KuduClientBuilder (KUDU_MASTER).build();
//2¡¢´ò¿ª±í
KuduTable table = client.openTable("person");
//3¡¢´´½¨scannerɨÃèÆ÷
KuduScanner.KuduScannerBuilder kuduScannerBuilder
= client.newScannerBuilder(table);
//4¡¢´´½¨²éѯÌõ¼þ
KuduPredicate filter = KuduPredicate.newComparisonPredicate
(table.getSchema( ).getColumn("id"),
KuduPredicate.ComparisonOp.EQUAL, 1);
//5¡¢½«²éѯÌõ¼þ¼ÓÈëµ½scannerÖÐ
KuduScanner scanner = kuduScannerBuilder.addPredicate (filter).build();
//6¡¢»ñÈ¡²éѯ½á¹û
while (scanner.hasMoreRows()){
RowResultIterator rows = scanner.nextRows();
while (rows.hasNext()){
RowResult row = rows.next();
Integer id = row.getInt("id");
String name = row.getString("name");
int age = row.getInt ("age");
System.out.println (id+"---"+name+"---"+age);
}
}
//7¡¢¹Ø±Õclient
client.close();
} |
|