±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜHive SQLÇ¨ÒÆSpark SQLÔڵεεÄʵ¼ù
£¬Ê×ÏȶÔÇ¨ÒÆ·½°¸½øÐиÅÒªÉè¼Æ£¬ÏêϸÉè¼Æ£¬È»ºóÃèÊöÁËÇ¨ÒÆµÄ¹ý³Ì£¬×îºóÇ¨ÒÆ½á¹û¶Ô±È£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú
¡£
±¾ÎÄÀ´×ÔÓÚ
µÎµÎ´óÊý¾Ý
£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
µ¼¶Á£º ÔڵεÎS QLÈÎÎñ´ÓHiveÇ¨ÒÆµ½Sparkºó£¬Spark SQLÈÎÎñÕ¼±ÈÌáÉýÖÁ85%£¬ÈÎÎñÔËÐÐʱ¼ä½ÚÊ¡40% £¬ÔËÐÐÈÎÎñÐèÒªµÄ¼ÆËã×ÊÔ´½ÚÊ¡21%£¬ÄÚ´æ×ÊÔ´½ÚÊ¡49%¡£ÔÚÇ¨ÒÆ¹ý³Ì ÖÐ ÎÒÃdzÁµí³öÒ»Ì×Ç¨ÒÆÁ÷³Ì£¬ ²¢ÇÒ·¢ÏÖ²¢½â¾öÁËÁ½¸öÒýÇæÔÚÓï·¨£¬UDF£¬ÐÔÄܺ͹¦ÄÜ·½ÃæµÄ²îÒì¡£
1. Ç¨ÒÆ±³¾°

Spark×Ô´Ó2010ÄêÃæÊÀ£¬µ½2020ÄêÒѾ¾¹ýÊ®ÄêµÄ·¢Õ¹£¬ÏÖÔÚÒѾ·¢Õ¹Îª´óÊý¾ÝÅú¼ÆËãµÄÊ×Ñ¡ÒýÇæ£¬ÔڵεÎSparkÊÇÔÚ2015Äê±ã¿ªÊ¼ÂäµØÊ¹Ó㬲»¹ýÖ÷ҪʹÓõij¡¾°ÊǸü¶àÔÚÊý¾ÝÍÚ¾òºÍ»úÆ÷ѧϰ·½Ïò£¬¶ÔÓÚÊý²ÖSQL·½Ïò£¬Ö÷ÒªÈÔÒÔHive SQLΪÖ÷¡£
ÏÂͼÊǵ±Ç°µÎµÎÄÚ²¿SQLÈÎÎñµÄ¼Ü¹¹Í¼£¬µÎµÎ¸÷¸öÒµÎñÏßµÄÀëÏßÈÎÎñÊÇͨ¹ýһվʽÊý¾Ý¿ª·¢Æ½Ì¨DataStudioµ÷¶ÈµÄ£¬DataStudio°ÑSQLÈÎÎñÌá½»µ½HiveServer2»òÕßSparkÁ½ÖÖ¼ÆËãÒýÇæÉÏ¡£Á½¸ö¼ÆËãÒýÇæ¾ùÒÀÀµ×ÊÔ´¹ÜÀíÆ÷YARNºÍÎļþϵͳHDFS¡£
ÔÚÇ¨ÒÆÖ®Ç°ÎÒÃÇÃæÁÙµÄÖ÷ÒªÎÊÌâÓУº
SQLÈÎÎñÔËÐÐÂý£º Ç¨ÒÆÇ°SQLÈÎÎñÔËÐÐµÄÆ½¾ùʱ¼äÊÇ20·ÖÖÓ£¬Ö÷ÒªÔÒòÊÇÕ¼±È¸ß´ï83%µÄHive SQLÈÎÎñÔËÐÐʱ¼ä³¤£¬HiveÈÎÎñÖ´Ðйý³ÌÖлáÆô¶¯¶à¸öMR Job£¬Job¼äµÄÖмä½á¹û´æ´¢ÔÚHDFS£¬ËùÒÔͬһ¸öSQL£¬ Hive±ÈSparkÖ´ÐеÄʱ¼ä¸ü³¤£»
Hive SQLÎȶ¨ÐԲ Ò»¸öHS2»áͬʱִÐжà¸öÓû§µÄHive SQLÈÎÎñ£¬µ±Ò»¸öÒì³£ÈÎÎñµ¼ÖÂHS2½ø³ÌÏìÓ¦ÂýÉõÖÁÒì³£Í˳öʱ£¬ÔËÐÐÔÚͬһ¸öʵÀýµÄSQLÈÎÎñÒ²»áÔËÐлºÂýÉõÖÁʧ°Ü¡£¶øÒì³£ÈÎÎñ³¡¾°¸÷Òì¡£ÎÒÃÇÔø¾Óöµ½µÄÒì³£ÈÎÎñÓжà¸ö´óSQL¼ÓÔØ¹ý¶àµÄ·ÖÇøÔªÊý¾Ýµ¼ÖÂHS2 FullGC£¬¼ÓÔØUDFʱµ¼ÖÂHS2½ø³Ìcore dump£¬UDF·ÃÎÊHDFSûÓйرÕÁ÷µ¼ÖÂHS2»úÆ÷¶Ë¿Ú±»´òÂú£¬ÕâЩûÓÐͨÓýⷨ£¬ ÎÊÌâºÜÄÑÊÕÁ²£»
ÈËÁ¦·ÖÉ¢£º Á½¸öÒýÇæÐèҪͶÈëË«±¶µÄÈËÁ¦£¬ÔÚÈËÔ±ÓÐÏÞµÄÇé¿öÏ£¬¶ÔÒýÇæµÄÕÆ¿ØÁ¦»á¼õÈõ£»
ËùÒÔΪÁËSQLÈÎÎñÔËÐÐ ¸ü¿ì£¬¸üÎÈ £¬ÍŶÓÈËÁ¦¾Û½¹£¬¶ÔÒýÇæÓÐ ¸üÇ¿ µÄÕÆ¿ØÁ¦£¬ÎÒÃǾö¶¨°ÑHive SQLÇ¨ÒÆµ½Spark SQL¡£
2. Ç¨ÒÆ·½°¸¸ÅÒªÉè¼Æ
Hive SQLÇ¨ÒÆµ½Spark SQLºóÐèÂú×ãÒÔÏÂÌõ¼þ£º
±£Ö¤Êý¾ÝÒ»ÖÂÐÔ£¬ Ò²¾ÍÊÇÏàͬµÄSQLʹÓÃSparkºÍHiveÖ´ÐеĽá¹ûÓ¦¸ÃÊÇÒ»ÑùµÄ£»
±£Ö¤Óû§ÓÐÊÕÒæ£¬ Ò²¾ÍÊÇʹÓÃSparkÖ´ÐÐSQLºóÓ¦¸Ã½ÚÊ¡×ÊÔ´£¬°üÀ¨Ê±¼ä£¬cpuºÍmemroy£»
Ç¨ÒÆ¹ý³Ì¶ÔÓû§Í¸Ã÷£»
ΪÁËÂú×ãÒÔÉÏÈý¸öÌõ¼þ£¬ Ò»¸öºÜÖ±¹ÛµÄ˼·¾ÍÊÇʹÓÃÁ½¸öÒýÇæÖ´ÐÐÓû§SQL£¬È»ºó¶Ô±Èÿ¸öÒýÇæµÄÖ´Ðнá¹ûºÍ×ÊÔ´ÏûºÄ¡£
ΪÁ˲»Ó°ÏìÓû§ÏßÉÏÊý¾Ý£¬Ê¹ÓÃÁ½¸öÒýÇæÖ´ÐÐÓû§SQLÓÐÁ½¸ö¿ÉÑ¡·½°¸£º
¸´ÓÃÏÖÓеÄSQLÈÎÎñµ÷¶Èϵͳ£¬ÔÙ²¿ÊðÒ»Ì×SQLÈÎÎñµ÷¶ÈϵͳÓÃÀ´Ç¨ÒÆ£¬Õâ¸öϵͳÓëÉú²ú»·¾³ÎïÀí¸ôÀ룻
¿ª·¢Ò»¸öSQLË«Åܹ¤¾ß£¬¿ÉÒÔÖ§³ÖʹÓÃÁ½¸öÒýÇæÖ´ÐÐͬһ¸öSQLÈÎÎñ£»
ÏÂÃæÏêϸ½éÉÜÕâÁ½¸ö·½°¸£º
¨… 1. ·½°¸Ò»£º¸´ÓÃÏÖÓеÄSQLÈÎÎñµ÷¶Èϵͳ
ÔÙ²¿ÊðÒ»Ì×SQLÈÎÎñÖ´ÐÐϵͳÓÃÀ´Ê¹ÓÃSparkÖ´ÐÐËùÓеÄSQL£¬°üÀ¨HDFS£¬HiveServer2&MetaStoreºÍSpark£¬DataStudio¡£Ð²¿ÊðµÄϵͳÐèÒªÖÜÆÚÐÔ´ÓÉú²ú»·¾³Í¬²½ÈÎÎñÐÅÏ¢£¬ÔªÊý¾ÝÐÅÏ¢ºÍHDFSÊý¾Ý£¬ÔÚÕâ¸öв¿ÊðµÄϵͳÖаÑHive SQLÈÎÎñ¸Ä³ÉSpark SQLÀàÐÍÈÎÎñ£¬ÕâÑùÒ»¸öÓû§µÄSQLÔÚÔÓÐϵͳÖÐʹÓÃHive SQLÖ´ÐУ¬ÔÚв¿ÊðµÄϵͳÖÐʹÓÃSparkÖ´ÐС£ÈçÏÂͼËùʾ£¬À¶É«µÄ±íʾÐèҪв¿ÊðµÄ×Óϵͳ¡£

