Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
һƪÎÄÕÂÕÆÎÕSql-On-HadoopºËÐļ¼Êõ
 
À´Ô´£º InfoQ ·¢²¼ÓÚ£º2017-9-14
  2760  次浏览      31
 

1. SQL On Hadoop ·ÖÀà

1.1 ²éѯÑÓʱ·ÖÀà

AtScale ÔÚ 2016 ÄêµÄһƪÃûΪ [15]The Business Intelligence for Hadoop Benchmark µÄ SQL On Hadoop ÐÔÄܲâÆÀ±¨¸æÖÐÖ¸³ö£ºÊܲéѯÊý¾ÝÁ¿´óС£¬²éѯÀàÐÍ (join ±í¸öÊý£¬±í´óС£¬ÊÇ·ñ¾ÛºÏ)£¬²¢·¢Óû§Á¿µÈÒòËØÓ°Ï죬ûÓÐÒ»¸ö SQL On Hadoop ϵͳÄܹ»ÔÚËùÓг¡¾°ÏÂʤ³ö¡£ ±ÈÈç Impala ºÍ Presto ÔÚ²¢·¢³¡¾°ÏÂÐÔÄܱȽÏÓÅÔ½£¬Spark SQL ´ó±í Join ÐÔÄܱȽϺá£È»¶ø¶ÔÓÚËùÓÐ SQL On Hadoop ¶øÑÔ£¬´ó±í Join ¶¼±È½ÏÂý¡£

ÔÚÖÚ¶àµÄ SQL On Hadoop ϵͳÖУ¬ÓбØÒª¶ÔÆä½øÐÐÒ»¸ö·ÖÀà¡£Ò»°ã¶øÑÔ£¬Óû§¸ü¹ØÐĵÄÊDzéѯʱÑÓ£¬¸ù¾ÝÓû§Ìá½»²éѯµ½½á¹û·µ»ØµÄʱ¼ä³¤¶Ì£¬½« SQL ²éѯ·ÖΪÈçÏÂÈýÀࣺbatch SQL£¬interactive SQL£¬operation SQL, Èçͼ 1¡£

ͼ 1 SQL On Hadoop ·ÖÀà, Õª×ÔÎÄÏ× [14]

Batch SQL£¬Batch SQL µÄ²éѯʱ¼äͨ³£ÔÚ·ÖÖÓ£¬Ð¡Ê±¼¶±ð£¬Ò»°ãÓÃÓÚ¸´Ô ETL ´¦Àí£¬Êý¾ÝÍÚ¾ò£¬¸ß¼¶·ÖÎö¡£ÓÉÓÚ Batch SQL µÄ²éѯÑÓʱ±È½Ï¸ß£¬Òò´ËÖ§³Ö²éѯÄÚ (Intra-query) ÈÝ´íÊǸÃÀàϵͳ±ØÐë¾ß±¸µÄÊôÐÔ£¬²éѯÄÚÈÝ´íÊÇÖ¸£¬µ±½Úµãå´»ú»òÕß²éѯÄÚ²¿Ä³¸ö Task ʧ°Üʱ£¬ÏµÍ³±ØÐëÄܹ»ÖØÐÂÌá½»¸Ã task ¶ø²»ÊÇÖØÐÂÌá½»Õû¸ö²éѯÀ´½øÐÐÈÝ´í¡£Batch SQL ÖÐ×îµäÐ͵ÄϵͳÊÇ Hive¡£Spark SQL Ò²¿ÉÒÔ¹éÀൽ¸Ãϵͳ¡£

Interactive SQL£¬Interactive SQL Ò²½Ð×ö½»»¥Ê½ SQL ²éѯ£¬Óû§Í¨³£ÔÚͬһ¸ö±íÉÏ·´¸´µÄÖ´Ðв»Í¬µÄ²éѯ£¬Interactive SQL µÄ²éѯʱ¼äͨ³£ÔÚºÁÃë¼¶»òÕßÃë¼¶ÒÔÄÚ£¬Ò»°ã²»³¬¹ý·ÖÖÓ¼¶±ð¡£ÓÉÓÚ¸ÃÀàϵͳÖ÷Ҫ׷ÇóµÍÑÓ³Ù£¬¶ø²»¹ý·ÖÇ¿µ÷²éѯÄÚ²¿ÈÝ´í£¬ËùÒÔµ±Ä³¸ö task ʧ°Üʱ£¬¿ÉÒÔÖØÐÂÌá½»¸Ã²éѯÒÔ±ã½øÐÐÈÝ´í£¬ÒòÎªÖØÐÂÌá½»Ò»¸ö SQL ²éѯµÄÖ´ÐÐʱ¼äͨ³£ºÜ¶Ì¡£Interactive SQL ÔÚʵÏÖÉÏͨ³£²ÉÓà MPP ¼Ü¹¹£¬²¢ÇÒ½«ÈȵãÊý¾Ý»º´æµ½ÄÚ´æÖУ¬±ÈÈç Presto£¬Impala£¬Drill£¬HAWQ¡£¼øÓÚ Spark SQL Ò²¾ßÓзdz£¸ßЧµÄ²éѯËÙ¶È£¬Spark SQL Ò²¿ÉÒÔ¹éÀൽ Interactive SQL ÖС£

Operation SQL, ͨ³£Êǵ¥µã²éѯ£¬ÑÓʱҪÇóСÓÚ 1 Ã룬¸ÃÀàϵͳÖ÷ÒªÊÇ HBase¡£

1.2 ¼Ü¹¹·ÖÀà

1.2.1 MPP ¼Ü¹¹

MPP ¼Ü¹¹µÄÓŵãÊDzéѯËٶȿ죬ͨ³£ÔÚÃë¼ÆÉõÖÁºÁÃë¼¶ÒÔÄھͿÉÒÔ·µ»Ø²éѯ½á¹û£¬ÕâÒ²ÊÇΪºÎºÜ¶àÇ¿µ÷µÍÑÓ³ÙµÄϵͳ²ÉÓà MPP ¼Ü¹¹µÄÔ­Òò¡£

ÏÂÃæÖØµã¿´Ï MPP ¼Ü¹¹µÄȱµã£¬MPP ¼Ü¹¹×îÖ÷ÒªµÄȱµãÊDz»Ö§³ÖϸÁ£¶ÈµÄÈÝ´í£¬¼¯Èº½ÚµãÊýÁ¿ºÜÄÑÀ©Õ¹µ½ 100 ¸öÒÔÉÏ£¬Èç¹û¼¯Èº³öÏÖÂäºó½Úµã£¬ÄÇô½«Ó°ÏìÕû¸öϵͳµÄ²éѯÐÔÄÜ£¬´ËÍâ²»¹Ü MPP ½ÚµãÊýÁ¿µÄ¶àÉÙ£¬²¢·¢²éѯµÄÊýÁ¿Í¨³£Ö»ÄÜ´ïµ½ 20 ¸ö×óÓÒ¡£

ÈÝ´í£¬MPP ¼Ü¹¹µÄÈÝ´íÌØµãÊÇ´ÖÁ£¶ÈÈÝ´í£¬²»ÄÜ´¦ÀíÂäºó½Úµã (Straggler node)¡£´ÖÁ£¶ÈÈÝ´íÊÇÖ¸£¬Ä³¸ö task Ö´ÐÐʧ°Ü½«µ¼ÖÂÕû¸ö²éѯʧ°Ü£¬È»ºóÏµÍ³ÖØÐÂÌá½»Õû¸ö²éѯÀ´»ñÈ¡½á¹û¡£ÕâÖÖÈÝ´í·½Ê½Ö»ÊÊÓÃÓÚ Iterative SQL ÕâÖÖµÍÑӳٵŤ×÷¸ºÔØ£¬¶ø²»ÊÊºÏ Batch SQL ³¡¾°£¬ÒòΪ Batch SQL ²éѯʱ¼äͨ³£ÔÚ·ÖÖÓСʱ¼¶±ð£¬ÖØÐÂÌá¼ÛÒ»¸ö²éѯ´ú¼ÛÌ«¸ß¡£

Âäºó½Úµã£¬µ±Ò»¸ö½ÚµãÖ´ÐÐËÙ¶ÈÂýÓÚÆäËû½Úµãʱ£¬½«µ¼ÖÂÕû¸öϵͳµÄ²éѯÐÔÄÜϽµ¡£

À©Õ¹ÐÔ£ºÊÜÂäºó½ÚµãµÄÓ°Ï죬MPP ¼Ü¹¹ºÜÄÑÀ©Õ¹µ½ 100 ¸ö½ÚµãÒÔÉÏ¡£Èç¹ûij¸ö½ÚµãÂýÓÚÆäËû½Úµã£¬ÄÇôÕû¸öϵͳµÄ²éѯÐÔÄܽ«ÊÜÏÞÓÚÕâ¸ö×îÂýµÄ½Úµã£¬¶øÓ뼯Ⱥ½ÚµãÊýÁ¿Î޹ء£ÐèҪעÒâµÄÊÇ£¬ÔÚ´óÐͼ¯ÈºÖÐÂäºó½ÚµãÊÇÆÕ±é´æÔڵģ¬Ëæ×ż¯Èº½ÚµãÊýÁ¿µÄÔö¼Ó£¬Âäºó½Úµã³öÏֵĸÅÂÊÒ²Ôö¼Ó£¬[13] Õë¶Ô´ÅÅ̹ÊÕϸÅÂʵÄͳ¼ÆÈçÏ£º

Èç¹û¼¯Èº°üº¬ 1000 ¸öδʹÓÃÒ»ÄêµÄ´ÅÅÌ£¬ÄÇôÿÄ꽫ÓдóÔ¼ 20 ´ÅÅ̳öÏÖ¹ÊÕÏ£¬Æ½¾ùÿÁ½Öܾͻá³öÏÖÒ»¸ö¹ÊÕÏ¡£µ±´ÅÅÌʹÓó¬¹ýÒ»Äêºó£¬Ã¿Äê´ÅÅ̹ÊÕϳöÏֵĸÅÂʽ«´ïµ½ 8% ×óÓÒ£¬Æ½¾ùÿÖܽ«³öÏÖ´óÔ¼Á½´Î¹ÊÕÏ¡£ÓÉÓÚÕâ¸öÔ­Òò£¬MPP ¼Ü¹¹ºÜÄÑÀ©Õ¹µ½ 100 ¸ö½ÚµãÒÔÉÏ£¬Ò»°ãÔÚ 50 ¸ö½Úµã×óÓÒ¡£

