±à¼ÍƼö: |
±¾ÎĽ«½éÉÜApache
HudiµÄ»ù±¾¸ÅÄî¡¢Éè¼ÆÒÔ¼°×ÜÌå»ù´¡¼Ü¹¹¡£
±¾ÎÄÀ´×ÔÓÚ΢ÐÅ Flink£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
1.¼ò½é
Apache Hudi(¼ò³Æ£ºHudi)ʹµÃÄúÄÜÔÚhadoop¼æÈݵĴ洢֮ÉÏ´æ´¢´óÁ¿Êý¾Ý£¬Í¬Ê±Ëü»¹ÌṩÁ½ÖÖÔÓʹµÃ³ýÁ˾µäµÄÅú´¦ÀíÖ®Í⣬»¹¿ÉÒÔÔÚÊý¾ÝºþÉϽøÐÐÁ÷´¦Àí¡£
ÕâÁ½ÖÖÔÓï·Ö±ðÊÇ£º
Update/Delete¼Ç¼£ºHudiʹÓÃϸÁ£¶ÈµÄÎļþ/¼Ç¼¼¶±ðË÷ÒýÀ´Ö§³ÖUpdate/Delete¼Ç¼£¬Í¬Ê±»¹Ìṩд²Ù×÷µÄÊÂÎñ±£Ö¤¡£²éѯ»á´¦Àí×îºóÒ»¸öÌá½»µÄ¿ìÕÕ£¬²¢»ùÓÚ´ËÊä³ö½á¹û¡£
±ä¸üÁ÷£ºHudi¶Ô»ñÈ¡Êý¾Ý±ä¸üÌṩÁËÒ»Á÷µÄÖ§³Ö£º¿ÉÒÔ´Ó¸ø¶¨µÄʱ¼äµã»ñÈ¡¸ø¶¨±íÖÐÒÑupdated/inserted/deletedµÄËùÓмǼµÄÔöÁ¿Á÷£¬²¢½âËøÐµIJéѯ×ËÊÆ£¨Àà±ð£©¡£