¨… 2. ·½°¸¶þ£º¿ª·¢Ò»¸öSQLË«Åܹ¤¾ß
SQLË«Åܹ¤¾ß£¬¿ÉÒÔÏßÏÂʹÓÃÁ½¸öÒýÇæÖ´ÐÐÓû§µÄSQL£¬¾ßÌåÁ÷³ÌÈçÏ£º
SQLÊÕ¼¯£º Óû§µÄSQLÊÇÔÚHS2ÉÏÖ´Ðеģ¬ËùÒÔÀíÂÛÉÏͨ¹ýHS2¿ÉÒÔÊÕ¼¯µ½ËùÓеÄSQL£»
SQL¸Äд£º Ö´ÐÐÓû§ÔʼSQL»á¸²¸ÇÏßÉÏÊý¾Ý£¬ËùÒÔÔÚÖ´ÐÐǰÐèÒª¸ÄдSQL£¬°ÑSQLµÄÊä³öµÄ¿â±íÃûÌæ»»ÎªÓÃÀ´Ç¨ÒƲâÊԵĵĿâ±íÃû£»
SQLË«ÅÜ£º ·Ö±ðʹÓÃHiveºÍSparkÖ´ ÐиÄдºóµÄSQL£»
¨… 3. ·½°¸¶Ô±È
·½°¸Ò»
ÓÅ ÊÆ
¸ôÀëÐÔºÃ,µ¥¶ÀµÄSQLÖ´ÐÐϵͳ²»»áÓ°ÏìÉú²úÈÎ Îñ£¬Ò²²»»áÓ° ÏìÒµÎñÊý¾Ý£»
ÁÓÊÆ
ÐèÒªµÄ×ÊÔ´¶à£ºÔËÐжà¸ö×ÓϵͳÐèÒª½Ï¶à ÎïÀí×Ê Ô´ £»
²¿Êð¸´ÔÓ£º²¿Êð¶à¸ö×Óϵͳ£¬ÐèÒª¶à¸ö²» ͬµÄÍŶÓÏ໥ÅäºÏ£»
ÈÝÒ׳ö´í£º×Óϵͳ¼äÐèÒªÖÜÆÚÐÔͬ²½£¬ÈÎ ºÎÒ»¸ö×Óϵͳͬ²½³öÎÊÌ⣬¶¼¿É Äܵ¼ ÖÂÖ´ÐÐ S QLʧ°Ü£»
·½°¸¶þ
ÓÅ ÊÆ
·Ç³£ÇáÁ¿£¬²»ÐèÒª²¿ÊðºÜ¶àϵͳ£¬¶øÇÒ¶ÔÎïÀí×ÊÔ´ÐèÒª²»¸ß£»
ÁÓÊÆ
ÓëÉú²ú¹«¹²Ò»Ì×»·¾³£¬»Ø·ÅʱÓÐÓ°ÏìÓû§Êý¾Ý¶Ô·çÏÕ£»
ÐèÒª¿ª·¢SQLÊÕ¼¯£¬SQL¸ÄдºÍSQLË«ÅÜϵͳ£»
¾¹ýȨºâ£¬ ÎÒÃǾö¶¨²ÉÓ÷½°¸¶þ£¬ ÒòΪ£º
ͨ¹ýHiveServerÊÕ¼¯ËùÓÐSQL£¬SQL¸ÄдºÍSQLË«ÅÜÂß¼ÇåÎú£¬¿ª·¢³É±¾¿É¿Ø£»
´´½¨³¬¶ÁÕʺţ¬¶ÔËùÓпâ±íÓжÁȨÏÞ£¬µ«Ö»¶ÔÓû§Ç¨ÒƵIJâÊÔ¿âÓÐдȨÏÞ£¬¿ÉÒÔ±ÜÃâÓ°ÏìÓû§Êý¾ÝµÄ·çÏÕ£»
3. Ç¨ÒÆ·½°¸ÏêϸÉè¼Æ
1. Hive SQLÌáÈ¡
Hive SQLÌáÈ¡°üÀ¨ÒÔϲ½Ö裺
¸ÄÔìHiveHistoryImpl£¬Ã¿¸ösessionÄÚÖ´ÐеÄËùÓÐSQLºÍcommand±£´æµ½HiveServer2µÄÒ»¸ö±¾µØÎļþÖУ¬ÕâЩÎļþ°´Ìì×éÖ¯£¬Ã¿ÌìÒ»¸öĿ¼
¶¨Ê±½«Ç°Ò»ÌìµÄHistoryĿ¼ÉÏ´«µ½hdfs
¿ª·¢HiveHistoryParser
HiveHistoryParserµÄÖ÷Òª¹¦ÄÜÊÇ£º
ÿÌì´ÓHDFSÏÂÔØËùÓÐHiveServer2µÄHistoryÎļþ£»
SQLÈ¥ÖØ£ºDataStudioÉϵÄÒ»¸öSQLÈÎÎñ¿ÉÄÜÒ»ÌìÖ´Ðжà´Î(±ÈÈçСʱÈÎÎñ)£¬ÈÎÎñÖ´ÐÐÒ»´Î»áÉú³ÉÒ»¸öеÄÖ´ÐÐId£¬Ö»±£ÁôÒ»ÌìÖÐ×î´óµÄÖ´ÐÐIdµÄSQL£»
ºÏ²¢SQL£ºÒ»¸öshellÈÎÎñ¿ÉÄܽ¨Á¢¶à¸ösessionÖ´ÐÐSQL£¬ÎªÁ˺óÃæÇ¨ÒÆshellÈÎÎñ£¬ÐèÒª°Ñ¶à¸ösessionµÄSQLºÏ²¢µ½Ò»Æð£»
Êä³öParse½á¹û£º°üÀ¨¶à¸öSQLÎļþºÍmetaÎļþ:
ÿ¸öÈÎÎñÖ´ÐеÄSQL±£´æµ½Ò»¸öÎļþÖУ¬ÎļþÃûÊÇÈÎÎñÃû³Æ¼ÓÖ´ÐÐId£¬ÎÒÃdzÆ×÷ ÔʼSQLÎļþ £»
metaÎļþ°üº¬SQLÎļþ·¾¶£¬ÈÎÎñÃû³Æ£¬ÏîÄ¿Ãû³Æ£¬Óû§Ãû£»