²¢·¢£¬MPP ¼Ü¹¹µÄ²¢·¢²éѯÊýÁ¿ºÍ¼¯Èº½ÚµãÊýÁ¿Î޹ء£MPP ÊǶԳƽṹ£¬µ±Ö´ÐÐÒ»¸ö²éѯʱ£¬¸Ã²éѯ½«±»µ÷¶Èµ½¼¯ÈºÖеÄÿһ¸ö½ÚµãÖ´ÐУ¬ÕâÒâζ×ÅÒ»¸ö°üº¬ 4 ¸ö½ÚµãµÄ MPP ¼¯ÈººÍÒ»¸ö°üº¬ 400 ¸ö½ÚµãµÄ MPP ¼¯ÈºËùÖ§³ÖµÄ²¢·¢²éѯÊýÁ¿ÊÇÏàͬµÄ£¬Ò²¾ÍÊÇ˵£¬²¢·¢²éѯÊýÁ¿ºÍ¼¯Èº½ÚµãÊýÁ¿Î޹أ¬Ò»°ã¶øÑÔ£¬µ±²¢·¢²éѯ¸öÊý´ïµ½ 20 ×óÓÒʱ£¬Õû¸öϵͳµÄÍÌÍÂÒѾ­´ïµ½Âú¸ººÉ״̬¡£

×ÛÉÏËùÊö£¬MPP ¼Ü¹¹²»Êʺϴó¹æÄ£²¿Êð£¬Èç¹ûÐèÒª´ó¹æÄ£²¿Ê𣬿ÉÒÔ¿¼ÂÇ Spark Sql ÕâÑùµÄϵͳ¡£

1.2.2 ·Ç MPP ¼Ü¹¹

µäÐÍµÄ·Ç MPP ¼Ü¹¹ÓÐ Hive£¬Spark Sql¡£ËûÃǷֱ𹹽¨ÔÚ MR ºÍ Spark Ö®ÉÏ£¬ÓŵãÊǼ¯Èº½ÚµãÊýÁ¿¿ÉÒÔÀ©Õ¹µ½¼¸°ÙÉõÖÁÉÏǧ¸ö£¬Ö§³ÖϸÁ£¶ÈÈÝ´í¡£È±µãÊDzéѯËÙ¶È¿ÉÄܲ»Èç MPP ¼Ü¹¹¡£

2. ÔËÐÐÒýÇæµÄÉè¼Æ

2.1. ÓÅ»¯Æ÷

Ŀǰ SQL On Hadoop µÄ²éѯÓÅ»¯Æ÷Ö÷ÒªÓÐÁ½ÖÖ£º»ùÓÚ¹æÔòµÄ (Rule-Based Optimizer) ºÍ»ùÓÚ´ú¼ÛµÄ (Cost-Based Optimizer CBO)¡£»ùÓÚ¹æÔòµÄÓÅ»¯Æ÷¼òµ¥£¬Ò×ÓÚʵÏÖ£¬Í¨¹ýÄÚÖõÄÒ»×鹿ÔòÀ´¾ö¶¨ÈçºÎÖ´Ðвéѯ¼Æ»®£¬ÕâÀï²»×ö½éÉÜ¡£

Éè¼ÆÒ»¸öºÃµÄ CBO ÓÅ»¯Æ÷·Ç³£¾ßÓÐÌôÕ½ÐÔ£¬Ò»¸öºÃµÄ CBO ÒÀÀµÓÚÏêϸ¿É¿¿µÄͳ¼ÆÐÅÏ¢£¬±ÈÈçÿ¸öÁеÄ×î´óÖµ£¬×îСֵ£¬±í´óС£¬±í·ÖÇøÐÅÏ¢£¬Í°ÐÅÏ¢£¬È»¶øÔÚ SQL On Hadoop ÖУ¬Í¨³£È±·¦¿É¿¿µÄͳ¼Æ½á¹û£¬´ú¼Û¹À¼Æ´úÊý£¬ÕâʹµÃÔÚ SQL On Hadoop ÖÐÒýÈë CBO ºÜÀ§ÄÑ¡£¾¡¹ÜÈç´Ë£¬¼øÓÚ CBO ÔÚÔËÐпÉÒÔ¸ü¼ÓÖÇÄܵĽøÐвéѯÓÅ»¯£¬ÈÔÈ»ÓÐÔ½À´Ô½¶àµÄ SQL On Hadoop ¿ªÊ¼Ö§³Ö CBO£¬±ÈÈç Hive£¬Spark SQL(¼Æ»®ÖÐ)¡£

CBO Ö÷ÒªÓÃÀ´ÓÅ»¯ shuffle£¬join£¬ÈçºÎ¾¡¿ÉÄܵıÜÃâ shuffle£¬Ìá¸ß join Ö´ÐÐËÙ¶ÈÊÇ CBO Ö÷Òª¹Ø×¢µÄÎÊÌ⣬ÆäÖÐ Join µÄʵÏÖ·½Ê½ºÍ Join ˳ÐòÊÇÖØµã¿¼Âǵġ£ÔÚ SQL On Hadoop Ö÷ÒªÓÐËÄÖÖ join ʵÏÖ·½Ê½£ºshuffle hash join,broadcast join,Bucket join£¬cartesian join£º

shuffle hash join£¬ÔÚ map ½×¶Î°´ÕÕ join key ¶ÔÁ½¸ö±íÖ´ÐÐ hash shuffle£¬ÕâÑùÓµÓÐÏàͬ join key µÄÔª×齫 shuffle µ½Í¬Ò»¸ö½Úµã£¬ÔÚ reduce ½×¶Î¶Ô±í½øÐÐ join¡£

broadcast join£¬µ±Ò»¸ö´ó±í join Ò»¸öС±íʱ£¬²¢ÇÒС±í¿ÉÒÔÍêÈ«·Åµ½ÄÚ´æÖУ¬´Ëʱ¿ÉÒÔ½«Ð¡±í¹ã²¥µ½´ó±íËùÔÚµÄÿһ¸ö¼ÆËã½Úµã£¬È»ºóÖ´ÐÐ join¡£ÕâÖÖ join ·½Ê½½Ð×ö broadcast join »òÕß map join¡£Broadcast join ÓŵãÊDZÜÃâÁË shuffle£¬Ìá¸ß join ÐÔÄÜ¡£

Bucket join, ¼ÙÉè±í A ºÍ±í B ʹÓà bucket ·ÖÇø²ßÂÔ´æ´¢£¬²¢ÇÒ±í A ºÍ±í B µÄ bucket ¸öÊýΪ n£¬´Ëʱ¿ÉÒÔ°´ÕÕÈçÏ·½Ê½ join:bucket 1 of A join bucet 1 of B,......,bucket n of A join bucket n of B¡£

Bucket join ÓŵãÊÇ¿ÉÒÔ¶ÔÁ½¸ö´ó±íÖ´ÐÐ join£¬²¢ÇÒ²»ÐèÒª½«Êý¾Ý·Åµ½ÄÚ´æÖУ¬ÔÚ Hive ºÍ Spark2.0 Öж¼Ö§³Ö Bucket join¡£

cartesian join£¬Ò²½Ð×öµÑ¿¨¶ù»ý join£¬¶ÔÁ½¸ö±íÖ´Ðеѿ¨¶ù»ý join£¬½á¹û¼¯ÖÐÔªËØµÄÊýÁ¿ÊÇÁ½¸ö±í´óСµÄ³Ë»ý¡£±ÈÈç±í A ÓÐ 10 ÍòÐУ¬±í B ÓÐ 10 ÍòÐУ¬ÄÇôµÑ¿¨¶ù»ý join Ö®ºóµÄ±í´óС½«´ïµ½ 100 ÍòÌõÊý¾Ý¡£Òò´Ë³ý·Çµ½Íò²»µÃÒÑ£¬·ñÔò²»»áʹÓõѿ¨¶ù»ý join¡£

±íµÄ join ˳Ðò (Join order) Ö÷ÒªÓÐÁ½ÖÖ£ºleft-deep tree£¨ÏÂͼ×ó£©,bushy tree(ÏÂͼÓÒ)¡£Ò»¸öºÃµÄ CBO Ó¦¸ÃÄܹ»¸ù¾Ý SQL Óï¾äµÄÌØµã£¬À´×Ô¶¯Ñ¡ÔñʹÓà Left-deep tree »¹ÊÇ bushy tree Ö´ÐÐ join¡£

Left-deep tree, Èç¹û¶Ô A£¬B£¬C£¬D Ö´ÐÐ join£¬ÄÇôÊ×ÏÈ A join B µÃµ½Ò»¸öÁÙʱ±í AB ²¢ AB Îﻯµ½´ÅÅÌ£¬È»ºó AB join C µÃµ½ÖмäÁÙʱ±í ABC ²¢Îﻯµ½´ÅÅÌ£¬×îºó ABC joinD µÃµ½×îÖÕ½á¹û¡£¿ÉÒÔ·¢ÏÖ£¬ÕâÖÖ join ˳Ðò·Ç³£¼òµ¥£¬È±µãÊÇÖ»ÄÜ´®ÐÐ join£¬²¢ÇÒÓÉÓÚ²úÉúÁË´óÁ¿µÄÖмäÁÙʱ±í£¬Òò´Ë²»Ì«ÊÊºÏ OLAP ÖеÄÐÇÐͺÍÑ©»¨Ä£ÐÍ¡£

bushy tree, ²ÉÓà bushy tree ·½Ê½£¬¿ÉÒÔ²¢ÐÐÖ´ÐÐ A join B ºÍ C joinD¡£È»ºó½«¶þÕߵĽá¹û AB ºÍ CD ½øÐÐ join µÃµ½×îÖÕ½á¹û¡£Bushy tree ÓŵãÊÇ¿ÉÒÔ²¢ÐÐ join£¬²¢ÇÒÄܹ»ºÜºÃµÄ´¦ÀíÐÇÐÍÄ£ÐͺÍÑ©»¨Ä£ÐÍ¡£

