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 ¶ø²»ÊÇÆäËû·½ÑÔ¿ÉÒÔ¼õÉÙÓû§Ñ§Ï°ÇúÏߣ¬±ÜÃâÓû§ÏÝÈëµ½¹ý¶àµÄÓïÑÔÌØÐÔÖС£
|