2. SQL¸Äд&Ë«ÅÜ
SQL¸Äд»á¶ÔÉÏÒ»²½Éú³ÉµÄÿ¸öÔʼSQLÎļþÖ´ÐÐÒÔϲ½Ö裺
ʹÓÃSparkµÄSessionState¶ÔSQLÎļþÖðÐзÖÎö£¬Ê¶±ðÊÇ·ñ°üº¬ÒÔÏÂÁ½Àà×Ӿ䣺
insert overwrite into
create table as select
Èç¹û°üº¬ÉÏÃæµÄÁ½Àà×Ӿ䣬ÔòÌáȡдÈëµÄÄ¿±ê¿â±íÃû³Æ£»
ÔÚ²âÊÔ¿âÖд´½¨ÓëÄ¿±ê¿â±íschemaÍêȫһÖµÄÁ½¸ö²âÊÔ±í£»
·Ö±ðʹÓÃÉÏÒ»²½´´½¨µÄ²âÊÔ¿â±íÌæ»»ÔʼSQLÎļþÖеĿâ±íÃûÉú³ÉÓÃÓڻطŵÄSQLÎļþ£¬Ò»¸öÔʼSQLÎļþ¸Äдºó»áÉú³ÉÁ½¸öSQLÎļþ£¬ÓÃÓÚºóÃæÁ½¸öÒýÇæ·Ö±ðÖ´ÐУ»
SQLË«Åܲ½ÖèÈçÏ£º
²¢·¢µÄʹÓÃSparkºÍHiveÖ´ÐÐÉÏÒ»²½Éú³ÉµÄÁ½¸öSQLÎļþ£»
¼Ç¼ʹÓÃÁ½ÖÖÒýÇæÖ´ÐÐSQLʱÆô¶¯µÄApplicationºÍÔËÐÐʱ¼ä£»
Êä³ö»Ø·Å½á¹ûµ½ÎļþÖУ¬Ö´ÐÐÿ¸öSQLÎļþ¶Ô»áÉú³ÉÒ»Ìõ½á¹û¼Ç¼£¬ °üÀ¨Hive ºÍSpark Ö´ÐÐSQLµÄʱ¼ä£¬Æô¶¯µÄApplicationÁÐ±í£¬ºÍÊä³öµÄÄ¿±ê¿â±íÃû³ÆµÈ£¬ ÈçÏÂͼËùʾ£º