ͼ 2left-deep tree ºÍ bushy tree, Õª×ÔÎÄÏ× [16]

2.2. ²éѯִÐÐÒýÇæ

²éѯִÐÐÒýÇæ (query execution engine) ÊÇ SQL On Hadoop µÄºËÐÄ×é¼þ¡£²éѯִÐÐÒýÇæµÄºÃ»µ¶Ô²éѯÐÔÄܵÄÓ°Ïì·Ç³£´ó¡£Ä¿Ç°Ö÷ÒªÓÐÁ½ÖÖ²éѯִÐУº»ðɽִÐÐÄ£ÐͺÍÏòÁ¿»¯Ö´ÐÐÒýÇæ¡£ÔÚºóÃæµÄÏòÁ¿»¯Ö´ÐÐÒýÇæÕ½ÚÖÐÓÐÏêϸµÄ½éÉÜ¡£

3. ÐÔÄÜÓÅ»¯

´ÓÓ²¼þ×ÊÔ´½Ç¶È½«ÐÔÄÜÓÅ»¯·ÖΪ 3 ¸ö²¿·Ö£º

´ÅÅÌÓÅ»¯£ºÊý¾Ý±¾µØ»¯£¬¼õÉÙÖмä½á¹ûµÄÎﻯ£¬Êý¾ÝѹËõ£¬Áд洢Îļþ£¬·ÖÇø£¬¿é¼¶Ë÷Òý

CPU ÓÅ»¯£ºÏòÁ¿»¯Ö´ÐÐÒýÇæ£¬¶¯Ì¬´úÂëÉú³É£¬ÇáÁ¿¼¶Ñ¹ËõËã·¨£¬ÈÎÎñÆô¶¯ÓÅ»¯

ÄÚ´æºÍ CPU »º´æ£ºÄÚ´æÑ¹ËõÁд洢£¬¶ÑÍâ´æ´¢£¬»º´æÃô¸ÐÊý¾Ý½á¹¹ºÍËã·¨

3.1 Êý¾Ý±¾µØ»¯

SQL On Hadoop Éè¼ÆµÄÒ»¸ö»ù±¾Ô­ÔòÊÇ£º½«¼ÆËãÈÎÎñÒÆ¶¯µ½Êý¾ÝËùÔÚµÄ½Úµã¶ø²»ÊÇ·´¹ýÀ´¡£ÕâÖ÷Òª³öÓÚÍøÂçÓÅ»¯µÄÄ¿µÄ£¬ÒòΪÊý¾Ý·Ö²¼ÔÚ²»Í¬µÄ½Úµã£¬Èç¹ûÒÆ¶¯Êý¾ÝÄÇô½«»á²úÉú´óÁ¿µÄµÍЧµÄÍøÂçÊý¾Ý´«Êä¡£Êý¾Ý±¾µØ»¯Ò»°ã·ÖΪÈýÖÖ£º½Úµã¾Ö²¿ÐÔ (Node Locality), »ú¼Ü¾Ö²¿ÐÔ (Rack Locality) ºÍÈ«¾Ö¾Ö²¿ÐÔ (Global Locality)¡£½Úµã¾Ö²¿ÐÔÊÇÖ¸½«¼ÆËãÈÎÎñ·ÖÅäµ½Êý¾ÝËùÔڵĽڵãÉÏ£¬´ËʱÎÞÐèÈκÎÊý¾Ý´«Ê䣬ЧÂÊ×î¼Ñ¡£»ú¼Ü¾Ö²¿ÐÔÊÇÖ¸½«¼ÆËãÈÎÎñÒÆ¶¯µ½Êý¾ÝËùÔڵĻú¼Ü£¬ËäÈ»¼ÆËãÈÎÎñºÍÊý¾Ý·ÖÊô²»Í¬µÄ¼ÆËã½Úµã£¬µ«ÊÇÒòΪ»ú¼ÜÄÚ²¿ÍøÂç´«ÊäËÙ¶ÈÃ÷ÏÔ¸ßÓÚ»ú¼Ü¼äÍøÂç´«Ê䣬ËùÒÔ»ú¼Ü¾Ö²¿ÐÔÒ²ÊÇÒ»ÖÖ²»´íµÄ·½Ê½¡£ÆäËûµÄÇé¿öÊôÓÚÈ«¾Ö¾Ö²¿ÐÔ£¬´ËʱÐèÒª¿ç»ú¼Ü½øÐÐÍøÂç´«Ê䣬»á²úÉú·Ç³£´óµÄÍøÂç´«Ê俪Ïú¡£

µ÷¶ÈϵͳÔÚ½øÐÐÈÎÎñµ÷¶Èʱ£¬Ó¦¸Ã¾¡¿ÉÄܵı£Ö¤½Úµã¾Ö²¿ÐÔ£¬È»ºóÊÇ»ú¼Ü¾Ö²¿ÐÔ£¬Èç¹ûÒÔÉÏÁ½Õß¶¼²»ÄÜÂú×㣬µ÷¶ÈϵͳҲ»áͨ¹ýÍøÂç´«Ê佫Êý¾ÝÒÆ¶¯µ½¼ÆËãÈÎÎñËùÔڵĽڵ㣬ËäÈ»ÐÔÄÜÏà¶ÔµÍЧ£¬µ«Ò²±È×ÊÔ´¿ÕÖñȽϺá£

ΪÁËʵÏÖÊý¾Ý±¾µØ»¯µ÷¶È£¬µ÷¶Èϵͳ»á½áºÏÑÓ³Ùµ÷¶ÈËã·¨À´½øÐÐÈÎÎñµ÷¶È¡£ºËÐÄ˼ÏëÊÇÓÅÏȽ«¼ÆËãÈÎÎñµ÷¶Èµ½Êý¾ÝËùÔڵĽڵã i£¬Èç¹û½Úµã i ûÓÐ×ã¹»µÄ¼ÆËã×ÊÔ´£¬ÄÇôµÈ´ý¼¸ÃëÖÓºóÈç¹û½Úµã i ÒÀȻûÓмÆËã×ÊÔ´¿ÉÓã¬ÄÇô¾Í·ÅÆúÊý¾Ý±¾µØ»¯½«¸Ã¼ÆËãÈÎÎñµ÷¶Èµ½ÆäËû¼ÆËã½Úµã¡£

3.2 ¼õÉÙÖмä½á¹ûµÄÎﻯ

ÔÚÒ»¸ö×·ÇóµÍÑÓ³ÙµÄ SQL On Hadoop ϵͳÖУ¬¾¡¿ÉÄܵļõÉÙÖмä½á¹ûµÄ´ÅÅÌÎﻯ¿ÉÒÔ¼«´óµÄÌá¸ß²éѯÐÔÄÜ¡£ ÈçÏÂͼ£¬Hive Ö´ÐÐÒýÇæ²ÉÓà pull »ñÈ¡Êý¾Ý£¬ÆäÓŵãÊÇ¿ÉÒÔ½øÐÐϸÁ£¶ÈµÄÈÝ´í£¬È±µãÊÇÏÂÓ뵀 MapReduce ±ØÐëµÈ´ýÉÏÓÎ MapReduce ÍêÈ«½«Êý¾ÝдÈëµ½´ÅÅ̺ó²ÅÄÜ¿ªÊ¼ pull Êý¾Ý¡£Presto ²ÉÓà push ·½Ê½»ñÈ¡Êý¾Ý£¬Êý¾ÝÍêÈ«ÒÔÁ÷µÄ·½Ê½ÔÚ²»Í¬ stage Ö®¼ä½øÐд«Ê䣬Öмä½á¹û²»ÐèÒªÎﻯµ½´ÅÅÌ£¬´Ó¶øÊ¹µÃ presto ¾ßÓзdz£¸ßЧµÄÖ´ÐÐËÙ¶È£¬È±µãÊDz»ÄÜÖ§³ÖϸÁ£¶ÈµÄÈÝ´í¡£

ͼ 3push ºÍ pull

3.3 Áд洢

´«Í³µÄ¹ØÏµ´æ´¢Ä£Ðͽ«Ò»¸öÔª×éµÄÁÐÁ¬Ðø´æ´¢£¬¼´Ê¹Ö»²éѯһ¸öÁУ¬Ò²ÐèÒª½«Õû¸öÔª×é¶ÁÈ¡³öÀ´£¬¿ÉÒÔ·¢ÏÖ£¬µ±²éѯֻÓÐÉÙÁ¿ÁÐʱ£¬ÐÔÄܷdz£µÍ¡£

Áд洢µÄ˼ÏëÊǽ«Ôª×é´¹Ö±»®·ÖΪÁÐ×弯ºÏ£¬Ã¿Ò»¸öÁÐ×å¶ÀÁ¢´æ´¢£¬ÁÐ×å¿ÉÒÔÍË»¯ÎªÖ»½ö°üº¬Ò»¸öÁÐµÄÆ½·²ÁÐ×å¡£µ±²éѯÉÙÁ¿ÁÐʱ£¬Áд洢ģÐÍ¿ÉÒÔ¼«´óµÄ¼õÉÙ´ÅÅÌ IO ²Ù×÷£¬Ìá¸ß²éѯÐÔÄÜ¡£µ±²éѯµÄÁпçÔ½¶à¸öÁÐ×åʱ£¬ÐèÒª½«´æ´¢ÔÚ²»Í¬ÁÐ×åÖÐÁÐÊý¾ÝÆ´½Ó³ÉԭʼÊý¾Ý£¬ÓÉÓÚ²»Í¬ÁÐ×å´æ´¢ÔÚ²»Í¬µÄ HDFS ½ÚµãÉÏ£¬µ¼Ö´óÁ¿µÄÊý¾Ý¿çÔ½ÍøÂç´«Ê䣬´Ó¶ø½µµÍ²éѯÐÔÄÜ¡£Òò´ËÔÚʵ¼ÊʹÓÃÁÐ×åʱ£¬Í¨³£¸ù¾ÝÒµÎñ²éÑ¯ÌØµã£¬½«Æµ·±·ÃÎʵÄÁзÅÔÚÒ»¸öÁÐ×åÖС£