ÕâЩÔÓï½ôÃܽáºÏ£¬½âËøÁË»ùÓÚDFS³éÏóµÄÁ÷/ÔöÁ¿´¦ÀíÄÜÁ¦¡£Èç¹ûÄúÊìϤÁ÷´¦Àí£¬ÄÇôÕâºÍ´ÓkafkaÖ÷ÌâÏû·Ñʼþ£¬È»ºóʹÓÃ״̬´æ´¢Öð²½ÀÛ¼ÓÖмä½á¹ûÀàËÆ¡£
ÕâÔڼܹ¹ÉÏ»áÓÐÒÔϼ¸µãÓÅÊÆ£º
1£© ЧÂʵÄÌáÉý£ºÉãÈ¡Êý¾Ýͨ³£ÐèÒª´¦Àí¸üС¢É¾³ýÒÔ¼°Ç¿ÖÆÎ¨Ò»¼üÔ¼Êø¡£È»¶ø£¬ÓÉÓÚȱ·¦ÏñHudiÕâÑùÄܶÔÕâЩ¹¦ÄÜÌṩ±ê×¼Ö§³ÖµÄϵͳ£¬Êý¾Ý¹¤³ÌʦÃÇͨ³£»á²ÉÓôóÅúÁ¿µÄ×÷ÒµÀ´ÖØÐ´¦ÀíÒ»ÕûÌìµÄʼþ£¬»òÕßÿ´ÎÔËÐж¼ÖØÐ¼ÓÔØÕû¸öÉÏÓÎÊý¾Ý¿â£¬´Ó¶øµ¼Ö´óÁ¿µÄ¼ÆËã×ÊÔ´ÀË·Ñ¡£ÓÉÓÚHudiÖ§³Ö¼Ç¼¼¶¸üУ¬Ëüͨ¹ýÖ»´¦ÀíÓбä¸üµÄ¼Ç¼²¢ÇÒÖ»ÖØÐ´±íÖÐÒѸüÐÂ/ɾ³ýµÄ²¿·Ö£¬¶ø²»ÊÇÖØÐ´Õû¸ö±í·ÖÇøÉõÖÁÕû¸ö±í£¬ÎªÕâЩ²Ù×÷´øÀ´Ò»¸öÊýÁ¿¼¶µÄÐÔÄÜÌáÉý¡£
2£© ¸ü¿ìµÄETL/ÅÉÉúPipelines£º´ÓÍⲿϵͳÉãÈëÊý¾Ýºó£¬ÏÂÒ»²½ÐèҪʹÓÃApache Spark/Apache
Hive»òÕßÈÎºÎÆäËûÊý¾Ý´¦Àí¿ò¼ÜÀ´ETLÕâЩÊý¾ÝÓÃÓÚÖîÈçÊý¾Ý²Ö¿â¡¢»úÆ÷ѧϰ»òÕß½ö½öÊÇÊý¾Ý·ÖÎöµÈһЩӦÓó¡¾°¡£Í¨³££¬ÕâЩ´¦ÀíÔÙ´ÎÒÀÀµÒÔ´úÂë»òSQL±íʾµÄÅú´¦Àí×÷Òµ£¬ÕâЩ×÷Òµ½«ÅúÁ¿´¦ÀíËùÓÐÊäÈëÊý¾Ý²¢ÖØÐ¼ÆËãËùÓÐÊä³ö½á¹û¡£Í¨¹ýʹÓÃÔöÁ¿²éѯ¶ø²»ÊÇ¿ìÕÕ²éѯÀ´²éѯһ¸ö»ò¶à¸öÊäÈë±í£¬¿ÉÒÔ´ó´ó¼ÓËÙ´ËÀàÊý¾Ý¹ÜµÀ£¬´Ó¶øÔÙ´ÎÏñÉÏÃæÒ»Ñù½ö´¦ÀíÀ´×ÔÉÏÓαíµÄÔöÁ¿¸ü¸Ä£¬È»ºóupsert»òÕßdeleteÄ¿±êÅÉÉú±í¡£
3£© ÐÂÏÊÊý¾ÝµÄ»ñÈ¡£º¼õÉÙ×ÊÔ´»¹ÄÜ»ñÈ¡ÐÔÄÜÉϵÄÌáÉý²¢²»Êdz£¼ûµÄÊ¡£±Ï¾¹ÎÒÃÇͨ³£»áʹÓøü¶àµÄ×ÊÔ´£¨ÀýÈçÄڴ棩À´ÌáÉýÐÔÄÜ£¨ÀýÈç²éѯÑÓ³Ù£©¡£Hudiͨ¹ý´Ó¸ù±¾ÉϰÚÍÑÊý¾Ý¼¯µÄ´«Í³¹ÜÀí·½Ê½£¬½«ÅúÁ¿´¦ÀíÔöÁ¿»¯´øÀ´ÁËÒ»¸ö¸½¼ÓµÄºÃ´¦£ºÓëÒÔǰµÄÊý¾ÝºþÏà±È£¬pipelineÔËÐеÄʱ¼ä»á¸ü¶Ì£¬Êý¾Ý½»¸¶»á¸ü¿ì¡£
4£© ͳһ´æ´¢£º»ùÓÚÒÔÉÏÈý¸öÓŵ㣬ÔÚÏÖÓÐÊý¾ÝºþÖ®ÉϽøÐиü¿ìËÙ¡¢¸üÇáÁ¿µÄ´¦ÀíÒâζ׎ö³öÓÚ·ÃÎʽüʵʱÊý¾ÝµÄÄ¿µÄʱ²»ÔÙÐèҪרÃŵĴ洢»òÊý¾Ý¼¯ÊС£
2.Éè¼ÆÔÔò
Á÷ʽ¶Á/д:Hudi½è¼øÁËÊý¾Ý¿âÉè¼ÆµÄÔÀí£¬´ÓÁãÉè¼Æ£¬Ó¦ÓÃÓÚ´óÐÍÊý¾Ý¼¯¼Ç¼Á÷µÄÊäÈëºÍÊä³ö¡£Îª´Ë£¬HudiÌṩÁËË÷ÒýʵÏÖ£¬¿ÉÒÔ½«¼Ç¼µÄ¼ü¿ìËÙÓ³Éäµ½ÆäËùÔÚµÄÎļþλÖá£Í¬Ñù£¬¶ÔÓÚÁ÷ʽÊä³öÊý¾Ý£¬Hudiͨ¹ýÆäÌØÊâÁÐÌí¼Ó²¢¸ú×ټǼ¼¶µÄÔªÊý¾Ý£¬´Ó¶ø¿ÉÒÔÌṩËùÓз¢Éú±ä¸üµÄ¾«È·ÔöÁ¿Á÷¡£
×Ô¹ÜÀí£ºHudi×¢Òâµ½Óû§¿ÉÄܶÔÊý¾ÝÐÂÏʶȣ¨Ð´ÓѺã©Óë²éѯÐÔÄÜ£¨¶Á/²éѯÓѺã©Óв»Í¬µÄÆÚÍû£¬ËüÖ§³ÖÁËÈýÖÖ²éѯÀàÐÍ£¬ÕâЩÀàÐÍÌṩʵʱ¿ìÕÕ£¬ÔöÁ¿Á÷ÒÔ¼°ÉÔÔçµÄ´¿ÁÐÊý¾Ý¡£ÔÚÿһ²½£¬Hudi¶¼Å¬Á¦×öµ½×ÔÎÒ¹ÜÀí£¨ÀýÈç×Ô¶¯ÓÅ»¯±àд³ÌÐòµÄ²¢ÐÐÐÔ£¬±£³ÖÎļþ´óС£©ºÍ×ÔÎÒÐÞ¸´£¨ÀýÈ磺×Ô¶¯»Ø¹öʧ°ÜµÄÌá½»£©£¬¼´Ê¹ÕâÑù×ö»áÉÔ΢Ôö¼ÓÔËÐÐʱ³É±¾£¨ÀýÈ磺ÔÚÄÚ´æÖлº´æÊäÈëÊý¾ÝÒÑ·ÖÎö¹¤×÷¸ºÔØ£©¡£Èç¹ûûÓÐÕâЩÄÚÖõIJÙ×÷¸Ü¸Ë/×ÔÎÒ¹ÜÀí¹¦ÄÜ£¬ÕâЩ´óÐÍÁ÷Ë®ÏßµÄÔËÓª³É±¾Í¨³£»á·±¶¡£
ÍòÎï½ÔÈÕÖ¾:Hudi»¹¾ßÓÐ append only¡¢ÔÆÊý¾ÝÓѺõÄÉè¼Æ£¬¸ÃÉè¼ÆÊµÏÖÁËÈÕÖ¾½á¹¹»¯´æ´¢ÏµÍ³µÄÔÀí£¬¿ÉÒÔÎÞ·ì¹ÜÀíËùÓÐÔÆÌṩÉ̵ÄÊý¾Ý¡£
¼ü-ÖµÊý¾ÝÄ£ÐÍ£ºÔÚд·½Ã棬Hudi±í±»½¨Ä£Îª¼üÖµ¶ÔÊý¾Ý¼¯£¬ÆäÖÐÿÌõ¼Ç¼¶¼ÓÐÒ»¸öΨһµÄ¼Ç¼¼ü¡£´ËÍ⣬һ¸ö¼Ç¼¼ü»¹¿ÉÒÔ°üÀ¨·ÖÇøÂ·¾¶£¬Ôڸ÷¾¶Ï£¬¿ÉÒԶԼǼ½øÐзÖÇøºÍ´æ´¢¡£Õâͨ³£ÓÐÖúÓÚ¼õÉÙË÷Òý²éѯµÄËÑË÷¿Õ¼ä¡£
3. ±íÉè¼Æ
Á˽âÁËHudiÏîÄ¿µÄ¹Ø¼ü¼¼Êõ¶¯»úºó£¬ÏÖÔÚÈÃÎÒÃǸüÉîÈëµØÑо¿Hudiϵͳ±¾ÉíµÄÉè¼Æ¡£ÔڽϸߵIJã´ÎÉÏ£¬ÓÃÓÚдHudi±íµÄ×é¼þʹÓÃÁËÒ»ÖÖÊÜÖ§³ÖµÄ·½Ê½Ç¶Èëµ½Apache
Spark×÷ÒµÖУ¬Ëü»áÔÚÖ§³ÖDFSµÄ´æ´¢ÉÏÉú³É´ú±íHudi±íµÄÒ»×éÎļþ¡£È»ºó£¬ÔÚ¾ßÓÐÒ»¶¨±£Ö¤µÄÇé¿öÏ£¬ÖîÈçApache
Spark¡¢Presto¡¢Apache HiveÖ®ÀàµÄ²éѯÒýÇæ¿ÉÒÔ²éѯ¸Ã±í¡£
Hudi±íµÄÈý¸öÖ÷Òª×é¼þ£º
1£© ÓÐÐòµÄʱ¼äÖáÔªÊý¾Ý¡£ÀàËÆÓÚÊý¾Ý¿âÊÂÎñÈÕÖ¾¡£
2£© ·Ö²ã²¼¾ÖµÄÊý¾ÝÎļþ£ºÊµ¼ÊдÈë±íÖеÄÊý¾Ý¡£
3£© Ë÷Òý£¨¶àÖÖʵÏÖ·½Ê½£©£ºÓ³Éä°üº¬Ö¸¶¨¼Ç¼µÄÊý¾Ý¼¯¡£