3. ½á¹û¶Ô±È
½á¹û¶Ô±Èʱ»á±éÀúÿ¸ö»Ø·Å¼Ç¼£¬Í³¼ÆÒÔÏÂÖ¸±ê£º

¾ßÌåÁ÷³ÌÈçÏ£º
²éѯSpark SQLºÍHive SQLÊä³öµÄ¿â±íµÄ¼Ç¼Êý£»
²éѯÁ½ÖÖÒýÇæÊä³öµÄHDFSÎļþ¸öÊýºÍ´óС£»
¶Ô±ÈÁ½ÖÖÒýÇæµÄÊä³öÊý¾Ý£»
·Ö±ð¶ÔSparkºÍHiveµÄ²ú³ö±íÖ´ÐÐÒÔÏÂSQL£¬»ñÈ¡±íµÄ¸ÅÒªÐÅÏ¢

±È½ÏÁ½ÕűíµÄ¸ÅÒªÐÅÏ¢£º
Èç¹ûËùÓжÔÓ¦ÁеÄÖµÏàͬÔòÈÏΪ½á¹ûÒ»Ö£»
Èç¹û´æÔÚ²»Ò»ÖµÄÁУ¬Èç¹û¸ÃÁÐÊÇÊýÖµÀàÐÍ£¬Ôò¶Ô¸ÃÁмÆËã×î´ó¾«¶È²îÒ죬 SQLÈçÏ£º

ͳ¼ÆÁ½ÖÖÒýÇæÆô¶¯µÄApplicationÏûºÄµÄvcoreºÍmemory×ÊÔ´£»
Êä³ö¶Ô±È½á¹û£¬ °üÀ¨ÔËÐÐʱ¼ä£¬ ÏûºÄµÄvcoreºÍmemory£¬ÊÇ·ñÒ»Ö£¬Èç¹û²»Ò»ÖÂÊä³ö²»Ò»ÖµÄÁÐÃûÒÔ¼°×î´ó²îÒ죻
»ã×ÜÊý¾Ý½á¹û£¬²¢¶Ô»Ø·ÅµÄSQL·ÖΪÒÔϼ¸Àࣺ