ÔÚ´«Í³µÄÊý¾Ý¿âÁìÓòÖУ¬ÈËÃÇÒѾ­¶ÔÁд洢½øÐÐÁ˷dz£Éî¿ÌµÄÑо¿£¬²¢ÇҺܶàÑо¿³É¹ûÒѾ­±»Ó¦Óõ½¹¤ÒµÁìÓò£¬ÆäÖаüÀ¨ÇáÁ¿¼¶Ñ¹ËõËã·¨£¬Ö±½Ó²Ù×÷ѹËõÊý¾Ý£¬ÑÓ³ÙÎﻯ£¬ÏòÁ¿»¯Ö´ÐÐÒýÇæ¡£¿ÉÊÇ×ݹÛĿǰ SQL On Hadoop ϵͳ£¬ÕâЩ¼¼ÊõµÄÓ¦ÓÃÈÔȻԶԶµÄÂäºóÓÚ´«Í³Êý¾Ý¿â£¬ÔÚ×î½üµÄһЩ SQL On Hadoop ÖÐÒѾ­Ìí¼ÓÁËÏòÁ¿»¯Ö´ÐÐÒýÇæ£¬ÇáÁ¿¼¶Ñ¹ËõËã·¨£¬µ«ÊÇÖîÈçÖ±½Ó²Ù×÷ѹËõÊý¾Ý£¬ÑÓ³Ù½âѹµÈ¼¼Êõ»¹Ã»Óб»Ó¦Óõ½ SQL on Hadop ϵͳ¡£¹ØÓÚÁд洢µÄ¸ü¶àÄÚÈÝ¿ÉÒԲμû [20]¡£

Áд洢ѹËõ

Áд洢ѹËõËã·¨¾ßÓÐÈçÏÂÌØµã£º

ѹËõ±È Áд洢ģÐ;ßÓзdz£¸ßµÄѹËõ±È£¬Í¨³£¿ÉÒÔ´ïµ½ 10£º1£¬¶øÐд洢ѹËõ±Èͨ³£Ö»ÓÐ 4£º1¡£Èçͼ 4£º

ͼ 4 ÖØÁ¿¼¶Ñ¹ËõËã·¨

ÇáÁ¿¼¶Ñ¹ËõËã·¨ (Leight-Weight Compression) ÇáÁ¿¼¶Ñ¹ËõËã·¨ÊÇ CPU ÓѺõġ£Ðд洢ģÐÍÖ»ÄÜʹÓà zip£¬lzo£¬snappy µÈÖØÁ¿¼¶Ñ¹ËõËã·¨£¬ÕâЩËã·¨×î´óµÄȱµãÊÇѹËõºÍ½âѹËõËٶȱȽÏÂý£¬Í¨³£Ã¿ÃëÖ»ÄܽâѹÖÁ¶à¼¸°ÙÕ×Êý¾Ý¡£Ïà·´£¬Áд洢ģÐͲ»½ö¿ÉÒÔʹÓÃÖØÁ¿¼¶Ñ¹ËõËã·¨£¬»¹¿ÉÒÔʹÓÃһЩ·Ç³£ÇáÁ¿¼¶µÄѹËõËã·¨£¬±ÈÈç Run-length encode£¬Bit Vector¡£ÇáÁ¿¼¶Ñ¹ËõËã·¨²»½ö¾ßÓнϺõÄѹËõ±È£¬¶øÇÒ»¹¾ßÓзdz£¸ßµÄѹËõºÍ½âѹËÙ¶È¡£Ä¿Ç°ÔÚ ORC File ºÍ Parquet ´æ´¢ÖУ¬ÒѾ­Ö§³Ö Bit packing,Run-length enode,Dictionary encode µÈÇáÁ¿¼¶Ñ¹ËõËã·¨¡£

Ö±½Ó²Ù×÷ѹËõÊý¾Ý (Operating Directly on Compressed Data) µ±Ê¹ÓÃÇáÁ¿¼¶Ñ¹ËõË㷨ʱ£¬¿ÉÄÜÎÞÐè½âѹ¼´¿ÉÖ±½Ó»ñÈ¡¼ÆËã½á¹û¡£ÀýÈç:Run Length Encode Ëã·¨½«Á¬ÐøÖظ´µÄ×Ö·ûѹËõΪ×Ö·û¸öÊýºÍ×Ö·û£¬±ÈÈç aaaaaabbccccaaaa ½«±»Ñ¹ËõΪ 6a2b4c4a£¬ÆäÖÐ 6a ±íʾÓÐÁ¬Ðø 6 ¸ö×Ö·û a¡£ÏÖÔÚ¼ÙÉèÒ»¸öijÁаüº¬ÉÏÊöѹËõµÄ×Ö·û´®£¬µ±Ö´ÐÐ select count(*) from table where columnA=¡¯a¡¯Ê±£¬²»ÐèÒª½âѹ 6a2b4c4a£¬¾ÍÄܹ»ÖªµÀ a µÄ¸öÊýÊÇ 10¡£

ÐèҪעÒâµÄÊÇ£¬ÓÉÓÚÐд洢ֻÄÜʹÓÃÖØÁ¿¼¶Ñ¹ËõËã·¨£¬ËùÒÔÖ±½Ó²Ù×÷ѹËõÊý¾Ý²»Äܱ»Ó¦Óõ½Ðд洢¡£

ÑÓ³Ù½âѹ parquet ÖеÄÊý¾Ý°´¿é´æ´¢£¬Ã¿¸ö¿é´æ´¢ÁË×îСֵ£¬×î´óÖµµÈÇáÁ¿¼¶Ë÷Òý£¬±ÈÈçij¸ö¿éµÄ×îСֵ×î´óÖµ·Ö±ðÊÇ 100 ºÍ 120£¬Õâ±íÃ÷¸Ã¿éÖеÄÈÎÒâÒ»ÌõÊý¾Ý¶¼½éÓÚ 100 µ½ 120 Ö®¼ä£¬Òò´Ëµ±ÎÒÃÇÖ´ÐÐ select column a from table where v>120 ʱ£¬Ö´ÐÐÒýÇæ¿ÉÒÔÌø¹ýÕâ¸öÊý¾Ý¿é£¬¶ø²»±Ø½«Æä½âѹÔÙ½øÐÐÊý¾Ý¹ýÂË¡£Ïà·´£¬ÔÚÐд洢ÖУ¬±ØÐ뽫Êý¾Ý¿éÍêÕûµÄ¶ÁÈ¡µ½ÄÚ´æÖУ¬½âѹ£¬È»ºóÔÙ½øÐÐÊý¾Ý¹ýÂË£¬µ¼Ö²»±ØÒªµÄ´ÅÅ̶ÁÈ¡²Ù×÷¡£

3.4 ¿é¼¶Ë÷Òý

´«Í³Êý¾Ý¿âʹÓÃË÷ÒýÀ´ÓÅ»¯²éѯÐÔÄÜ£¬È»¶øÊÜÏÞÓÚ HDFS block µÄ·ÅÖòßÂÔ£¬Ê¹ÓÃË÷ÒýÀ´ÓÅ»¯ SQL On Hadoop ²»ÊÇÒ»¼þÈÝÒ×µÄÊÂÇ顣Ŀǰ´ó²¿·Ö SQL On Hadoop ϵͳ¶¼²»Ö§³ÖÈ«¾ÖË÷Òý£¬È¡¶ø´ú֮ʹÓõÄÊǿ鼶Ë÷Òý£¬±ÈÈç Hive Index£¬ORC File£¬Parquet¡£¿é¼¶Ë÷ÒýµÄ˼ÏëÊÇÔÚÿһ¸öÊý¾Ý¿éÖÐÌí¼ÓһЩÖîÈç×î´óÖµ£¬×îСֵµÄÇáÁ¿¼¶Ë÷Òý£¬µ± SQL ÒýÇæÉ¨Ãè HDFS Îļþʱ£¬¿ÉÒÔÌø¹ý²»·ûºÏÌõ¼þµÄ Block£¬´Ó¶ø¼õÉÙ´ÅÅÌ IO Ìá¸ß²éѯÐÔÄÜ¡£ÈçÏÂͼ£¬ÔÚ ORC File ÖУ¬Ã¿Ò»¸ö Stripe ¶¼°üº¬Ò»¸ö Index Data,Index Data Öд洢ÁËÁеÄ×î´óÖµ£¬×îСֵ¡£µ±Ö´ÐÐÒýÇæÖ´ÐÐ filter ÕâÖÖ²éѯʱ£¬Ö»ÐèÒª¶ÁÈ¡ Index Data ¾ÍÐУ¬Èç¹û·ûºÏÌõ¼þ¾Í¶ÁÈ¡ Row Data£¬·ñÔò¿ÉÒÔÖ±½ÓÌø¹ý Row Data µÄ¶ÁÈ¡£¬´Ó¶ø¼õÉÙ´ÅÅÌ IO£¬Ìá¸ß²éѯÐÔÄÜ¡£

ͼ 3-3 ORC Storage

×î´óÖµ£¬×îСֵÕâÑùµÄͳ¼ÆË÷ÒýÖ÷ÒªÓÃÓÚÓÅ»¯·¶Î§²éѯÐÔÄÜ£¬¶ÔÓÚµ¥µã²éѯͨ³£¿ÉÒÔʹÓò¼Â¡¹ýÂËÆ÷×÷ΪË÷Òý£¬²¼Â¡¹ýÂËÆ÷¿ÉÒÔÔÚÊý¾ÝÁ¿·Ç³£´óµÄÇé¿öÏ¿ìËٵIJéѯÊý¾Ý¡£

3.5 ·ÖÇø

MPP Êý¾Ý¿â¸ù¾Ý·ÖÇø²ßÂÔ½«Ò»¸ö±íˮƽ»òÕß´¹Ö±ÇзÖΪһ¸ö×Ó±í¼¯ºÏ£¬²»Í¬µÄ×Ó±í´æ´¢ÔÚ²»Í¬µÄ½Úµã£¬ÕâÑù¿ÉÒÔ²¢ÐеĴ¦Àí²»Í¬µÄ×Ó±í¡£µäÐ͵ķÖÇø²ßÂÔÓйþÏ££¬·¶Î§¡£