HudiÌṩÁËÒÔϹ¦ÄÜÀ´¶Ô»ù´¡Êý¾Ý½øÐÐдÈë¡¢²éѯ£¬ÕâʹÆä³ÉΪ´óÐÍÊý¾ÝºþµÄÖØÒªÄ£¿é£º
1£© Ö§³Ö¿ìËÙ£¬¿É²å°ÎË÷ÒýµÄupsert();
2£© ¸ßЧ¡¢Ö»É¨ÃèÐÂÊý¾ÝµÄÔöÁ¿²éѯ£»
3£© Ô×ÓÐÔµÄÊý¾Ý·¢²¼ºÍ»Ø¹ö£¬Ö§³Ö»Ö¸´µÄSavepoint£»
4£© ʹÓÃmvcc(¶à°æ±¾²¢·¢¿ØÖÆ)·ç¸ñÉè¼ÆµÄ¶ÁºÍд¿ìÕÕ¸ôÀ룻
5£© ʹÓÃͳ¼ÆÐÅÏ¢¹ÜÀíÎļþ´óС£»
6£© ÒÑÓмǼupdate/deltaµÄ×Ô¹ÜÀíѹËõ£»
7£© ÉóºËÊý¾ÝÐ޸ĵÄʱ¼äÖáÔªÊý¾Ý£»
8£© Âú×ãGDPR(ͨÓÃÊý¾Ý±£»¤ÌõÀý)¡¢Êý¾Ýɾ³ý¹¦ÄÜ¡£
3.1 ʱ¼äÖá
ÔÚÆäºËÐÄ£¬Hudiά»¤ÁËÒ»Ìõ°üº¬ÔÚ²»Í¬µÄ¼´Ê±Ê±¼ä£¨instant time£©¶ÔÊý¾Ý¼¯×öµÄËùÓÐinstant²Ù×÷µÄtimeline£¬´Ó¶øÌṩ±íµÄ¼´Ê±ÊÓͼ£¬Í¬Ê±»¹ÓÐЧ֧³Ö°´µ½´ï˳Ðò½øÐÐÊý¾Ý¼ìË÷¡£Ê±¼äÖáÀàËÆÓÚÊý¾Ý¿âµÄredo/transactionÈÕÖ¾£¬ÓÉÒ»×éʱ¼äÖáʵÀý×é³É¡£Hudi±£Ö¤ÔÚʱ¼äÖáÉÏÖ´ÐеIJÙ×÷µÄÔ×ÓÐԺͻùÓÚ¼´Ê±Ê±¼äµÄʱ¼äÖáÒ»ÖÂÐÔ¡£Ê±¼äÖᱻʵÏÖΪ±í»ù´¡Â·¾¶ÏÂ.hoodieÔªÊý¾ÝÎļþ¼ÐϵÄÒ»×éÎļþ¡£¾ßÌåÀ´Ëµ£¬×îеÄinstant±»±£´æÎªµ¥¸öÎļþ£¬¶ø½Ï¾ÉµÄinstant±»´æµµµ½Ê±¼äÖá¹éµµÎļþ¼ÐÖУ¬ÒÔÏÞÖÆwritersºÍqueriesÁгöµÄÎļþÊýÁ¿¡£
Ò»¸öHudi ʱ¼äÖáinstantÓÉÏÂÃæ¼¸¸ö×é¼þ¹¹³É£º
1£© ²Ù×÷ÀàÐÍ£º¶ÔÊý¾Ý¼¯Ö´ÐеIJÙ×÷ÀàÐÍ£»
2£© ¼´Ê±Ê±¼ä£º¼´Ê±Ê±¼äͨ³£ÊÇÒ»¸öʱ¼ä´Á(ÀýÈ磺20190117010349)£¬¸Ãʱ¼ä´Á°´²Ù×÷¿ªÊ¼Ê±¼äµÄ˳Ðòµ¥µ÷Ôö¼Ó£»
3£© ¼´Ê±×´Ì¬£ºinstantµÄµ±Ç°×´Ì¬;
ÿ¸öinstant¶¼ÓÐavro»òÕßjson¸ñʽµÄÔªÊý¾ÝÐÅÏ¢£¬ÏêϸµÄÃèÊöÁ˸òÙ×÷µÄ״̬ÒÔ¼°Õâ¸ö¼´Ê±Ê±¿ÌinstantµÄ״̬¡£
¹Ø¼üµÄInstant²Ù×÷ÀàÐÍÓУº
1£© COMMIT£ºÒ»´ÎÌá½»±íʾ½«Ò»×é¼Ç¼Ô×ÓдÈëµ½Êý¾Ý¼¯ÖУ»
2£© CLEAN: ɾ³ýÊý¾Ý¼¯Öв»ÔÙÐèÒªµÄ¾ÉÎļþ°æ±¾µÄºǫ́»î¶¯;
3£© DELTA_COMMIT:½«Ò»Åú¼Ç¼Ô×ÓдÈëµ½MergeOnRead´æ´¢ÀàÐ͵ÄÊý¾Ý¼¯ÖУ¬ÆäÖÐһЩ/ËùÓÐÊý¾Ý¶¼¿ÉÒÔֻдµ½ÔöÁ¿ÈÕÖ¾ÖÐ;
4£© COMPACTION: е÷HudiÖвîÒìÊý¾Ý½á¹¹µÄºǫ́»î¶¯£¬ÀýÈ磺½«¸üдӻùÓÚÐеÄÈÕÖ¾Îļþ±ä³ÉÁиñʽ¡£ÔÚÄÚ²¿£¬Ñ¹Ëõ±íÏÖΪʱ¼äÖáÉϵÄÌØÊâÌá½»;
5£© ROLLBACK: ±íʾÌá½»/ÔöÁ¿Ìá½»²»³É¹¦ÇÒÒѻعö£¬É¾³ýÔÚдÈë¹ý³ÌÖвúÉúµÄËùÓв¿·ÖÎļþ;
6£© SAVEPOINT: ½«Ä³Ð©Îļþ×é±ê¼ÇΪ"Òѱ£´æ"£¬ÒÔ±ãÇåÀí³ÌÐò²»»á½«Æäɾ³ý¡£ÔÚ·¢ÉúÔÖÄÑ/Êý¾Ý»Ö¸´µÄÇé¿öÏ£¬ËüÓÐÖúÓÚ½«Êý¾Ý¼¯»¹Ôµ½Ê±¼äÖáÉϵÄij¸öµã;
Èκθø¶¨µÄ¼´Ê±¶¼»á´¦ÓÚÒÔÏÂ״̬֮һ£º
1£© REQUESTED:±íʾÒѵ÷¶Èµ«ÉÐδ³õʼ»¯£»
2£© INFLIGHT: ±íʾµ±Ç°ÕýÔÚÖ´ÐиòÙ×÷;
3£© COMPLETED: ±íʾÔÚʱ¼äÖáÉÏÍê³ÉÁ˸òÙ×÷.
3.2 Êý¾ÝÎļþ
Hudi½«±í×éÖ¯³ÉDFSÉÏ»ù±¾Â·¾¶ÏµÄÎļþ¼Ð½á¹¹ÖС£Èç¹û±íÊÇ·ÖÇøµÄ£¬ÔòÔÚ»ù±¾Â·¾¶Ï»¹»áÓÐÆäËûµÄ·ÖÇø£¬ÕâЩ·ÖÇøÊǰüº¬¸Ã·ÖÇøÊý¾ÝµÄÎļþ¼Ð£¬ÓëHive±í·Ç³£ÀàËÆ¡£Ã¿¸ö·ÖÇø¾ùÓÉÏà¶ÔÓÚ»ù±¾Â·¾¶µÄ·ÖÇøÂ·¾¶Î¨Ò»±êʶ¡£ÔÚÿ¸ö·ÖÇøÄÚ£¬Îļþ±»×éÖ¯³ÉÎļþ×飬ÓÉÎļþIDΨһ±êʶ¡£ÆäÖÐÿ¸öÇÐÆ¬°üº¬ÔÚij¸öÌá½»/ѹËõ¼´Ê±Ê±¼äÉú³ÉµÄ»ù±¾ÁÐÎļþ£¨*.parquet£©ÒÔ¼°Ò»×éÈÕÖ¾Îļþ£¨*.log*£©£¬¸ÃÎļþ°üº¬×ÔÉú³É»ù±¾ÎļþÒÔÀ´¶Ô»ù±¾ÎļþµÄ²åÈë/¸üС£Hudi²ÉÓÃÁËMVCCÉè¼Æ£¬Ñ¹Ëõ²Ù×÷»á½«ÈÕÖ¾ºÍ»ù±¾ÎļþºÏ²¢ÒÔ²úÉúеÄÎļþƬ£¬¶øÇåÀí²Ù×÷Ôò½«Î´Ê¹ÓõÄ/½Ï¾ÉµÄÎļþƬɾ³ýÒÔ»ØÊÕDFSÉϵĿռ䡣