¿ÉÇ¨ÒÆ£º Êý¾ÝÍêȫһÖ£¬ ²¢ÇÒʹÓÃSpark SQLÖ´ÐÐʹÓøüÉÙ×ÊÔ´£¬°üÀ¨ÔËÐÐʱ¼ä£¬vcoreºÍmemoryÒÔ¼°ÎļþÊý£»
¾Ñé¿ÉÇ¨ÒÆ£º ÔÚÅŲ鲻һÖÂʱ·¢ÏÖÓÐЩÊÇÂß¼ÕýÈ·µÄ (±ÈÈçcollect_set½á¹û˳Ðò²»Ò»ÖÂ)£¬Èç¹ûÓÐЩÈÎÎñ·ûºÏÕâЩ¾Ñ飬ÔòÈÏΪÊǾÑé¿ÉÇ¨ÒÆ£»
Êý¾Ý²»Ò»Ö£º Á½ÖÖÒýÇæ²ú³öµÄ½á¹û´æÔÚ²»Ò»ÖµÄÁУ¬¶øÇÒûÓÐÃüÖоÑ飻
Time_High£º Á½ÖÖÒýÇæ²ú³öµÄ½á¹ûÍêȫһÖ£¬µ«ÊÇSparkÖ´ÐÐSQLµÄÔËÐÐʱ¼ä´óÓÚHiveÖ´ÐÐSQLµÄʱ¼ä£»
Cpu_High£º Á½ÖÖÒýÇæ²ú³öµÄ½á¹ûÍêȫһÖ£¬µ«ÊÇSparkÖ´ÐÐSQLÏûºÄµÄcpu×ÊÔ´´óÓÚHiveÖ´ÐÐSQLÏûºÄµÄcpu×ÊÔ´£»
Memory_High£º Á½ÖÖÒýÇæ²ú³öµÄ½á¹ûÍêȫһÖ£¬µ«ÊÇSparkÖ´ÐÐSQLÏûºÄµÄmemory×ÊÔ´´óÓÚHiveÖ´ÐÐSQLÏûºÄµÄmemory×ÊÔ´£»
Files_High£º Á½ÖÖÒýÇæ²ú³öµÄ½á¹ûÍêȫһÖ£¬µ«ÊÇSparkÖ´ÐÐSQL²úÉúµÄÎļþÊý´óÓÚHiveÖ´ÐÐSQL²úÉúµÄÎļþÊý£»
Óï·¨²»¼æÈÝ£º ÔÚSQL¸Äд½×¶Î½âÎöSQLʱ±¨Óï·¨´íÎó£»
ÔËÐÐʱÒì³££º ÔÚË«Åܽ׶Σ¬Hive SQL»òÕßSpark SQLÔÚÔËÐйý³ÌÖÐʧ°Ü£»
4. Ç¨ÒÆ
Ç¨ÒÆ±È½Ï¼òµ¥£¬ ²½ÖèÈçÏ£º
ÕûÀíÇ¨ÒÆÈÎÎñÁбíÒÔ¼°¶ÔÓ¦µÄÅäÖòÎÊý£»
µ÷ÓÃDataStudio½Ó¿Ú°ÑÈÎÎñÀàÐÍÐÞ¸ÄΪSparkSQLÀàÐÍ£»
ÖØÅÜÈÎÎñ£»
5. ÎÊÌâÅŲé&ÐÞ¸´
Èç¹ûSQLÊÇ¡°¿ÉÇ¨ÒÆ¡±»òÕß¡°¾Ñé¿ÉÇ¨ÒÆ¡±£¬¿ÉÒÔÖ´ÐÐÇ¨ÒÆ£¬ÆäËüµÄÈÎÎñÐèÒªÅŲ飬Õⲿ·ÖÊÇ×îºÄʱºÄÁ¦µÄ£¬Ç¨Òƹý³ÌÖд󲿷Öʱ¼ä¶¼ÊÇÔÚµ÷²éºÍÐÞ¸´ÕâЩÎÊÌâ¡£ÐÞ¸´Ö®ºóÔÙÖ´ÐдÓÍ·¿ªÊ¼£¬ÌáÈ¡×îÐÂÈÎÎñµÄSQL£¬È»ºóSQL¸ÄдºÍË«ÅÜ£¬½á¹û¶Ô±È£¬Âú×ãÇ¨ÒÆÌõ¼þÔò˵Ã÷ÐÞ¸´ÁËÎÊÌ⣬¿ÉÒÔÇ¨ÒÆ£¬·ñÔò¼ÌÐøÅŲ飬Òò´ËÇ¨ÒÆ¹ý³ÌÊÇÒ»¸öÑ»·Íù¸´µÄ¹ý³Ì£¬Ö±µ½SQLÂú×ãÇ¨ÒÆÌõ¼þ£¬ÕûÌå¹ý³ÌÈçÏÂͼËùʾ£º

4. ÒýÇæ²îÒì
ÔÚÇ¨ÒÆµÄ¹ý³ÌÖÐÎÒÃÇ·¢ÏÖÁ˺ܶàÁ½ÖÖÒýÇæ²»Í¬µÄµØ·½£¬Ö÷Òª°üÀ¨Óï·¨²îÒ죬UDF²îÒ죬¹¦ÄܲîÒìºÍÐÔÄܲîÒì¡£
1. Óï·¨²îÒì
ÓÐЩHive SQLʹÓÃSpark SQLÖ´ÐÐÔÚÓï·¨·ÖÎö½×¶Î¾Í»á³ö´í£¬ÓÐЩÓï·¨²îÒìÎÒÃÇÔÚÄÚ²¿°æ±¾ÒѾÐÞ¸´£¬Ä¿Ç°ÕýÔÚ·´À¡ÉçÇø£¬ÕýÔÚºÍÉçÇøÌÖÂÛ£¬»¹ÓÐһЩĿǰûÓÐÐÞ¸´¡£
1.1 ÓÃÀýÉè¼Æ
UDTFаæinitialize½Ó¿ÚÖ§³Ö£¬¶ÔÆëHive SQL [SPARK-33704]
Window Function ²»Ö§³ÖûÓÐorder by×Ó¾äµÄ³¡¾°
Join ×Ó²éѯ֧³Örand Ëæ»ú·Ö²¼Ìõ¼þ£¬ÔöÇ¿Óï·¨¼æÈÝ
Orc/Orcfile ´æ´¢ÀàÐÍ´´½¨Óï¾äÆÁ±ÎROW FORMAT DELIMITEDÏÞÖÆ [SPARK-33755]
`DB.TB` ʶ±ðÖ§³Ö£¬¶ÔÆëHive SQL [SPARK-33686]
Ö§³ÖCREATE TEMPORARY TABLE
¸÷ÀàHive UDFµÄÖ§³Öµ÷Óã¬Ö÷Òª°üÀ¨get_json_object£¬datediff£¬unix_timestamp£¬to_date£¬collect_set£¬date_sub [SPARK-33721]
DROP²»´æÔڵıíºÍ·ÖÇø£¬Spark SQL±¨´í£¬Hive SQL Õý³£ [SPARK-33637]
ɾ³ý·ÖÇøÊ±Ö§³ÖÉèÖùýÂËÌõ¼þ [SPARK-33691]
1.2 δÐÞ¸´
MapÀàÐÍ×ֶβ»Ö§³ÖGROUP BY²Ù×÷
Operation not allowed£ºALTER TABLE CONCATENATE
2. UDF²îÒì
ÔÚÅŲéÊý¾Ý²»Ò»ÖµÄSQL¹ý³ÌÖУ¬ÎÒÃÇ·¢ÏÖÓÐЩÊÇÒòΪÊäÈëÊý¾ÝµÄ˳Ðò²»Í¬Ôì³ÉµÄ£¬ ÕâЩ²îÒìÂß¼ÉÏÊÇÕýÈ·µÄ£¬¶øÓÐЩÊÇUDF¶ÔÒì³£ÖµµÄ´¦Àí·½Ê½²»Ò»ÖÂÔì³ÉµÄ£¬»¹ÓÐÐèҪעÒâµÄÊÇUDFÖ´Ðл·¾³²»Í¬Ôì³ÉµÄ½á¹û²îÒì¡£
2.1 ˳Ðò²îÒì
ÕâЩÒòΪÊäÈëÊý¾ÝµÄ˳Ðò²»Í¬Ôì³ÉµÄ½á¹û²îÒìÂß¼ÉÏÊÇÒ»Öµģ¬¶ÔÒµÎñÎÞÓ°Ï죬Òò´ËÔÚÇ¨ÒÆ¹ý³ÌÖпÉÒÔºöÂÔÕâЩ²îÒ죬ÕâÀà²îÒìµÄSQLÈÎÎñÊôÓÚ¾Ñé¿ÉÇ¨ÒÆ¡£
2 .1.1 collect_set
¼ÙÉèÊý¾Ý±íÈçÏ£º