SQL On Hadoop ÖÐÒ²´æÔÚ±í·ÖÇøµÄ¸ÅÄһ¸ö±í·ÖÇø´æ´¢ÔÚÒ»¸ö HDFS ÎļþĿ¼Ï£¬ÎļþĿ¼ÒÔÁÐÃû = ÁÐÖµ·½Ê½´æ´¢¡£±ÈÈçÎÒÃÇÔÚ Hive ÖÐÖ´ÐÐÈçÏ SQL£º

CREATE TABLE test_table(id string,name int) PARTITION BY(ds string)¡£

µ±Ïò test_table ÖвåÈëÈçÏÂÔª×éʱ£º

(id=¡®10010¡¯£¬name=¡®sql on hadoop¡¯,ds=¡®2017-05-31¡¯)
(id=¡®10010¡¯£¬name=¡®sql on hadoop¡¯,ds=¡®2017-05-32¡¯)

HDFS Öн«´´½¨ÈçÏÂĿ¼:

/user/hive/warehouse/test_table/ds=2017-05-31
/user/hive/warehouse/test_table/ds=2017-05-32

µ±Ö´ÐÐ SELECT * FROM test_table WHERE ds=¡¯2017-05-31¡¯Ê±£¬Ö»ÐèҪɨÃè ds=2017-05-31Ŀ¼¼´¿É£¬ÕâÑù¿ÉÒÔÌø¹ý´óÁ¿ÎÞ¹ØÊý¾ÝµÄɨÃ裬´Ó¶ø¼Ó¿ìÊý¾Ý²éѯËÙ¶È¡£

Ŀǰ´ó²¿·Ö SQL On Hadoop ¶¼Ö§³Ö·ÖÇø¹¦ÄÜ£¬±ÈÈç Hive£¬Presto£¬Impala£¬Spark SQL¡£

3.6 ѹËõ

Ò»°ãÇé¿öÏ£¬Ñ¹Ëõ HDFS ÖеÄÎļþ¿ÉÒÔ¼«´óµÄÌá¸ß²éѯÐÔÄÜ¡£Ñ¹ËõÄܹ»¼õÉÙÊý¾ÝËùÕ¼ÓõĴ洢¿Õ¼ä£¬¼õÉÙ´ÅÅÌ IO µÄ¶Áд£¬Ìá¸ßÊý¾Ý´¦ÀíËÙ¶È£¬´ËÍ⣬ѹËõ»¹Äܹ»¼õÉÙÍøÂç´«ÊäÁ¿£¬Ìá¸ßÍøÂç´«ÊäËÙ¶È¡£ÔÚ SQL On Hadoop ÖУ¬Ñ¹ËõÖ÷ÒªÓ¦ÓÃÔÚ HDFS ÖеÄÊý¾ÝÔ´£¬shuffle Êý¾Ý£¬×îÖÕ¼ÆËã½á¹û¡£

Èç¹ûÓ¦ÓóÌÐòÊÇ io-bound µÄ£¬ÄÇôѹËõÊý¾Ý¿ÉÒÔÌá¸ßÊý¾Ý´¦ÀíËÙ¶È£¬ÒòΪѹËõºóµÄÊý¾Ý±äСÁË£¬ËùÒÔ¿ÉÒÔÔö¼ÓÊý¾Ý¶ÁдËÙ¶È¡£ÐèÒªÖ÷ÒªµÄÊÇ£¬Ñ¹ËõËã·¨²¢²»ÊÇѹËõ±ÈÔ½¸ßÔ½ºÃ£¬Ñ¹ËõÂÊÔ½¸ßµÄË㷨ѹËõºÍ½âѹËõËٶȾÍÔ½Âý£¬Óû§ÐèÒªÔÚ cpu ºÍ io Ö®¼äÈ¡µÃÒ»¸öÁ¼ºÃµÄƽºâ¡£ÀýÈç gzip2 ÓµÓзdz£¸ßµÄѹËõ±È£¬µ«ÊÇÆäѹËõºÍ½âѹËõËÙ¶ÈÈ´·Ç³£Âý£¬ÉõÖÁ¿ÉÄܳ¬¹ýÊý¾ÝδѹËõʱµÄ¶Áдʱ¼ä£¬Òò´ËûÓÐ SQL On Hadooop ϵͳʹÓà gzip2 Ëã·¨£¬Ä¿Ç°ÔÚ SQL On Hadoop ϵͳÖбȽÏÁ÷ÐеÄѹËõËã·¨Ö÷ÒªÓУºSnappy£¬Lzo£¬Glib¡£

Èç¹ûÓ¦ÓóÌÐòÊÇ cpu-bound µÄ£¬ÄÇôѡÔñÒ»¸ö¿ÉÒÔ splittable µÄѹËõËã·¨ÊǺÜÖØÒªµÄ£¬Èç¹ûÒ»¸öÎļþÊÇ splittabe µÄ£¬ÄÇôÕâ¸öÎļþ¿ÉÒÔ±»ÇзÖΪ¶à¸ö¿ÉÒÔ²¢ÐжÁÈ¡µÄÊý¾Ý¿é£¬ÕâÑù MR »òÕß Spark ÔÚ¶ÁÈ¡Îļþʱ£¬»áΪÿһ¸öÊý¾Ý¿é·ÖÅäÒ»¸ö task À´¶ÁÈ¡Êý¾Ý£¬´Ó¶øÌá¸ßÊý¾Ý²éѯËÙ¶È¡£

3.7 ÏòÁ¿»¯Ö´ÐÐÒýÇæ

²éѯִÐÐÒýÇæ (query execution engine) ÊÇÊý¾Ý¿âÖеÄÒ»¸öºËÐÄ×é¼þ£¬ÓÃÓÚ½«²éѯ¼Æ»®×ª»»ÎªÎïÀí¼Æ»®£¬²¢¶ÔÆäÇóÖµ·µ»Ø½á¹û¡£²éѯִÐÐÒýÇæ¶ÔÊý¾Ý¿âϵͳÐÔÄÜÓ°ÏìºÜ´ó£¬Ä¿Ç°Ö÷ÒªµÄÖ´ÐÐÒýÇæÓÐÈçÏÂËÄÀࣺVolcano-style£¬Block-oriented processing£¬Column-at-a-time£¬Vectored iterator model¡£ÏÂÃæ·Ö±ð½éÉÜÕâËÄÖÖÖ´ÐÐÒýÇæ¡£

Volcano-style, ×îÔçµÄ²éѯִÐÐÒýÇæÊÇ Volcano-style execution engine(»ðɽִÐÐÒýÇæ£¬»ðɽģÐÍ)£¬Ò²½Ð×öµü´úÄ£ÐÍ (iterator model)£¬»òÕß one-tuple-at-a-time¡£ÔÚÕâÖÖÄ£ÐÍÖУ¬²éѯ¼Æ»®ÊÇÒ»¸öÓÉ operator ×é³ÉµÄ tree »òÕß DAG£¬ÆäÖÐÿһ¸ö operator °üº¬Èý¸öº¯Êý£ºopen£¬next£¬close¡£Open ÓÃÓÚÉêÇë×ÊÔ´£¬±ÈÈç·ÖÅäÄڴ棬´ò¿ªÎļþ£¬close ÓÃÓÚÊÍ·Å×ÊÔ´£¬next ·½·¨µÝ¹éµÄµ÷ÓÃ×Ó operator µÄ next ·½·¨Éú³ÉÒ»¸öÔª×顣ͼ 1 ÃèÊöÁË select id,name,age from people where age >30 µÄ»ðɽģÐ͵IJéѯ¼Æ»®£¬¸Ã²éѯ¼Æ»®°üº¬ User£¬Project£¬Select£¬Scan Ëĸö operator£¬Ã¿¸ö operator µÄ next ·½·¨µÝ¹éµ÷ÓÃ×Ó½ÚµãµÄ next£¬Ò»Ö±µÝ¹éµ÷Óõ½Ò¶×Ó½Úµã Scan operato£¬Scan Operator µÄ next ´ÓÎļþÖзµ»ØÒ»¸öÔª×é¡£

ͼ 3-4 »ðɽģÐÍ Õª×ÔÎÄÏ× [2,page 39]

»ðɽģÐ͵ÄÖ÷ҪȱµãÊǰº¹óµÄ½âÊÍ¿ªÏú (interpretation overhead) ºÍµÍÏ嵀 CPU Cache ÃüÖÐÂÊ¡£Ê×ÏÈ£¬»ðɽģÐ굀 next ·½·¨Í¨³£ÊµÏÖΪһ¸öÐ麯Êý£¬ÔÚ±àÒëÆ÷ÖУ¬Ð麯Êýµ÷ÓÃÐèÒª²éÕÒÐ麯Êý±í, ²¢ÇÒÐ麯Êýµ÷ÓÃÊÇÒ»¸ö·ÇÖ±½ÓÌø×ª (indirect jump), »áµ¼ÖÂÒ»´Î´íÎóµÄ CPU ·ÖÖ§Ô¤²â (brance misprediction), Ò»´Î´íÎóµÄ·ÖÖ§Ô¤²âÐèҪʮ¼¸¸öÖÜÆÚµÄ¿ªÏú¡£»ðɽģÐÍΪÁË·µ»ØÒ»¸öÔª×飬ÐèÒªµ÷Óöà´Î next ·½·¨£¬µ¼Ö°º¹óµÄº¯Êýµ÷ÓÿªÏú¡£[] Ñо¿±íÃ÷£¬ÔÚ²ÉÓûðɽִÐÐÄ£Ð굀 MySQL ÖÐÖ´ÐÐ TPC-H Q1 ²éѯ£¬½öÓÐ 10% µÄʱ¼äÓÃÓÚÕæÕýµÄ²éѯ¼ÆË㣬ÆäÓàµÄ 90% ʱ¼ä¶¼ÀË·ÑÔÚ½âÊÍ¿ªÏú (interpretation overhead)¡£Æä´Î£¬next ·½·¨Ò»´ÎÖ»·µ»ØÒ»¸öÔª×飬Ԫ×éͨ³£²ÉÓÃÐд洢£¬Èçͼ 3-5 Row Format£¬Èç¹û˳Ðò·ÃÎʵÚÒ»ÁÐ 1£¬2£¬3£¬ÄÇôÿ´Î·ÃÎʶ¼½«µ¼Ö CPU Cache ÃüÖÐʧ°Ü (¼ÙÉè¸ÃÐв»ÄÜÍêÈ«·ÅÈë CPU Cache ÖÐ)¡£Èç¹û²ÉÓà Column Format£¬ÄÇôֻÓÐÔÚ·ÃÎʵÚÒ»¸öֵʱ²Å³öÏÖ»º´æÃüÖÐʧ°Ü£¬ºóÐø·ÃÎÊ 2 ºÍ 3 ʱ¶¼½«»º´æÃüÖгɹ¦, ´Ó¶ø¼«´óµÄÌá¸ß²éѯÐÔÄÜ¡£