3.3 Ë÷Òý
Hudiͨ¹ýË÷Òý»úÖÆÌṩ¸ßЧµÄupsert²Ù×÷£¬¸Ã»úÖÆ»á½«Ò»¸ö¼Ç¼¼ü+·ÖÇøÂ·¾¶×éºÏÒ»ÖÂÐÔµÄÓ³Éäµ½Ò»¸öÎļþID.Õâ¸ö¼Ç¼¼üºÍÎļþ×é/ÎļþIDÖ®¼äµÄÓ³Éä×ԼǼ±»Ð´ÈëÎļþ×鿪ʼ¾Í²»»áÔٸı䡣¼ò¶øÑÔÖ®£¬Õâ¸öÓ³ÉäÎļþ×é°üº¬ÁËÒ»×éÎļþµÄËùÓа汾¡£Hudiµ±Ç°ÌṩÁË3ÖÖË÷ÒýʵÏÖ£¨HBaseIndex,¡¢HoodieBloomIndex£¨HoodieGlobalBloomIndex£©¡¢InMemoryHashIndex£©À´Ó³ÉäÒ»¸ö¼Ç¼¼üµ½°üº¬¸Ã¼Ç¼µÄÎļþID¡£Õ⽫ʹÎÒÃÇÎÞÐèɨÃè±íÖеÄÿÌõ¼Ç¼£¬¾Í¿ÉÏÔÖøÌá¸ßupsertËÙ¶È¡£
HudiË÷Òý¿ÉÒÔ¸ù¾ÝÆä²éѯ·ÖÇø¼Ç¼µÄÄÜÁ¦½øÐзÖÀࣺ
1£© È«¾ÖË÷Òý£º²»ÐèÒª·ÖÇøÐÅÏ¢¼´¿É²éѯ¼Ç¼¼üÓ³ÉäµÄÎļþID¡£±ÈÈ磬д³ÌÐò¿ÉÒÔ´«Èënull»òÕßÈκÎ×Ö·û´®×÷Ϊ·ÖÇøÂ·¾¶£¨partitionPath£©,µ«Ë÷ÒýÈÔÈ»»á²éÕÒµ½¸Ã¼Ç¼µÄλÖá£È«¾ÖË÷ÒýÔڼǼ¼üÔÚÕûÕűíÖб£Ö¤Î¨Ò»µÄÇé¿öÏ·dz£ÓÐÓ㬵«ÊDzéѯµÄÏûºÄËæ×űíµÄ´óС³Êº¯ÊýʽÔö¼Ó¡£
2£© ·ÇÈ«¾ÖË÷Òý£ºÓëÈ«¾ÖË÷Òý²»Í¬£¬·ÇÈ«¾ÖË÷ÒýÒÀÀµ·ÖÇøÂ·¾¶(partitionPath),¶ÔÓÚ¸ø¶¨µÄ¼Ç¼¼ü£¬ËüÖ»»áÔÚ¸ø¶¨·ÖÇøÂ·¾¶Ï²éÕҸüǼ¡£Õâ±È½ÏÊʺÏ×ÜÊÇͬʱÉú³É·ÖÇøÂ·¾¶ºÍ¼Ç¼¼üµÄ³¡¾°£¬Í¬Ê±»¹ÄÜÏíÊܵ½¸üºÃµÄÀ©Õ¹ÐÔ£¬ÒòΪ²éѯË÷ÒýµÄÏûºÄÖ»ÓëдÈëµ½¸Ã·ÖÇøÏÂÊý¾Ý¼¯´óСÓйØÏµ¡£
4. ±íÀàÐÍ
4.1 Copy On Write±í
COW±íдµÄʱºòÊý¾ÝÖ±½ÓдÈëbasefile,£¨parquet£©²»Ð´logÎļþ¡£ËùÒÔCOW±íµÄÎļþƬֻ°üº¬basefile(Ò»¸öparquetÎļþ¹¹³ÉÒ»¸öÎļþƬ)¡£
ÕâÖֵĴ洢·½Ê½µÄSpark DAGÏà¶Ô¼òµ¥¡£¹Ø¼üÄ¿±êÊÇÊÇʹÓÃpartitioner½«tagged Hudi¼Ç¼RDD£¨ËùνµÄtaggedÊÇÖ¸ÒѾͨ¹ýË÷Òý²éѯ£¬±ê¼ÇÿÌõÊäÈë¼Ç¼ÔÚ±íÖеÄλÖã©·Ö³ÉһЩÁеÄupdatesºÍinserts.ΪÁËά»¤Îļþ´óС£¬ÎÒÃÇÏȶÔÊäÈë½øÐвÉÑù£¬»ñµÃÒ»¸ö¹¤×÷¸ºÔØprofile,Õâ¸öprofile¼Ç¼ÁËÊäÈë¼Ç¼µÄinsertºÍupdate¡¢ÒÔ¼°ÔÚ·ÖÇøÖеķֲ¼µÈÐÅÏ¢¡£°ÑÊý¾Ý´Óдò°ü£¬ÕâÑù£º
1£© ¶ÔÓÚupdates, ¸ÃÎļþIDµÄ×îа汾¶¼½«±»ÖØÐ´Ò»´Î£¬²¢¶ÔËùÓÐÒѸü¸ÄµÄ¼Ç¼ʹÓÃÐÂÖµ
2£© ¶ÔÓÚinserts.¼Ç¼Ê×ÏÈ´ò°üµ½Ã¿¸ö·ÖÇøÂ·¾¶ÖеÄ×îСÎļþÖУ¬Ö±µ½´ïµ½ÅäÖõÄ×î´ó´óС¡£Ö®ºóµÄËùÓÐÊ£Óà¼Ç¼½«Ôٴδò°üµ½ÐµÄÎļþ×飬еÄÎļþ×éÒ²»áÂú×ã×î´óÎļþ´óСҪÇó¡£