Ö´ÐÐÈçÏÂSQL£º

Ö´Ðнá¹û£º

²îÒì˵Ã÷£º
collect_setÖ´Ðнá¹ûµÄ˳ÐòÈ¡¾öÓڼǼ±»É¨ÃèµÄ˳Ðò£¬Spark SQLÖ´Ðйý³ÌÖÐÊǶà¸öÈÎÎñ²¢·¢Ö´Ðеģ¬Òò´Ë¼Ç¼±»¶ÁÈ¡µÄ˳ÐòÊÇÎÞ·¨±£Ö¤µÄ.
2 .1.2 collect_list
¼ÙÉèÊý¾Ý±íÈçÏ£º

Ö´ÐÐÈçÏÂSQL£º

Ö´Ðнá¹û£º

²îÒì˵Ã÷£º
collect_listÖ´Ðнá¹ûµÄ˳ÐòÈ¡¾öÓڼǼ±»É¨ÃèµÄ˳Ðò£¬Spark SQLÖ´Ðйý³ÌÖÐÊǶà¸öÈÎÎñ²¢·¢Ö´Ðеģ¬Òò´Ë¼Ç¼±»¶ÁÈ¡µÄ˳ÐòÊÇÎÞ·¨±£Ö¤µÄ¡£
2 .1.3 row_number
¼ÙÉèÊý¾Ý±íÈçÏ£º

Ö´ÐÐÈçÏÂSQL£º

Ö´Ðнá¹û£º

²îÒì˵Ã÷£º
Ö´ÐÐrow_numberʱ£¬ÔÚÒ»¸ö·ÖÇøÄÚ²¿£¬¿ÉÒÔ±£Ö¤order by×Ö¶ÎÊÇÓÐÐòµÄ£¬¶ÔÓÚ·Ç·ÖÇø·Çorder by×ֶεÄ˳ÐòÊÇûÓб£Ö¤µÄ¡£
2 .1.4 mapÀàÐÍ×ֶζÁд
Êý¾Ý±í½¨±íÓï¾ä£º

¼ÙÉèÊý¾Ý±íÈçÏ£º

Ö´ÐÐÈçÏÂSQL£º

Ö´Ðнá¹û£º

²îÒì˵Ã÷£º
MapÀàÐÍÊÇÎÞÐòµÄ£¬Í¬Ò»·ÝÊý¾Ý£¬ÔÚqueryʱÏÔʾµÄ¸÷¸ökeyµÄ˳Ðò»áÓб仯¡£
2 .1.5 sum(double/float)
¼ÙÉèÊý¾Ý±íÈçÏ£º

Ö´ÐÐÈçÏÂSQL£º

Ö´Ðнá¹û£º

²îÒì˵Ã÷£º
ÕâÊÇÓÉfloat/doubleÀàÐ͵ıíʾ·½Ê½¾ö¶¨µÄ£¬¸¡µãÊý²»ÄܱíʾËùÓеÄʵÊý£¬ÔÚÖ´ÐÐÔËËã¹ý³ÌÖлáÓо«¶È¶ªÊ§£¬¶ÔÓÚ¼¸¸ö¸¡µãÊý£¬Ö´Ðмӷ¨Ê±µÄ˳Ðò²»Í¬£¬½á¹ûÓÐʱ¾Í»á²»Í¬¡£

2 .1.6 ˳Ðò²îÒì½â¾ö·½°¸
ÓÉÒÔÉÏUDFÔì³ÉµÄ²îÒì¿ÉÒÔºöÂÔ£¬Ïà¹ØÈÎÎñÈç¹ûÔÚ×ÊÔ´·½ÃæÒ²ÓнÚÊ¡£¬ÄÇô×îÖÕµÄ״̬ÊǾÑé¿ÉÇ¨ÒÆ×´Ì¬£¬·ûºÏÇ¨ÒÆÌõ¼þ¡£
2.2 ·Ç˳Ðò²îÒì
ÏÂÃæ¼¸¸öÈÕÆÚ/ʱ¼äÏà¹Øº¯Êý£¬µ±ÓÐÒì³£ÊäÈëÊÇSpark SQL»á·µ»ØNULL£¬¶øHive SQL»á·µ»ØÒ»¸ö·ÇNULLÖµ¡£
2 .2.1 datediff
¶ÔÓÚÒì³£ÈÕÆÚ£¬±ÈÈç0000-00-00Ö´ÐÐdatediffÁ½Õß»á´æÔÚ²îÒì¡£

2 .2.2 unix_timestamp
¶ÔÓÚ24µãSparkÈÏΪÊÇ·Ç·¨µÄ·µ»ØNULL£¬¶øHiveÈÎÎñÊÇÕý³£µÄ£¬Ï±íʱִÐÐunix_timestamp(concat('2020-06-01', ' 24:00:00'))ʱµÄ²îÒì¡£