ͼ 3-6 Ðд洢ºÍÁд洢

Block-oriented processing£¬Block-oriented processing Ä£ÐÍÊǶԻðɽģÐ͵ÄÒ»¸ö¸Ä½ø£¬¸ÃÄ£ÐÍÒ»´Î next µ÷Ó÷µ»ØÒ»ÅúÔª×é, Ôª×é¸öÊýÔÚ 100-1000 ²»µÈ£¬next ÄÚ²¿Ê¹ÓÃÒ»¸öÑ­»·À´´¦ÀíÕâÅúÔª×é¡£ÔÚͼ 1 µÄ»ðɽģÐÍÖУ¬Select operator next ·½·¨¿ÉÒÔÈçÏÂʵÏÖ:

def next():Array[Tuple]={
// µ÷ÓÃ×Ó½ÚµãµÄ next ·½·¨£¬·µ»ØÒ»¸öÔª×éÏòÁ¿£¬¸ÃÏòÁ¿°üº¬ 1024 ¸öÔª×é
val tuples=child.next()
val result=new ArrayBuffer[Tuple]
for(i=0;i30) result.append(tuples(i))
}
result// ·µ»Ø½á¹û
}

Block-oriented processing Ä£Ð͵ÄÓŵãÊÇÒ»´Î next ·µ»Ø¶à¸öÔª×飬¼õÉÙÁ˽âÊÍ¿ªÏú£¬Í¬Ê±Ò²±»Ö¤Ã÷Ôö¼ÓÁË CPU Cache µÄÃüÖÐÂÊ£¬µ± CPU ·ÃÎÊÔª×éÖеÄij¸öÁÐʱ»á½«¸ÃÔª×é¼ÓÔØµ½ CPU Cache(Èç¹û¸ÃÔª×é´óССÓÚ CPU Cache »º´æÐеĴóС), ·ÃÎʺó¼ÌµÄÁн«Ö±½Ó´Ó CPU Cache ÖлñÈ¡£¬´Ó¶ø¾ßÓÐ½Ï¸ßµÄ CPU Cache ÃüÖÐÂÊ£¬È»¶øÈç¹ûÖ®·ÃÎÊÒ»¸öÁлòÕßÉÙÊý¼¸¸öÁÐʱ CPU ÃüÖÐÂÊÈÔÈ»²»ÀíÏë¡£¸ÃÄ£ÐÍ×î´óµÄÒ»¸öȱµãÊDz»Äܳä·ÖÀûÓÃÏÖ´ú±àÒëÆ÷¼¼Êõ£¬±ÈÈçÔÚÉÏÃæµÄÑ­»·ÖУ¬ºÜÄÑʹÓà SIMD Ö¸Áî´¦ÀíÊý¾Ý¡£

Column-at-a-time Ä£ÐÍ£¬ÏòÁ¿»¯Ö´ÐеÄ×îÔçÀúÊ·¿ÉÒÔ×·Ë·µ½ MonetDB[], ÔÚ MonetDB Ìá³öÁËÒ»¸ö½Ð×ö Column-at-a-time µÄ²éѯִÐÐÄ£ÐÍ£¬¸ÃÄ£ÐÍÖÐÿһ´Î next µ÷Ó÷µ»ØÒ»¸ö»òÕß¶à¸öÁУ¬Ã¿¸öÁÐÒÔÊý×éÐÎʽ·µ»Ø¡£¸ÃÄ£ÐÍÓŵãÊǾßÓзdz£¸ßµÄ²éѯЧÂÊ£¬È±µãÊÇÒ»¸öÁÐÊý¾ÝÐèÒª±»Îﻯµ½ÄÚ´æÉõÖÁ´ÅÅÌ£¬µ¼ÖºܸߵÄÄÚ´æÕ¼ÓÃºÍ io ¿ªÏú£¬Í¬Ê±Êý¾Ý²»Äܷŵ½ CPU Cache ÖУ¬µ¼ÖÂ½ÏµÍµÄ CPU Cache ÃüÖÐÂÊ¡£

Vectored iterator model,VectorWise Ìá³öÁË Vectored iterator model Ä£ÐÍ£¬¸ÃÄ£ÐÍÊÇ¶Ô Column-at-a-time µÄ¸Ä½ø£¬next µ÷Óò»ÊÇ·µ»ØÍêÕûµÄÒ»¸öÁУ¬¶øÊÇ·µ»ØÒ»¸ö¿ÉÒԷŵ½ CPU Cache µÄÏòÁ¿¡£¸ÃÄ£ÐͱÜÃâÁË Column-at-a-tim CPU Cache ÃüÖÐÂʵ͵Äȱµã¡£Vectored iterator model ×î´óµÄÓŵãÊÇ¿ÉÒÔʹÓÃÔËÐÐʱ±àÒëÆ÷ (JIT) ¶¯Ì¬µÄÉú³É¸üÊʺÏÏÖ´ú´¦ÀíÆ÷µÄÖ¸Á±ÈÈç JIT ¿ÉÒÔÉú³É SIMD Ö¸ÁîÀ´´¦ÀíÏòÁ¿¡£¿¼ÂÇ TPC-H Q1 ²éѯ£ºSELECT l_extprice*(1-l_discount)*(1+l_tax) FROM lineitem¡£¸Ã SQL ²éѯµÄÖ´Ðмƻ®ÈçÏ£º

ÆäÖÐ Project operator µÄ next ·½·¨¿ÉÒÔÈçÏÂʵÏÖ (scala α´úÂë):