4.2 Merge On Read±í
MOR±íдÊý¾Ýʱ£¬¼Ç¼Ê×ÏȻᱻ¿ìËÙµÄд½øÈÕÖ¾Îļþ£¬ÉÔºó»áʹÓÃʱ¼äÖáÉϵÄѹËõ²Ù×÷½«ÆäÓë»ù´¡ÎļþºÏ²¢¡£¸ù¾Ý²éѯÊǶÁÈ¡ÈÕÖ¾Öеĺϲ¢¿ìÕÕÁ÷»¹ÊDZä¸üÁ÷£¬»¹Êǽö¶ÁȡδºÏ²¢µÄ»ù´¡Îļþ£¬MOR±íÖ§³Ö¶àÖÖ²éѯÀàÐÍ¡£
Ôڸ߲ã´ÎÉÏ£¬MOR writerÔÚ¶ÁÈ¡Êý¾Ýʱ»á¾ÀúÓëCOW writer ÏàͬµÄ½×¶Î¡£ÕâЩ¸üн«×·¼Óµ½×îÐÂÎļþƪµÄ×îÐÂÈÕÖ¾ÎļþÖУ¬¶ø²»»áºÏ²¢¡£
¶ÔÓÚinsert,HudiÖ§³ÖÁ½ÖÖģʽ£º
1£© ²åÈëµ½ÈÕÖ¾Îļþ£ºÓпÉË÷ÒýÈÕÖ¾ÎļþµÄ±í»áÖ´Ðд˲Ù×÷£¨HBaseË÷Òý£©£»
2£© ²åÈëparquetÎļþ£ºÃ»ÓÐË÷ÒýÎļþµÄ±í£¨ÀýÈ粼¡Ë÷Òý£©
Óëдʱ¸´ÖÆ£¨COW£©Ò»Ñù£¬¶ÔÒѱê¼ÇλÖõÄÊäÈë¼Ç¼½øÐзÖÇø£¬ÒԱ㽫ËùÓз¢ÍùÏàͬÎļþidµÄupsert·Öµ½Ò»×é¡£ÕâÅúupsert»á×÷Ϊһ¸ö»ò¶à¸öÈÕÖ¾¿éдÈëÈÕÖ¾Îļþ¡£HudiÔÊÐí¿Í»§¶Ë¿ØÖÆÈÕÖ¾Îļþ´óС¡£¶ÔÓÚдʱ¸´ÖÆ£¨COW£©ºÍ¶ÁʱºÏ²¢£¨MOR£©writerÀ´Ëµ£¬HudiµÄWriteClientÊÇÏàͬµÄ¡£¼¸ÂÖÊý¾ÝµÄдÈ뽫»áÀÛ»ýÒ»¸ö»ò¶à¸öÈÕÖ¾Îļþ¡£ÕâЩÈÕÖ¾ÎļþÓë»ù±¾µÄparquetÎļþ£¨ÈçÓУ©Ò»Æð¹¹³ÉÒ»¸öÎļþƬ£¬¶øÕâ¸öÎļþƬ´ú±í¸ÃÎļþµÄÒ»¸öÍêÕû°æ±¾¡£
ÕâÖÖ±íÊÇÓÃ;×î¹ã¡¢×î¸ß¼¶µÄ±í¡£ÎªÐ´£¨¿ÉÒÔÖ¸¶¨²»Í¬µÄѹËõ²ßÂÔ£¬ÎüÊÕÍ»·¢Ð´Á÷Á¿£©ºÍ²éѯ£¨ÀýÈçȨºâÊý¾ÝµÄÐÂÏʶȺͲéѯÐÔÄÜ£©ÌṩÁ˺ܴóµÄÁé»îÐÔ¡£Í¬Ê±Ëü°üº¬Ò»¸öѧϰÇúÏߣ¬ÒÔ±ãÔÚ²Ù×÷ÉÏÕÆ¿ØËû¡£