2 .2.3 to_date
µ±Ô»òÕßÈÕÊÇ00ʱHiveÈÔÈ»»á·µ»ØÒ»¸öÈÕÆÚ£¬µ«ÊÇSpark»á·µ»ØNULL¡£

2 .2.4 date_sub
µ±Ô»òÕßÈÕÊÇ00ʱHiveÈÔÈ»»á·µ»ØÒ»¸öÈÕÆÚ£¬µ«ÊÇSpark»á·µ»ØNULL¡£

2 .2.5 date_add
µ±Ô»òÕßÈÕÊÇ00ʱHiveÈÔÈ»»á·µ»ØÒ»¸öÈÕÆÚ£¬µ«ÊÇSpark»á·µ»ØNULL¡£

2 .2.6 ·Ç˳Ðò²îÒì½â¾ö·½°¸
ÕâЩ²îÒìÊÇÊÇÒòΪ¶ÔÒì³£UDF²ÎÊýµÄ´¦ÀíÂß¼²»Í¬Ôì³ÉµÄ£¬ËäÈ»Spark SQL·µ»ØNULL¸üºÏÀí£¬µ«ÊÇÏÖÓеÄHive SQLÈÎÎñÓû§ÊÊÓ¦ÁËÕâÖÖ´¦ÀíÂß¼£¬ËùÒÔΪÁ˲»Ó°ÏìÏÖÓÐSQLÈÎÎñ£¬ÎÒÃǶÔÕâÀàUDF×öÁ˼æÈÝ´¦Àí£¬Óû§¿ÉÒÔͨ¹ýÅäÖÃÀ´¾ö¶¨Ê¹ÓÃHiveÄÚÖú¯Êý»¹ÊÇSparkµÄÄÚÖÃUDF¡£
2.3 UDFÖ´Ðл·¾³²îÒì
2 .3.1 ²îÒì˵Ã÷
»ùÓÚMapReduceµÄHive SQLÒ»¸öTask»áÆô¶¯Ò»¸ö½ø³Ì£¬½ø³ÌÖеÄÖ÷Ï̸߳ºÔðÊý¾Ý´¦Àí£¬ Òò´ËÔÚHive SQLÖÐUDFÖ»»áÔÚµ¥³ÌÖÐÖ´ÐС£
¶øSpark Ò»¸öExecutor¿ÉÄÜ»áÆô¶¯¶à¸öTask£¬ÈçÏÂͼËùʾ¡£Òò´ËÔÚSpark SQLÖÐ×Ô¶¨ÒåUDFʱÐèÒª¿¼ÂÇḬ̈߳²È«ÎÊÌâ¡£

2 .3.2 ²îÒì½â¾ö·½°¸
ÏÂÃæÊÇÒ»¸ö·ÇḬ̈߳²È«µÄʾÀý£¬UDFÄÚ²¿¹²Ïí¾²Ì¬±äÁ¿£¬ÔÚÖ´ÐÐUDFʱ»á¶ÁдÕâ¸ö¾²Ì¬±äÁ¿¡£

½â¾ö·½°¸Ò²±È½Ï¼òµ¥£¬Ò»ÖÖÊǼÓËø£¬ÈçÏÂͼËùʾ£º

ÁíÒ»ÖÖÊÇÈ¡Ïû¾²Ì¬³ÉÔ±£¬ÈçÏÂͼËùʾ£º

3. ÐÔÄÜ&¹¦ÄܲîÒì
3.1 СÎļþºÏ²¢
Hive SQL¿ÉÒÔͨ¹ýÉèÖÃÒÔÏÂÅäÖúϲ¢Ð¡Îļþ£¬MR Job½áÊøºó£¬ÅжÏÉú³ÉÎļþµÄƽ¾ù´óС£¬Èç¹ûСÓÚ·§Öµ£¬¾ÍÔÙÆô¶¯Ò»¸öJobÀ´ºÏ²¢Îļþ¡£