def next():Array[Tuple]={
val tuples=child.next()
var result=new ArrayBuffer[Int]
for(i=0;i

½ü¼¸Ä꣬һЩ SQL On Hadoop ϵͳÒýÈëÁËÏòÁ¿»¯Ö´ÐÐÒýÇæ£¬±ÈÈç Hive£¬Impala£¬Presto£¬Spark µÈ£¬¾¡¹ÜÆäʵÏÖϸ½Ú²»Í¬£¬µ«ºËÐÄ˼ÏëÊÇÒ»Öµģº¾¡¿ÉÄܵÄÔÚÒ»´Î next ·½·¨µ÷Ó÷µ»Ø¶àÌõÊý¾Ý£¬È»ºóʹÓö¯Ì¬´úÂëÉú³É¼¼ÊõÀ´ÓÅ»¯Ñ­»·£¬±í´ïʽ¼ÆËã´Ó¶ø¼õÉÙ½âÊÍ¿ªÏú£¬Ìá¸ß CPU Cache ÃüÖÐÂÊ£¬¼õÉÙ·ÖÖ§Ô¤²â¡£

Impala ÖеÄÏòÁ¿»¯Ö´ÐÐÒýÇæ±¾ÖÊÉÏÊôÓÚ Block-oriented processing£¬imapla µÄÿ´Î next µ÷Ó÷µ»ØÒ»ÅúÔª×飬ÕâÖÖÄ£ÐÍÈÔÈ»¾ßÓÐ½ÏµÍµÄ CPU Cache ÃüÖÐÂÊ£¬Í¬Ê±Ò²ºÜÄÑʹÓà SIMD µÈÖ¸Áî½øÐÐÓÅ»¯£¬ÎªÁË»º½âÕâ¸öÎÊÌ⣬Impala ʹÓö¯Ì¬´úÂëÉú³É¼¼Êõ£¬¶ÔÓÚ´óÑ­»·£¬±í´ïʽ¼ÆËãµÈ½øÐÐʹÓö¯Ì¬´úÂëÉú³ÉÀ´½øÐÐÓÅ»¯¡£

ÔÚ Spark2.0 ÖУ¬ÊµÏÖÁË»ùÓÚ Parquet µÄÏòÁ¿»¯Ö´ÐÐÒýÇæ [12]£¬¸ÃÖ´ÐÐÒýÇæÊôÓÚ Vectored iterator model£¬ÒýÇæÔÚµ÷Óà next ·½·¨Ê±ÒÔÁд洢¸ñʽ·µ»ØÒ»ÅúÔª×飬¿ÉÒÔʹÓÃÑ­»·À´´¦Àí¸ÃÅúÔª×é¡£´ËÍâΪÁ˸ü³ä·ÖµÄÀûÓÃÏÖ´ú CPU ÌØÐÔ£¬Spark »¹Ö§³ÖÕû½×¶Î´úÂëÉú³É¼¼Êõ£¬ºËÐÄ˼ÏëÊǽ«¶à¸ö operator ±àÒëµ½Ò»¸ö·½·¨ÖУ¬´Ó¶ø¼õÉÙ½âÊÍ¿ªÏú¡£

3.8 ¶¯Ì¬´úÂëÉú³É

¶¯Ì¬´úÂëÉú³ÉÒ»°ãºÍÏòÁ¿»¯Ö´ÐÐÒýÇæ½áºÏʹÓã¬ÒòΪÏòÁ¿Ö´ÐÐÒýÇæµÄ next ·½·¨ÄÚ²¿¿ÉÒÔʹÓà for Ñ­»·À´´¦ÀíÔª×éÏòÁ¿»òÕßÁÐÏòÁ¿£¬Ê¹Óö¯Ì¬´úÂëÉú³É¼¼Êõ¿ÉÒÔÔÚÔËÐÐʱ¶Ô next ·½·¨Éú³É¸ü¸ßЧµÄÖ´ÐдúÂë¡£Ñо¿Ö¤Ã÷ÏòÁ¿»¯Ö´ÐÐÒýÇæºÍ¶¯Ì¬´úÂëÉú³É¿ÉÒÔ¼õÉÙ½âÊÍ¿ªÏú (interpretation overhead), ¼ûÎÄÏ× [18]£¬Ö÷ÒªÓ°ÏìÒÔÏÂÈý¸ö·½Ã棺

Select, µ± select Óï¾äÖаüº¬¸´Ôӵıí´ïʽ¼ÆËãʱ£¬±ÈÈç avg£¬sum£¬count£¬select µÄ¼ÆËãÐÔÄÜÖ÷ÒªÊÜ CPU Cache ºÍ SIMD Ö¸ÁîÓ°Ïì¡£µ±Êý¾Ý²»Äܷŵ½ CPU Cache ʱ£¬CPU ´ó²¿·Öʱ¼ä¶¼ÔڵȴýÊý¾Ý´ÓÄÚ´æ¼ÓÔØµ½ CPU Cache£¬Òò´Ëµ± CPU Ö´ÐмÆËãËùÐèµÄÊý¾ÝÔÚ CPU Cache ÖÐʱ¿ÉÒÔ¼«´óµÄÌá¸ß¼ÆËãÐÔÄÜ¡£Ò»Ìõ SIMD Ö¸Áî¿ÉÒÔͬʱ¼ÆËã¶à¸öÊý¾Ý£¬Òò´ËʹÓà SIMD Ö¸ÁîÖ´Ðбí´ïʽ¼ÆËã¿ÉÒÔÌá¸ß¼ÆËãÐÔÄÜ¡£

where£¬Óë Select Óï¾ä²»Í¬µÄÊÇ Where Óï¾äÒ»°ã²»ÐèÒª¸´ÔӵļÆË㣬ӰÏì where ÐÔÄܸü¶àµÄÊÇ·ÖÖ§Ô¤²â¡£Èç¹û CPU ·ÖÖ§Ô¤²â´íÎó£¬ÄÇô֮ǰµÄ CPU Á÷Ë®Ïß½«È«±»ÇåÏ´£¬Ò»´Î CPU ·ÖÖ§Ô¤²â´íÎó¿ÉÄÜÖÁÉÙÀË·ÑÊ®¼¸¸öÖ¸ÁîÖÜÆÚµÄ¿ªÏú¡£Í¨¹ýʹÓö¯Ì¬´úÂëÉú³É¼¼Êõ£¬JIT ±àÒëÆ÷Äܹ»×Ô¶¯µÄÉú³É·ÖÖ§Ô¤²âÓѺõÄÖ¸Áî¡£

Hash£¬hash Ëã·¨Ó°Ïì equal-join£¬group µÄ²éѯÐÔÄÜ£¬hash Ëã·¨µÄ CPU Cache ÃüÖÐÂʺܵ͡£[18] ÃèÊöÁËÒ»ÖÖ»º´æÓÑºÃµÄ hash Ëã·¨£¬¿ÉÒÔÏÔÖøµÄÌá¸ß hash ¼ÆËãÐÔÄÜ¡£

¶¯Ì¬´úÂëÉú³ÉÓÐÁ½ÖÖ£ºC++ ϵºÍ java ϵ¡£ÆäÖÐ C++ ϵ¿ÉÒÔÖ±½ÓÉú³É±¾»ú¿ÉÖ´Ðжþ½øÖÆ´úÂ룬²¢ÇÒÄܹ»Éú³É¸ßЧµÄ SIMD Ö¸ÁÀýÈç Impala ʹÓà C++ ʵÏÖ²éѯִÐÐÒýÇæ£¬Í¬Ê±Ê¹Óà LLVM ±àÒëÆ÷¶¯Ì¬µÄÉú³É±¾»ú¿ÉÖ´Ðжþ½øÖÆ´úÂ룬LLVM ¿ÉÒÔÉú³É SIMD Ö¸Áî¶Ô±í´ïʽִÐмÆËã¡£Java ϵÀûÓ÷´Éä»úÖÆ¶¯Ì¬µÄÉú³É java ×Ö½ÚÂ룬һ°ã¶øÑÔ£¬²»Äܳä·ÖÀûÓà SIMD Ö¸Áî½øÐÐÓÅ»¯,Spark ʹÓ÷´Éä»úÖÆ¶¯Ì¬µÄÉú³É java ×Ö½ÚÂ룬ͨ³£ºÜÄÑÖ±½ÓÀûÓà SIMD ½øÐбí´ïʽÓÅ»¯¡£´ËÍâÔÚ Spark2.0 ÖÐËùÌṩµÄÕû½×¶Î´úÂëÉú³É (Whole-Stage Code Generation) ¼¼ÊõÒ²ÊǶ¯Ì¬´úÂëÉú³É¼¼Êõ½«¶à¸ö Operator ±àÒë³ÉÒ»¸ö·½·¨½øÐÐÓÅ»¯¡£

ÐèҪעÒâµÄÊÇ£¬¶¯Ì¬´úÂëÉú³É¼¼Êõ²¢²»×ÜÊÇÍòÄÜÒ©£¬ÔÚÏÂͼÖУ¬impala µÄ¶¯Ì¬´úÂëÉú³É¼¼Êõ²¢Ã»ÓÐÌá¸ß TPC-DS Q42£¬Q52£¬Q55 µÄ²éѯËÙ¶È£¬Ö÷ÒªÔ­ÒòÕâЩ SQL Óï¾äµÄ SELECT Óï¾äÖв¢Ã»ÓÐʲô¸´ÔӵļÆËã¡£

3.9 ¶ÑÍâ´æ´¢

ʹÓà JVM ʵÏֵIJéѯִÐÐÒýÇæÒÀÀµÓÚ GC »ØÊÕÄڴ棬ÿһ´Î Full GC »áÔÝÍ£ËùÓй¤×÷Ị̈߳¬Ò»´Î GC ͨ³£ÔÚ·ÖÖÓ¼¶±ðÒÔÉÏ£¬µ¼ÖÂËùÓÐ SQL ²éѯ¼ÆËãÍ£Ö¹£¬´Ó¶øÑÏÖØµÄÓ°Ïì²éѯÐÔÄܲ¢ÇÒ¿ÉÄܻᵼÖÂһЩ·Ç³£Ææ¹ÖµÄÒì³£³öÏÖ£¬±ÈÈçÍøÂ糬ʱ£¬shuffle »ñÈ¡Êý¾ÝÊý¾Ýʧ°Ü¡£ÎªÁ˼õÉÙ GC ¶Ô³ÌÐòÐÔÄܵÄÓ°Ï죬Ðí¶à SQL On Hadoop ʹÓöÑÍâ´æ´¢ (off heap) À´´æ´¢Êý¾Ý¡£

¶ÑÍâ´æ´¢ËùÐèµÄÄÚ´æÓɲÙ×÷ϵͳ¹ÜÀí¶ø²»ÊÇ Java GC£¬java.nio ÌṩÁËһЩÓÃÓÚ¶Áд¶ÑÍâ´æ´¢µÄÀ࣬¿ÉÒÔÔÚ¶ÑÍâ´æ´¢Öд洢 Int£¬Double ÕâÖÖ»ùÔªÀàÐÍ£¬Ò²¿ÉÒÔ´æ´¢ map£¬struct ÕâÖÖ¸´ºÏ¶ÔÏ󣬵±´æ´¢¸´ºÏ¶ÔÏóʱÐèÒª½«¸´ºÏ¶ÔÏóÐòÁл¯´æ´¢µ½¶ÑÍâ´æ´¢£¬ÔÚ¶ÁȡʱҲÐè½øÐз´ÐòÁл¯¡£ÒòΪÐòÁл¯ / ·´ÐòÁл¯»áÏûºÄ´óÁ¿µÄ CPU ¼ÆË㣬Òò´ËÔÚʹÓöÑÍâ´æ´¢Ê±ÐèÒªÔÚ GC ºÍ cpu Ö®¼ä½øÐÐÒ»¸öºÏÀíµÄƽºâ¡£

3.10 ÄÚ´æÑ¹ËõÁд洢

ÔÚÄÚ´æÖлº´æÈȵãÊý¾ÝÊÇÌá¸ß²éѯÐÔÄܵÄÒ»¸ö»ù±¾ÓÅ»¯ÊֶΡ£ÔÚÄÚ´æÖлº´æÈȵãÊý¾ÝÐèÒª¿¼ÂÇÖÁÉÙ¿¼ÂÇÈý¸öÎÊÌâ: µÚÒ»£¬ÈçºÎ¼õÉÙÊý¾ÝµÄÄÚ´æÕ¼Ó㬵ڶþ£¬ÈçºÎÌá¸ß CPU Cache ÃüÖÐÂÊ£¬µÚÈý£¬Èç¹ûʹÓà JVM ϵͳ£¬»¹Òª¿¼ÂÇÈçºÎ¼õÉÙ GC ´ÎÊýºÍ GC ʱ¼ä¡£ÕâÀïÐèÒªÖØµã¹Ø×¢µÄÊÇÈçºÎÌá¸ß CPU Cache µÄÃüÖÐÂÊ¡£

ÕâÈý¸öÎÊÌâ¿ÉÒÔͨ¹ýʹÓÃÄÚ´æÑ¹ËõÁд洢À´½â¾ö£º

¼õÉÙÄÚ´æÕ¼Óã¬ÔÚÄÚ´æÁд洢ÖУ¬Èç¹ûÁÐÔªËØÀàÐÍÊÇ»ùÔªÀàÐÍ (Int,Double,Long µÈ)£¬ÄÇôÿһ¸öÁд洢Ϊһ¸öÊý×飬Èç¹ûÁÐÔªËØÊÇ Map£¬Struct ÕâÖÖ¸ºÔð¶ÔÏ󣬿ÉÒÔ½«ÆäÐòÁл¯ÎªÒ»¸ö×Ö½ÚÊý¾Ý½øÐд洢¡£Êý×é¿ÉÒÔ±»Ñ¹Ëõ´æ´¢£¬ÐèҪעÒâµÄÊÇ£¬ÔÚÑ¡ÔñѹËõË㷨ʱ£¬Ò»°ã²»»áÑ¡ÔñÖØÁ¿¼¶Ñ¹ËõËã·¨£¬ËäÈ»ÖØÁ¿¼¶Ñ¹ËõËã·¨¾ßÓнϸߵÄѹËõÂÊ£¬µ«ÊÇËüÔÚѹËõºÍ½âѹËõʱ·Ç³£Âý£¬Õ⽫ÑÏÖØµÄÓ°Ïì²éѯÐÔÄÜ¡£ÔÚÄÚ´æÑ¹ËõÁд洢ÖУ¬ÇáÁ¿¼¶Ñ¹ËõËã·¨¾ßÓиü¸ßÖ´ÐÐЧÂÊ£¬ÕâÊÇÒòΪÇáÁ¿¼¶Ñ¹ËõËã·¨ÔÚ½øÐÐѹËõºÍ½âѹʱ¼¸ºõ²»ÐèҪ̫¶àµÄ CPU ¼ÆËã¡£ÔÚ Spark SQL µÄÄÚ´æÑ¹ËõÁд洢ÖÐ [10]£¬Ê¹ÓõľÍÊÇ Run length encode£¬dictionary encode µÈÇáÁ¿¼¶Ñ¹ËõËã·¨¡£

Ìá¸ß CPU Cache ÃüÖÐÂÊ£¬ÄÚ´æÁд洢¾ßÓÐ½ÏºÃµÄ CPU Cache ÃüÖÐÂÊ£¬ÒòΪÁÐÊý¾ÝÁ¬Ðø´æ´¢£¬ËùÒÔµ± CPU ·ÃÎÊÊý×éÖÐij¸öÔªËØÊ±¿ÉÒÔ½«¸ÃÔªËØÁÙ½üµÄÊý¾ÝÒ»Æð¼ÓÔØµ½ CPU Cache »º´æÐÐÖУ¬ÕâÑù CPU ·ÃÎʸÃÔªËØµÄÏÂÒ»¸öÔªËØÊ±¾Í²»ÐèÒª·ÃÎÊÄÚ´æÁË£¬´Ó¶øÌá¸ß CPU Cache ÃüÖÐÂÊ£¬Ìá¸ß²éѯ¼ÆËãÐÔÄÜ¡£

¼õÉÙ GC ʱ¼ä£¬×îºó£¬ÄÚ´æÁд洢¶ÔÓÚ JVM ϵͳҲÊÇÓѺõġ£Ê×ÏÈ£¬JVM ÖÐÿ¸ö¶ÔÏó¶¼°üº¬Ò»¸ö¶ÔÏóÍ·£¬Õâ¸ö¶ÔÏóÍ·µÄ¿ªÏúͨ³£ÐèÒª 12 ¸ö×Ö½Ú£¬Èç¹ûÎÒÃǽ« Int °´Ðд洢£¬ÄÇôÿ¸ö Int ¶¼½«ÖÁÉÙÀË·Ñ 12 ¸ö×ֽڵĴ洢¿Õ¼äÕ¼Óá£Ïà·´£¬Èç¹û½« Int ´æ´¢ÎªÒ»¸öÊý×飬ÄÇôÿ¸ö Int Ö»ÐèÒª 4 ¸ö×Ö½Ú£¬¿ÉÒÔ¼õÉÙ 3 ±¶µÄ´æ´¢¿Õ¼äÕ¼Óá£ÄÚ´æÁд洢»¹¿ÉÒÔ¼õÉÙ GC ʱ¼ä£¬GC ʱ¼äÖ÷ÒªºÍ¶ÔÏóÊýÁ¿³ÊÕýÏà¹Ø£¬Í¨¹ý²ÉÓÃÄÚ´æÁд洢£¬Ã¿¸öÁÐ×÷Ϊһ¸öÊý×é¶ÔÏó´æ´¢£¬¿ÉÒÔ¼«´óµÄ¼õÉÙ¶ÔÏóÊýÁ¿£¬¼õÉÙ GC ʱ¼ä¡£

3.11 »º´æÃô¸ÐËã·¨

×Ô´Ó CPU Cache ³öÏÖÒÔÀ´£¬ÈËÃǶÔÓÚ»º´æÃô¸ÐËã·¨µÄÑо¿¾Í´Óδֹͣ¡£ËùνµÄ»º´æÃô¸ÐËã·¨£¬¾ÍÊDZàд CPU Cache ÃüÖÐÂʸߵÄËã·¨¡£ÔÚÕâ¸öÁìÓòÒѾ­ÓÐÁË´óÁ¿µÄÑо¿£¬±ÈÈç´ÅÅÌË÷Òý B-tree µÄ»º´æÃô¸ÐʵÏÖ£¬ÄÚ´æË÷Òý T-tree µÄ»º´æÃô¸ÐʵÏÖ£¬Á´±í£¬¹þÏ£±íµÈµÈ¡£

»º´æÃô¸ÐË㷨ͨ³£±È½Ï¸´ÔÓ£¬²¢ÇÒ²»Ò×Àí½â£¬Òò´Ë½«ËùÓÐËã·¨¶¼Éè¼Æ³É»º´æÃô¸ÐµÄÊDz»Ã÷Öǵģ¬ÊÂʵÉÏ´ó²¿·Ö SQL ¼ÆËãÖ÷ҪΪÅÅÐò£¬¾ÛºÏ£¬join£¬Ö»Ðè¶ÔÕâЩËã·¨½øÐÐÓÅ»¯¼´¿É¡£ÔÚ Spark SQL ʵÏÖÁË»º´æÃô¸ÐµÄ Sort Ëã·¨£¬¸ÃËã·¨Ó¦ÓÃÔÚ»ùÓÚ sort µÄ shuffle£¬ÅÅÐòºÍ join£¬ÓÅ»¯ºóµÄ Sort ÐÔÄÜÖÁÉÙÌá¸ßÁË 3 ±¶¡£

4. ÆäËû

ĿǰÔÚ SQL On Hadoop ÁìÓòÖдæÔÚÖÖÀà·±ÔӵĿªÔ´Èí¼þ£¬¾¡¹ÜÆä¾ßÌåµÄʵÏÖϸ½ÚºÍÓ¦Óó¡¾°²»Í¬£¬µ«ÊÇÈÔÈ»ÓÐһЩ¹²Í¬µÄ¼¼Êõ±»¹ã·º²ÉÓãºÁд洢£¬ÏòÁ¿»¯Ö´ÐÐÒýÇæ£¬»º´æÈȵãÊý¾Ý£¬ÄÚ´æÑ¹ËõÁд洢µÈ¡£

ÓÉÓÚÉè¼Æ¾ö²ß£¬¼Ü¹¹µÄ²»Í¬£¬²»Í¬ SQL On Hadoop ÈÔÈ»ÓÐÐí¶à²»Í¬µÄµØ·½£º

ͳһ×ÊÔ´¹ÜÀí£¬Ò»¸öÖ§³Öͳһ×ÊÔ´µ÷¶ÈµÄ SQL On Hadoop ϵͳ·Ç³£¾ßÓÐÑо¿¼ÛÖµ£¬ÒòΪÔÚÒ»¸ö´óÐ͸´Ôӵķֲ¼Ê½¼¯ÈºÖУ¬²»¿ÉÄÜÖ»ÓÐÒ»ÖÖ¼ÆËã¿ò¼ÜÓµÓÐÊý¾Ý£¬¸ü¶àµÄÊǶàÖÖ¹¤×÷¸ºÔز»Í¬µÄ¼ÆËã¿ò¼Üͬʱ²¿ÊðÔÚͬһ¼¯Èº£¬±ÈÈç Spark£¬MR£¬Hive£¬SparkSql£¬Impala£¬ÎªÁ˱ÜÃⲻͬ¼ÆËã¿ò¼ÜÖ®¼äµÄ×ÊÔ´¾ºÕù£¬ÐèҪʹÓÃͳһµÄ×ÊÔ´µ÷¶È¿ò¼Ü½øÐÐ×ÊÔ´¹ÜÀí£¬Ê¹ÓÃͳһ×ÊÔ´¹ÜÀí¿ÉÒÔ±ÜÃâ¼ÆËã¿ò¼ÜÉêÇë¹ý¶àµÄ×ÊÔ´µ¼Ö¼¯Èº£¬²Ù×÷ϵͳµÈ³öÏÖ²»Îȶ¨×´Ì¬£¬Yarn ºÍ Mesos ÊÇÁ½¸ö×îÁ÷ÐеĿªÔ´×ÊÔ´¹ÜÀí¿ò¼Ü¡£Impala£¬SparkSql µÈ¶¼Ö§³Ö Yarn ½øÐÐͳһ×ÊÔ´µ÷¶È£¬presto Ŀǰ²»Ö§³Ö yarn¡£

ÈÝ´íÁ£¶È£¬Impala£¬Presto£¬drill ÕâЩ²ÉÓà MPP ¼Ü¹¹µÄϵͳ²»Ö§³ÖϸÁ£¶ÈµÄÈÝ´í¡£Spark Sql£¬Hive ÕâЩϵͳͨ¹ý½è¼øµ×²ãϵͳ MR ºÍ Spark µÄÈÝ´í»úÖÆ£¬Ò²ÊµÏÖÁËϸÁ£¶ÈµÄÈÝ´í¡£

JVM£¬ ´ó²¿·Ö SQL On Hadoop ¶¼²ÉÓà JVM ÓïÑÔÀ´ÊµÏÖ£¬²¿·Öϵͳ²ÉÓÃ·Ç Jvm£¬±ÈÈç Impala ʹÓà C++ ʵÏÖ²éѯִÐÐÒýÇæ¡£

×îºó£¬ËùÓÐµÄ SQL On Hadoop ¶¼Ó¦¸Ã¾¡¿ÉÄܵÄ×·Çó¿ìËÙ£¬Ò×ʹÓᣲéѯËÙ¶ÈÔ½¿ì£¬¾ÍÔ½ÄÜÊÊÓ¦¸ü¶àµÄ³¡¾°¡£Ö§³Ö ANSI SQL ¶ø²»ÊÇÆäËû·½ÑÔ¿ÉÒÔ¼õÉÙÓû§Ñ§Ï°ÇúÏߣ¬±ÜÃâÓû§ÏÝÈëµ½¹ý¶àµÄÓïÑÔÌØÐÔÖС£

 

 

   
2760 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