5. дÉè¼Æ
5.1 д²Ù×÷
Á˽âHudiÊý¾ÝÔ´»òÕßdeltastreamer¹¤¾ßÌṩµÄ3ÖÖ²»Í¬Ð´²Ù×÷ÒÔ¼°ÈçºÎ×îºÃµÄÀûÓÃËûÃÇ¿ÉÄÜ»áÓÐËù°ïÖú¡£ÕâЩ²Ù×÷¿ÉÒÔÔÚ¶ÔÊý¾Ý¼¯·¢³öµÄÿ¸öcommit/delta
commitÖнøÐÐÑ¡Ôñ/¸ü¸Ä¡£
1£© upsert²Ù×÷£ºÕâÊÇĬÈϲÙ×÷£¬ÔڸòÙ×÷ÖУ¬Ê×ÏÈͨ¹ý²éѯË÷Òý½«Êý¾Ý¼Ç¼±ê¼ÇΪ²åÈë»ò¸üУ¬È»ºóÔÙÔËÐÐÊÔ̽·¨È·¶¨ÈçºÎ×îºÃµØ½«ËûÃÇ´ò°üµ½´æ´¢£¬ÒÔ¶ÔÎļþ´óС½øÐÐÓÅ»¯£¬×îÖÕ½«¼Ç¼дÈë¡£¶ÔÓÚÖîÈçÊý¾Ý¿â¸ü¸Ä²¶»ñÖ®ÀàµÄÓÃÀý£¬½¨ÒéÔÚÊäÈ뼸ºõ¿Ï¶¨°üº¬¸üеÄÇé¿öÏÂʹÓô˲Ù×÷¡£
2£© insert²Ù×÷£ºÓëupsertÏà±È£¬insert²Ù×÷Ò²»áÔËÐÐÊÔ̽·¨È·¶¨´ò°ü·½Ê½£¬ÓÅ»¯Îļþ´óС£¬µ«»áÍêÈ«Ìø¹ýË÷Òý²éѯ¡£Òò´Ë¶ÔÓÚÖîÈçÈÕÖ¾ÖØ¸´Êý¾Ýɾ³ý£¨½áºÏÏÂÃæÌáµ½µÄ¹ýÂËÖØ¸´ÏîÑ¡ÏµÄÓÃÀý¶øÑÔ£¬Ëü±ÈupsertµÄËÙ¶È¿ìµÃ¶à¡£ÕâÒ²ÊÊÓÃÓÚÊý¾Ý¼¯¿ÉÒÔÈÝÈÌÖØ¸´Ïµ«Ö»ÐèÒªHudi¾ßÓÐÊÂÎñÐÔд/ÔöÁ¿ÀÈ¡/´æ´¢¹ÜÀí¹¦ÄܵÄÓÃÀý¡£
3£© bulk insert²Ù×÷£ºupsert ºÍinsert²Ù×÷¶¼»á½«ÊäÈë¼Ç¼±£ÁôÔÚÄÚ´æÖУ¬ÒÔ¼Ó¿ì´æ´¢Æô·¢Ê½¼ÆËãËÙ¶È£¬Òò´Ë¶ÔÓÚ×î³õ¼ÓÔØ/Òýµ¼HudiÊý¾Ý¼¯µÄÓÃÀý¶øÑÔ¿ÉÄÜ»áºÜÂé·³¡£Bulk
insertÌṩÁËÓëinsertÏàͬµÄÓïÒ壬ͬʱʵÏÖÁË»ùÓÚÅÅÐòµÄÊý¾ÝдÈëËã·¨£¬¸ÃËã·¨¿ÉÒԺܺõÄÀ©Õ¹Êý°ÙTBµÄ³õʼ¸ºÔØ¡£µ«ÊÇÕâÖ»ÊÇÔÚµ÷ÕûÎļþ´óС·½Ãæ½øÐеÄ×î´óŬÁ¦£¬¶ø²»ÊÇÏñinsert/updateÄÇÑù±£Ö¤Îļþ´óС¡£
5.2 ѹËõ
ѹËõÊÇÒ»¸ö instant²Ù×÷£¬Ëü½«Ò»×éÎļþƬ×÷ΪÊäÈ룬½«Ã¿¸öÎļþÇÐÆ¬ÖеÄËùÓÐÈÕÖ¾ÎļþÓëÆäbasefileÎļþ£¨parquetÎļþ£©ºÏ²¢£¬ÒÔÉú³ÉеÄѹËõÎļþƬ£¬²¢Ð´ÎªÊ±¼äÖáÉϵÄÒ»¸öcommit¡£Ñ¹Ëõ½öÊÊÓÃÓÚ¶ÁʱºÏ²¢£¨MOR£©±íÀàÐÍ£¬²¢ÇÒÓÉѹËõ²ßÂÔ£¨Ä¬ÈÏÑ¡Ôñ¾ßÓÐ×î´óδѹËõÈÕÖ¾µÄÎļþƬ£©¾ö¶¨Ñ¡ÔñÒª½øÐÐѹËõµÄÎļþƬ¡£Õâ¸öѹËõ²ßÂÔ»áÔÚÿ¸öд²Ù×÷Ö®ºóÆÀ¹À¡£
´Ó¸ß²ã´ÎÉϽ²£¬Ñ¹ËõÓÐÁ½ÖÖ·½Ê½£º
1£©Í¬²½Ñ¹Ëõ£ºÕâÀïµÄѹËõÓÉд³ÌÐò½ø³Ì±¾ÉíÔÚÿ´ÎдÈëÖ®ºóͬ²½Ö´Ðе쬼´Ö±µ½Ñ¹ËõÍê³Éºó²ÅÄÜ¿ªÊ¼ÏÂÒ»¸öд²Ù×÷¡£¾Í²Ù×÷¶øÑÔ£¬Õâ¸öÊÇ×î¼òµ¥µÄ£¬ÒòΪÎÞÐè°²Åŵ¥¶ÀµÄѹËõ¹ý³Ì£¬µ«±£Ö¤µÄÊý¾ÝÐÂÏʶÈ×îµÍ¡£²»¹ý£¬Èç¹û¿ÉÒÔÔÚÿ´Îд²Ù×÷ÖÐѹËõ×îеıí·ÖÇø£¬Í¬Ê±ÓÖÄÜÑӳٳٵ½/½Ï¾É·ÖÇøµÄѹËõ£¬ÕâÖÖ·½Ê½ÈÔÈ»·Ç³£ÓÐÓá£
2£©Ò첽ѹËõ£ºÊ¹ÓÃÕâÖÖ·½Ê½£¬Ñ¹Ëõ¹ý³Ì¿ÉÒÔÓë±íµÄд²Ù×÷ͬʱÒì²½ÔËÐС£ÕâÑù¾ßÓÐÃ÷ÏԵĺô¦£¬¼´Ñ¹Ëõ²»»á×èÈûÏÂÒ»ÅúÊý¾ÝдÈ룬´Ó¶ø²úÉú½üʵʱµÄÊý¾ÝÐÂÏʶȡ£Hudi
DeltaStreamerÖ®ÀàµÄ¹¤¾ßÖ§³Ö±ß½çµÄÁ¬ÐøÄ£Ê½£¬ÆäÖеÄѹËõºÍдÈë²Ù×÷¾ÍÊÇÒÔÕâÖÖ·½Ê½ÔÚµ¥¸öSparkÔËÐÐʱ¼¯ÈºÖнøÐеġ£
5.3 ÇåÀí
ÇåÀíÊÇÒ»Ïî»ù±¾µÄ¼´Ê±²Ù×÷£¬ÆäÖ´ÐеÄÄ¿µÄÊÇɾ³ý¾ÉµÄÎļþƬ£¬²¢ÏÞÖÆ±íÕ¼ÓõĴ洢¿Õ¼ä¡£ÇåÀí»áÔÚÿ´Îд²Ù×÷Ö®ºó×Ô¶¯Ö´ÐУ¬²¢ÀûÓÃʱ¼äÖá·þÎñÆ÷ÉÏ»º´æµÄʱ¼äÖáÔªÊý¾ÝÀ´±ÜÃâɨÃèÕû¸ö±íÀ´ÆÀ¹ÀÇåÀíʱ»ú¡£
HudiÖ§³ÖÁ½ÖÖÇåÀí·½Ê½£º
1£© °´commits / deltacommitsÇåÀí£ºÕâÊÇÔöÁ¿²éѯÖÐ×î³£¼ûÇÒ±ØÐëʹÓõÄģʽ¡£ÒÔÕâÖÖ·½Ê½£¬Cleaner»á±£Áô×î½üN´Îcommit/delta
commitÌá½»ÖÐдÈëµÄËùÓÐÎļþÇÐÆ¬£¬´Ó¶øÓÐЧÌṩÔÚÈκμ´Ê±·¶Î§ÄÚ½øÐÐÔöÁ¿²éѯµÄÄÜÁ¦¡£¾¡¹ÜÕâ¶ÔÓÚÔöÁ¿²éѯºÜÓаïÖú£¬µ«ÓÉÓÚ±£ÁôÁËÅäÖ÷¶Î§ÄÚËùÓа汾µÄÎļþƬ£¬Òò´Ë£¬ÔÚijЩ¸ßдÈë¸ºÔØµÄ³¡¾°Ï¿ÉÄÜÐèÒª¸ü´óµÄ´æ´¢¿Õ¼ä¡£
2£© °´±£ÁôµÄÎļþƬÇåÀí£ºÕâÊÇÒ»ÖÖ¸üΪ¼òµ¥µÄÇåÀí·½Ê½£¬ÕâÀïÎÒÃǽö±£´æÃ¿¸öÎļþ×éÖеÄ×îºóN¸öÎļþƬ¡£ÖîÈçApache
HiveÖ®ÀàµÄijЩ²éѯÒýÇæ»á´¦Àí·Ç³£´óµÄ²éѯ£¬ÕâЩ²éѯ¿ÉÄÜÐèÒª¼¸¸öСʱ²ÅÄÜÍê³É£¬ÔÚÕâÖÖÇé¿öÏ£¬½«NÉèÖÃΪ×ã¹»´óÒÔÖÁÓÚ²»»áɾ³ý²éѯÈÔÈ»¿ÉÒÔ·ÃÎʵÄÎļþƬÊǺÜÓÐÓõġ£
´ËÍ⣬ÇåÀí²Ù×÷»á±£Ö¤Ã¿¸öÎļþ×éÏÂÃæ»áÒ»Ö±Ö»ÓÐÒ»¸öÎļþƬ£¨×îеÄһƬ£©¡£
5.4 DFS·ÃÎÊÓÅ»¯
Hudi»¹¶Ô±íÖд洢µÄÊý¾ÝÖ´ÐÐÁ˼¸ÖÖÃØÔ¿´æ´¢¹ÜÀí¹¦ÄÜ¡£ÔÚDFSÉÏ´æ´¢Êý¾ÝµÄ¹Ø¼üÊǹÜÀíÎļþ´óСºÍ¼ÆÊýÒÔ¼°»ØÊÕ´æ´¢¿Õ¼ä¡£ÀýÈ磬HDFSÔÚ´¦ÀíСÎļþÎÊÌâÉϳôÃûÕÑÖø--ÔÚNameNodeÉÏÊ©¼ÓÄÚ´æ/RPCѹÁ¦£¬¿ÉÄÜÆÆ»µÕû¸ö¼¯ÈºµÄÎȶ¨ÐÔ¡£Í¨³££¬²éѯÒýÇæ¿ÉÔÚÊʵ±´óСµÄÁÐÎļþÉÏÌṩ¸üºÃµÄÐÔÄÜ£¬ÒòΪËüÃÇ¿ÉÒÔÓÐЧµØÌ¯Ïú»ñÈ¡ÁÐͳ¼ÆÐÅÏ¢µÈµÄ³É±¾¡£¼´Ê¹ÔÚÄ³Ð©ÔÆÊý¾Ý´æ´¢ÉÏ£¬Áгö°üº¬´óÁ¿Ð¡ÎļþµÄĿ¼Ҳ»á²úÉú³É±¾¡£
ÏÂÃæÊÇһЩHudi¸ßЧд£¬¹ÜÀíÊý¾Ý´æ´¢µÄ·½·¨£º
1£©Ð¡Îļþ´¦ÀíÌØÐÔ»áÆÊÎöÊäÈëµÄ¹¤×÷¸ºÔØ£¬²¢½«ÄÚÈÝ·ÖÅäµ½ÏÖÓеÄÎļþ×飬¶ø²»ÊÇ´´½¨ÐÂÎļþ×飨Õâ»áµ¼ÖÂÉú³ÉСÎļþ£©¡£
2£©ÔÚwriterÖÐʹÓÃÒ»¸öʱ¼äÖỺ´æ£¬ÕâÑùÖ»ÒªSpark¼¯Èº²»Ã¿´Î¶¼ÖØÆô£¬ºóÐøµÄд²Ù×÷¾Í²»ÐèÒªÁгöDFSĿ¼À´»ñȡָ¶¨·ÖÇøÂ·¾¶ÏµÄÎļþƬÁÐ±í¡£
3£©Óû§»¹¿ÉÒÔµ÷Õû»ù±¾ÎļþºÍÈÕÖ¾Îļþ´óС֮¼äµÄ±ÈֵϵÊýÒÔ¼°ÆÚÍûµÄѹËõÂÊ£¬ÒԱ㽫×ã¹»ÊýÁ¿µÄinsert·Öµ½Í³Ò»Îļþ×飬´Ó¶øÉú³É´óСºÏÊʵĻù±¾Îļþ¡£
4£©ÖÇÄܵ÷Õûbulk insert²¢Ðжȣ¬¿ÉÒÔÔٴε÷Õû´óСºÏÊʵijõʼÎļþ×顣ʵ¼ÊÉÏ£¬ÕýÈ·Ö´Ðд˲Ù×÷·Ç³£¹Ø¼ü£¬ÒòΪÎļþ×éÒ»µ©´´½¨¾Í²»Äܱ»É¾³ý£¬¶øÖÇÄÜÈçÇ°ÃæËùÊö¶ÔÆä½øÐÐÀ©Õ¹¡£
6.²éѯ
¼øÓÚÕâÖÖÁé»î¶øÈ«ÃæµÄÊý¾Ý²¼¾ÖºÍ·á¸»µÄʱ¼äÏߣ¬HudiÄܹ»Ö§³ÖÈýÖÖ²»Í¬µÄ²éѯ±í·½Ê½£¬¾ßÌåÈ¡¾öÓÚ±íµÄÀàÐÍ¡£