ĿǰSpark SQL²»Ö§³ÖСÎļþºÏ²¢£¬ÔÚÇ¨ÒÆ¹ý³ÌÖУ¬ÎÒÃǾ³£·¢ÏÖSpark SQLÉú³ÉµÄÎļþÊý¶àÓÚHive SQL£¬Îª´ËÎÒÃDzο¼Hive SQLµÄʵÏÖÔÚSpark SQLÖÐÒýÈëÁËСÎļþºÏ²¢¹¦ÄÜ¡£
ÔÚInsertIntoHiveTable ÖÐÅжÏÈç¹û¿ªÆôСÎļþºÏ²¢£¬²¢ÇÒÎļþµÄƽ¾ù´óСµÍÓÚãÐÖµÔòÖ´Ðкϲ¢£¬ºÏ²¢Ö®ºóÔÙÖ´ÐÐloadTable»òÕßloadPartition²Ù×÷¡£
3.2 Spark SQLÖ§³ÖClusterģʽ
Hive SQLÈÎÎñÊÇDataStudioͨ¹ýbeeline -fÖ´Ðеģ¬¿Í»§¶ËÖ»¸ºÔð·¢ËÍSQLÓï¾ä¸øHS2£¬ÒѾ»ñȡִÐнá¹û£¬Òò´ËÊǷdz£ÇáÁ¿µÄ¡£¶øSpark SQLÖ»Ö§³ÖClientģʽ£¬DriverÔÚClient½ø³ÌÖУ¬Òò´ËClientģʽִÐÐSpark SQLʱ£¬ÓÐʱ»áÕ¼ÓúܶàµÄ×ÊÔ´£¬DataStudioÎÞ·¨¸ÐÖªSpark DriverµÄ×ÊÔ´¿ªÏú£¬ËùÒÔÔÚDataStudio²ãÃæ»á´øÀ´ÒÔÏÂÎÊÌ⣺
ÐγÉ×ÊÔ´Èȵ㣬ӰÏìÈÎÎñÖ´ÐУ»
Ëæ×ÅÇ¨ÒÆµ½Spark SQLµÄÈÎÎñÔ½À´Ô½¶à£¬DataStudioÐèÒªÔ½À´Ô½¶àµÄ»úÆ÷µ÷¶ÈSQLÈÎÎñ£»
ClientģʽÈÕÖ¾±£ÁôÔÚ±¾µØ£¬ÅŲéÎÊÌâʱ²»·½±ã¿´ÈÕÖ¾£»
ËùÒÔÎÒÃÇ¿ª·¢ÁËSpark SQLÖ§³ÖClusterģʽ£¬¸Ãģʽֻ֧³Ö·Ç½»»¥Ê½·½Ê½Ö´ÐÐSQL£¬°üÀ¨spark-sql -eºÍspark-sql -f£¬²»Ö§³Ö½»»¥Ê½Ä£Ê½¡£
3.3 ·ÖÇø¼ô²ÃÓÅ»¯
Ç¨ÒÆ¹ý³ÌÖÐÎÒÃÇ·¢Ïִ󲿷ÖÈÎÎñµÄ·ÖÇøÌõ¼þ°üÀ¨concat£¬ concat_ws£¬ substrµÈUDF£¬ HiveServer2»áµ÷ÓÃMetaStoreµÄgetPartitionsByExpr·½·¨·µ»Ø·ûºÏ·ÖÇøÌõ¼þµÄÓÐЧ·ÖÇø£¬±ÜÃâÎÞЧµÄɨÃ裬 µ«ÊÇSpark SQLµÄ·ÖÇø¼ô²ÃÖ»Ö§³ÖÓÉAttributeºÍLiteral×é³Ékey/value½á¹¹µÄν´ÊÌõ¼þ£¬ÕâÒ»·½Ãæµ¼ÖÂÎÞ·¨ÓÐЧ·ÖÇø¼ô²Ã£¬»á²éѯËùÓзÖÇøµÄÊý¾Ý£¬ Ôì³É¶ÁÈ¡´óÁ¿ÎÞЧÊý¾Ý£¬ÁíÒ»·½Ãæ²éѯËùÓзÖÇøµÄÔªÊý¾Ý£¬µ¼ÖÂMetaStore¶ÔMySQL²éѯѹÁ¦¼¤Ôö£¬µ¼ÖÂmysql½ø³Ì°Ñcpu´òÂú¡£ÎÒÃÇÔÚÉçÇø°æ±¾µÄ»ù´¡Éϵü´úÖ§³ÖÁ˶àÖÖ³¡¾°µÄ·ÖÇøÁªºÏ¼ô²Ã£¬Ä¿Ç°Äܹ»¸²¸ÇÉú²úÈÎÎñ90%ÒÔÉϵij¡¾°¡£
concat/concat_wsÁªºÏ¼ô²Ã³¡¾°

substr ÁªºÏ¼ô²Ã³¡¾°

concat/concat_ws&substr×éºÏ³¡¾°

ĿǰÒѾ·´À¡ÉçÇø£¬ÕýÔÚÌÖÂÛÖУ¬¾ßÌå¿É²Î¿¼[SPARK-33707][SQL] Support multiple types of function partition pruning on hive metastore
5. Ç¨ÒÆ½á¹û
¾¹ý6¸ö¶àÔµÄÍŶӵÄŬÁ¦£¬ÎÒÃÇÇ¨ÒÆÁË1Íò¶à¸öHive SQLÈÎÎñµ½Spark SQL£¬ÔÚÇ¨ÒÆ¹ý³ÌÖУ¬Ëæ×Åspark SQLÈÎÎñµÄÔö¼Ó£¬SQLÈÎÎñµÄÖ´ÐÐʱ¼äÔÚÖð½¥¼õÉÙ£¬´Ó×î³õµÄ1000+ÃëϽµµ½600+ÃëÈçÏÂͼËùʾ£º

Ç¨ÒÆºóSpark SQLÈÎÎñÕ¼±È85%£¬SQLÈÎÎñÔËÐÐʱ¼ä½ÚÊ¡40%£¬¼ÆËã×ÊÔ´½ÚÊ¡21%£¬ÄÚ´æ×ÊÔ´½ÚÊ¡49%£¬Ç¨ÒƵÄÊÕÒæÊǷdz£´óµÄ¡£

6. ÏÂÒ»²½¼Æ»®
Ç¨ÒÆÖ®ºóSparkÒѾ³ÉΪSQLÈÎÎñµÄÖ÷Á÷ÒýÇæ£¬µ«ÊÇ»¹ÓдóÁ¿µÄshellÀàÐÍÈÎÎñʹÓÃHiveÖ´ÐÐSQL£¬ËùÒÔºóÐøÎÒÃÇ»áÇ¨ÒÆshellÀàÐÍÈÎÎñ£¬°ÑshellÖеÄHive SQLÇ¨ÒÆµ½Spark SQL¡£
ÔÚÉú²ú»·¾³ÖУ¬ÓÐЩshuffle ±È½ÏÖеÄÈÎÎñ¾³£»áÒòΪshuffle fetchÖØÊÔÉõÖÁʧ°Ü£¬ÎÒÃÇÏëÓÅ»¯Spark External Shuffle Service¡£
ÉçÇøÍÆ³öSpark 3.xÒ²°ëÄê¶àÁË£¬ÔÚ¹¦ÄܺÍÐÔÄÜÉÏÓкܴóÌáÉý£¬ËùÒÔÎÒÃÇÒ²ÏëºÍÉçÇø±£³Öͬ²½£¬Éý¼¶Sparkµ½3.x°æ±¾¡£
|