6.1 ¿ìÕÕ²éѯ
¿É²é¿´¸ø¶¨delta commit»òÕßcommit¼´Ê±²Ù×÷ºó±íµÄ×îпìÕÕ¡£ÔÚ¶ÁʱºÏ²¢£¨MOR£©±íµÄÇé¿öÏ£¬Ëüͨ¹ý¼´Ê±ºÏ²¢×îÐÂÎļþƬµÄ»ù±¾ÎļþºÍÔöÁ¿ÎļþÀ´Ìṩ½üʵʱ±í£¨¼¸·ÖÖÓ£©¡£¶ÔÓÚдʱ¸´ÖÆ£¨COW£©£¬Ëü¿ÉÒÔÌæ´úÏÖÓеÄparquet±í£¨»òÏàͬ»ù±¾ÎļþÀàÐÍµÄ±í£©£¬Í¬Ê±Ìṩupsert/deleteºÍÆäËûдÈë·½ÃæµÄ¹¦ÄÜ¡£
6.2 ÔöÁ¿²éѯ
¿É²é¿´×Ô¸ø¶¨commit/delta commit¼´Ê±²Ù×÷ÒÔÀ´ÐÂдÈëµÄÊý¾Ý¡£ÓÐЧµÄÌṩ±ä¸üÁ÷À´ÆôÓÃÔöÁ¿Êý¾Ý¹ÜµÀ¡£
6.3 ¶ÁÓÅ»¯²éѯ
¿É²é¿´¸ø¶¨µÄcommit/compact¼´Ê±²Ù×÷µÄ±íµÄ×îпìÕÕ¡£½ö½«×îÐÂÎļþƬµÄ»ù±¾/ÁÐÎļþ±©Â¶¸ø²éѯ£¬²¢±£Ö¤Óë·ÇHudi±íÏàͬµÄÁвéѯÐÔÄÜ¡£

|