°¡¿Â¾ÆÀÌ ºñ¾ÆÀÌ¸ÅÆ®¸¯½º ºñÁ¨Æ®·Î ¾ÆÀÌÆ¼ÄÞ ¿¥Åõ¼ÒÇÁÆ® ÁöƼ¿ø Ƽ¸Æ½º¼ÒÇÁÆ® Å丶Åä½Ã½ºÅÛ Æ÷½Ã¿¡½º ÇÚµð¼ÒÇÁÆ® µ¥ÀÌÅͽºÆ®¸²Áî ¾ËÆ¼º£À̽º ³ª¹«±â¼ú ¾Ë¼­Æ÷Æ® À§¿¥ºñ ¿£Å°¾Æ ÀÎÇÁ¶ó´Ð½º ¸¶Å©¾Ö´Ï ½ºÄßÁ¤º¸Åë½Å À̱۷ç½ÃÅ¥¸®Æ¼ Áö¶õÁö±³½ÃÅ¥¸®Æ¼ ÆÄ¼ö´åÄÄ ÇǾØÇǽÃÅ¥¾î
02.18
ÁÖ¿ä´º½º
´º½ºÈ¨ > Ä®·³
[°­ÁÂ] ¿ÀǼҽº MPP µ¥ÀÌÅÍ ¿þ¾îÇÏ¿ì¡Á¤À±Áø ÇǺ¸Å» ÇÁ¸°½ÃÇà Å×Å©³î·ÎÁö½ºÆ®

   
¡ã Á¤À±Áø ÇǺ¸Å» ÇÁ¸°½ÃÇà Å×Å©³î·ÎÁö½ºÆ®

[ÄÄÇ»ÅÍ¿ùµå] MPP µ¥ÀÌÅͺ£À̽º¶õ
¸¶ÀÌÅ©·Î¼­ºñ½º°¡ ¹ß´ÞÇϸ鼭 °¢ ¸¶ÀÌÅ©·Î¼­ºñ½º¿¡ ÇÒ´çµÈ ¹®Á¦ÀÇ ÇØ°áÀ» À§ÇØ ±× ¸ñÀû¿¡ ¸Â´Â µ¥ÀÌÅÍ ÀúÀå¼ÒÀÇ ¼±ÅÃÀÌ ¸Å¿ì Áß¿äÇØÁ³´Ù. Çʿ信 µû¶ó ÀûÀýÇÑ µ¥ÀÌÅÍ ÀúÀå¼Ò¸¦ ¼±ÅÃÇϰí, °¢ ¸¶ÀÌÅ©·Î ¼­ºñ½º°¡ API ¶Ç´Â ¸Þ½ÃÁö ¹ö½º¸¦ »ç¿ëÇØ¼­ ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ ÁÖ°í¹Þ´Â ÇüÅÂÀÇ ‘ÇÃ·Î¿ì’ ±¸ÇöÀº Á¡Á¡ Áß¿äÇÑ ºÎºÐÀÌ µÇ¾î°¡°í ÀÖ´Ù.

MPP µ¥ÀÌÅͺ£À̽º(Massively Parallel Processing Database)´Â º¸Åë ‘µ¥ÀÌÅÍ ¿þ¾îÇϿ졒À¸·Î ¾Ë·ÁÁø ¿öÅ©·Îµå¸¦ ó¸®Çϱâ À§ÇØ ÀÚÁÖ »ç¿ëµÈ´Ù. Áï ¼ö°³¿ù ¶Ç´Â ¼ö³â, ¼ö½Ê ³â¿¡ À̸£´Â ´ë±Ô¸ðÀÇ µ¥ÀÌÅ͸¦ ÀúÀåÇϰí ÀϹÝÀûÀ¸·Î SQLÀ» »ç¿ëÇØ ¿øÇÏ´Â °á°ú¸¦ Á¶È¸Çϴµ¥ »ç¿ëÇϰï ÇÑ´Ù. ±×¸®°í ÀÌ Á¶È¸¸¦ ¹ÙÅÁÀ¸·Î ¹ß°ßµÈ ÆÐÅÏÀ» ¸ðµ¨È­Çؼ­ ½Ç½Ã°£À¸·Î À¯ÀԵǴ µ¥ÀÌÅÍ¿¡ ¹Ý¿µÇϰï ÇÑ´Ù. ´ë·®ÀÇ °ú°Å µ¥ÀÌÅÍ¿¡¼­ ÆÐÅÏÀ» ã¾Æ ÇöÀç À¯ÀԵǴ µ¥ÀÌÅÍ¿¡ ½Ç½Ã°£À¸·Î ¸ðµ¨À» Àû¿ëÇÏ´Â ¹æ¹ýÀ» º¸Åë ¸Ó½Å ·¯´×À̶ó°í ºÎ¸£¸ç, µû¶ó¼­ MPP µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåµÈ µ¥ÀÌÅÍ¿¡ ´õ ¸¹Àº Äõ¸®¸¦ ¼öÇàÇÒ¼ö·Ï ÀÇ¹Ì ÀÖ´Â ¸ðµ¨À» ãÀ» È®·üÀÌ ´õ ³ô¾ÆÁø´Ù°í ÇÒ ¼ö ÀÖ°Ú´Ù.

MPP µ¥ÀÌÅͺ£À̽ºÀÇ Æ¯Â¡Àº ¿©·¯ °¡Áö°¡ ÀÖÁö¸¸, ¾Æ·¡¿Í °°ÀÌ ¸î °¡Áö ÁÖ¿ä »çÇ×À» Á¤¸®ÇØ º¸ÀÚ.

¡á µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¶§ µð½ºÅ©¿¡ Ä÷³ ±â¹ÝÀ¸·Î ÀúÀåÇÑ´Ù.
¡á ÀϹÝÀûÀ¸·Î ‘¸¶½ºÅÍ’¶ó ºÒ¸®´Â ³ëµå¿Í ‘ÄÄǻƮ’ ³ëµå°¡ ÀÖ´Ù. Äõ¸®´Â ¸¶½ºÅÍ¿¡ ÀÇÇØ ºÐ»êµÇ¾î °¢ ÄÄǻƮ ³ëµå¿¡¼­ ½ÇÇàµÈ´Ù.
¡á ´ë·®ÀÇ µ¥ÀÌÅÍ ÀúÀå¿¡ »ç¿ëÇϹǷΠºÐ»ê ÀúÀå ¹æ½Ä ¹× ¾ÐÃà °ü·Ã ¼º´É ÁöÇ¥°¡ Áß¿äÇÏ´Ù.
¡á µ¥ÀÌÅ͸¦ ÄÄǻƮ ³ëµå¿¡ ³ª´©¾î ÀúÀåÇϴµ¥, ÀÌ ºÐ»ê ÀúÀå ¹æ¹ý¿¡ µû¶ó ¼º´ÉÀÌ Á¿ìµÈ´Ù.
¡á S3¿Í °°ÀÌ raw µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â µµ±¸µé°ú ¿¬µ¿ÀÌ °¡´ÉÇÏ´Ù.
¡á ¸Ó½Å ·¯´× ¶Ç´Â ºÐ¼® µµ±¸¿Í ¿¬µ¿ÀÌ °¡´ÉÇÏ´Ù.

µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¶§ µð½ºÅ©¿¡ Ä÷³ ±â¹ÝÀ¸·Î ÀúÀåÇÑ´Ù´Â °ÍÀº, ÀϹÝÀûÀÎ OLTP µ¥ÀÌÅͺ£À̽º¿Í´Â ´Ù¸¥ °ÍÀÌ´Ù. º¸Åë ÀÌ·± ºÐ¼® ±â¹ÝÀÇ µ¥ÀÌÅͺ£À̽ºÀÇ °æ¿ì ´ë·®ÀÇ µ¥ÀÌÅ͸¦ ´Ù·ç±â ¶§¹®¿¡ µ¥ÀÌÅÍÀÇ ÀúÀå È¿À²°ú ºÐ¼®À» À§ÇØ ÇѲ¨¹ø¿¡ ¸¹Àº µ¥ÀÌÅ͸¦ ºÒ·¯¿À±â¿¡´Â Ä÷³ ±â¹ÝÀÇ ¹æ½ÄÀÌ À¯¸®ÇÏ´Ù.

¿Â¶óÀÎ Æ®·£Àè¼Ç¿¡¼­´Â ÇѲ¨¹ø¿¡ ¸¹Àº µ¥ÀÌÅÍ º¸´Ù´Â ƯÁ¤ µ¥ÀÌÅ͸¦ ºü¸£°Ô °¡Á®¿À´Â °ÍÀÌ Áß¿äÇϱ⠶§¹®¿¡, ¿­(row)±â¹ÝÀ¸·Î µ¥ÀÌÅ͸¦ ÀúÀåÇÏ´Â °ÍÀÌ À¯¸®ÇÏ´Ù. ¶ÇÇÑ OLTP µ¥ÀÌÅͺ£À̽ºÀÇ °æ¿ì ºñ±³Àû ÀûÀº ¾çÀÇ µ¥ÀÌÅÍ¿¡ ´ëÇÑ ÀԷ°ú ¼öÁ¤ »èÁ¦ µîÀÌ ºó¹øÇÏ°Ô ¹ß»ýÇÏÁö¸¸, ºÐ¼®À» À§ÇÑ µ¥ÀÌÅͺ£À̽ºÀÇ °æ¿ì Áö¼ÓÀûÀÎ µ¥ÀÌÅÍÀÇ À¯ÀÔÀ» ÅëÇØ ÀúÀåµÈ ´ë·®ÀÇ µ¥ÀÌÅ͸¦ ´Ù·ç±â ¶§¹®¿¡ Ä÷³ ±â¹ÝÀÇ ÀúÀå ¹æ½ÄÀÌ µð½ºÅ© »ç¿ëµîÀÇ Ãø¸é¿¡¼­ ¸Å¿ì À¯¸®ÇÏ´Ù.

MPPÀÇ ¹æ½Ä¿¡¼­´Â '°øÀ¯ ½ºÅ丮Áö ¸ðµ¨'À» »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ¸Å¿ì Å« Â÷ÀÌÁ¡ÀÌ´Ù. ¼¼¿ùÀÌ Áö³ª¸ç µ¥ÀÌÅÍ ¿þ¾îÇϿ졿¡ ¿ä±¸µÇ´Â ±Ô¸ð´Â Å×¶ó¹ÙÀÌÆ® ±Ô¸ð¿¡¼­ ÆäŸ¹ÙÀÌÆ®¸¦ ³Ñ¾î Á¦Å¸¹ÙÀÌÆ®¿¡ À̸£°Ô µÈ´Ù. ¼­ºñ½º¿¡¼­ ¹ß»ýÇÏ´Â ÀÌ·± ´ë±Ô¸ðÀÇ µ¥ÀÌÅ͸¦ ÀúÀåÇϱâ À§Çؼ­´Â óÀ½ºÎÅÍ ¼ö ÆäŸ¹ÙÀÌÆ®ÀÇ ½ºÅ丮Áö¸¦ ÁغñÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, µ¥ÀÌÅÍÀÇ ÁõºÐ¿¡ µû¶ó ÇÔ²² ½ºÅ丮Áö¿Í ¼­¹ö¸¦ Ãß°¡ÇÏ´Â ¹æ½ÄÀÌ ÅõÀÚ À§ÇèÀ» ³·Ãß´Â ¹æ¹ýÀ̸ç, ÈξÀ °æÁ¦ÀûÀÌ´Ù.

¿©·¯´ëÀÇ ¼­¹ö°¡ ½ºÅ丮Áö¸¦ °øÀ¯ÇÏ´Â ¸ðµ¨¿¡µµ ¿©·¯°¡Áö ÀåÁ¡ÀÌ ÀÖÁö¸¸, MPP µ¥ÀÌÅͺ£À̽º¿¡¼­´Â ÀÌ·± °øÀ¯ Çüź¸´Ù ¼­¹ö¿Í ÀÌ ¼­¹ö¿¡ ¿¬°áµÈ ½ºÅ丮Áö¸¦ ÇÔ²² È®ÀåÇÏ´Â ¹æ½ÄÀ¸·Î Ŭ·¯½ºÅÍÀÇ ±Ô¸ð¸¦ ´Ã·Á³ª°¥ ¼ö ÀÖ´Ù. ÀÌ·± ÇüÅÂÀÇ È®ÀåÀ» ¼öÇàÇÏ·Á¸é '¾Æ¹«°Íµµ °øÀ¯ÇÏÁö ¾Ê´Â' ÇüÅÂÀÇ Å¬·¯½ºÅ͸µ ±â¼úÀÌ ÇÊ¿äÇÏ´Ù.

   
¡ã https://gpdb.docs.pivotal.io/43240/graphics/highlevel_arch.jpg

´ë·®ÀÇ µ¥ÀÌÅ͸¦ ÄÄǻƮ ³ëµå(¶Ç´Â ¼¼±×¸ÕÆ® ³ëµå)¿¡ ºÐ¸®Çؼ­ ÀúÀåÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î 100¸¸°³ÀÇ µ¥ÀÌÅͰ¡ ÀÖ´Ù¸é, 10°³ÀÇ ÄÄǻƮ ³ëµå·Î ±¸¼ºµÈ MPP µ¥ÀÌÅͺ£À̽º¿¡¼­´Â 10¸¸ °³¾¿ ³ª´©¾î ÀúÀåÇÏ´Â ¹æ½ÄÀ» ÃëÇÒ ¼ö ÀÖ´Ù. À̶§ ºÐ¼®À» À§ÇÑ Äõ¸®°¡ ¸¶½ºÅÍ ³ëµå·Î À¯ÀԵǸé, ¸¶½ºÅÍ ³ëµå´Â ÀÌ Äõ¸®ÀÇ ½ÇÇàÀ» 10°³ÀÇ ÄÄǻƮ ³ëµå¿¡ ºÐ»êÇØ¼­ ½ÇÇàÇϰí, ±× °á°ú¸¦ ÃëÇÕÇØ¼­ Ŭ¶óÀÌ¾ðÆ®¿¡ Àü´ÞÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÑ´Ù. µû¶ó¼­ ÇÑ´ëÀÇ µ¥ÀÌÅͺ£À̽º¿¡¼­ ´ë·®ÀÇ µ¥ÀÌÅ͸¦ ó¸®ÇÏ´Â ´ë½Å, 10°³ ÄÄÇ»ÅÍÀÇ ÀÚ¿øÀ» ´õ ÀÛÀº ¼öÀÇ µ¥ÀÌÅͼ¼Æ®¿¡ Àû¿ëÇϹǷΠÈξÀ ºü¸¥ °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Â ¹æ½ÄÀÌ´Ù.

ÇÏÁö¸¸ ÀÌ·¸°Ô µ¥ÀÌÅ͸¦ ºÐ»êÇØ¼­ ÀúÀåÇÏ´Â ¹æ½ÄÀ» ÃëÇϱ⠶§¹®¿¡ ÁÖÀǰ¡ ÇÊ¿äÇÑ ºÎºÐµµ ÀÖ´Ù. ƯÈ÷ Á¶ÀÎÀ» »ç¿ëÇÏ´Â °æ¿ì, µ¥ÀÌÅÍ ÀúÀåÀÇ ºÐ»êÀ¸·Î ÀÎÇØ ÇÊ¿äÇÑ µ¥ÀÌÅͰ¡ ´Ù¸¥ ÄÄǻƮ ³ëµå¿¡ ÀúÀåµÇ¾î ÀÖ´Â °æ¿ì¿¡ ÀÌ µ¥ÀÌÅÍ ¿¬»êÀ» À§ÇÑ º¹Á¦°¡ ¹ß»ýÇÑ´Ù. À̶§ ÇÊ¿äÇÑ º¹Á¦ÀÇ ¾ç¿¡ µû¶ó ÄÄǻƮ ³ëµå°£ ³×Æ®¿öÅ© Æ®·¡ÇÈÀ» ÅëÇÑ IO°¡ ¹ß»ýÇϱ⠶§¹®¿¡ º´¸ñÀÌ µÉ ¼ö ÀÖ´Ù.

µû¶ó¼­ MPP µ¥ÀÌÅͺ£À̽ºµéÀº Å×À̺íÀ» »ý¼ºÇÏ´Â °æ¿ì ÀÌ Å×ÀÌºí¿¡ Àû¿ëÇÒ ºÐ»ê ÀúÀå ¹æ½ÄÀ» Á¦°øÇÑ´Ù. º¸Åë ºÐ»ê Ű(Distribution Key)¸¦ ÁöÁ¤Çϰųª, ºÐ»ê ÀúÀå ¹æ½Ä¿¡ ‘¸ðµç ³ëµå¿¡ ÀúÀå’ ¶Ç´Â ‘·£´ý ³ëµå¿¡ ÀúÀå’ ±×¸®°í ‘µ¿ÀÏÇÏ°Ô ³ª´©¾î ÀúÀå’°ú °°Àº ¹æ½ÄÀ» Á¦°øÇÑ´Ù. ÀÌ ÀúÀå ¹æ½Ä¿¡ µû¶ó ¼º´ÉÀÌ Å©°Ô ÁÂ¿ì µÇ¸ç, µð½ºÅ© »ç¿ë È¿À²¿¡ Áß¿äÇÑ ¿µÇâÀ» ¹ÌÄ¡¹Ç·Î ½ºÅ°¸¶ ¼³°è ´Ü°è¿¡¼­ ÁÖÀǸ¦ ±â¿ï¿©¾ß Çϸç, ÇÊ¿äÇÑ °æ¿ì Å×À̺íÀ» À籸¼º ÇÏ´Â µîÀÇ ¹æ½ÄÀ¸·Î Áö¼ÓÀûÀ¸·Î ¼º´ÉÀ» °³¼±ÇØ¾ß ÇÒ Çʿ䰡 ÀÖ´Ù. ¿©´À ºÐ»ê µ¥ÀÌÅͺ£À̽º°¡ ±×·¸µí, ºÐ»ê ŰÀÇ ÁöÁ¤¿¡ µû¶ó µ¥ÀÌÅÍ ÀúÀåÀÇ ÆíÂ÷°¡ ¹ß»ýÇϱ⠸¶·ÃÀ̸ç, ÀÌ ÆíÂ÷¸¦ ÁÙÀ̱â À§ÇÑ Å° ¼±ÅÃÀ» Àß ÇÏ´Â °ÍÀÌ Áß¿äÇϰڴÙ.

ÃÖ±Ù µ¥ÀÌÅ͸¦ ´Ù·ç´Â ¹æ¹ýÀº Å©°Ô »ý¼º°ú ÃëÇÕ, ÀúÀå°ú ºÐ¼®ÀÇ È帧À» ¾î¶»°Ô ±¸¼ºÇϴ°¡¿¡ µû¶ó ÇÒ ¼ö ÀÖ´Â °ÍÀÌ ¸Å¿ì ´Þ¶óÁø´Ù°í º¼ ¼ö ÀÖ´Ù. ÀÌ µ¥ÀÌÅÍ È帧ÀÇ ¿¬°á, Áï ÆÄÀÌÇÁ¶óÀÎÀ» ¾î¶»°Ô ±¸¼ºÇϴ°¡¿¡ µû¶ó ´Ù¾çÇÑ µ¥ÀÌÅÍ È°¿ëÀÌ °¡´ÉÇÏ´Ù. ÀÚÁÖ º¸ÀÌ´Â ÆÐÅÏÁß Çϳª´Â, µ¥ÀÌÅͰ¡ »ý¼ºµÇ´Â ¼Ò½º·Î ºÎÅÍ Ä«ÇÁÄ«¿Í °°Àº ½ºÆ®¸² µµ±¸·Î µ¥ÀÌÅ͸¦ ¹Þ¾Æ ÇÊ¿äÇÑ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ÀÌ µ¥ÀÌÅ͸¦ Ä«ÇÁÄ«·ÎºÎÅÍ °¡Á®´Ù°¡ ¸ñÀû¿¡ µû¶ó »ç¿ëÇÏ´Â ±¸¼ºÀ» ÃëÇÏ´Â °ÍÀÌ´Ù.

   
¡ã https://cdn-images-1.medium.com/max/1600/0*jip8Wym1kmlbaNRs.

Ä«ÇÁÄ«¿Í °°Àº µµ±¸¸¦ »ç¿ëÇÏ´Â °ÍÀÇ ÀåÁ¡Àº, ÇϳªÀÇ µ¥ÀÌÅÍ ¼Ò½º·Î ºÎÅÍ ¹ÞÀº ½ºÆ®¸² µ¥ÀÌÅ͸¦ ´Ù¾çÇÑ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ °¡Á®´Ù »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î À¥¼­¹ö¿¡¼­ »ý¼ºµÇ´Â ·Î±× ½ºÆ®¸²À» Ä«ÇÁÄ«¿¡ ³Ö°Ô µÇ¸é, ¿©±â¿¡ ´ë½Ãº¸µå ¾ÖÇø®ÄÉÀ̼Ç, ½Ç½Ã°£ ºÐ¼®, ÇÊÅÍ Àû¿ë, ¶Ç´Â ½ºÆ®¸² µ¥ÀÌÅ͸¦ ¸ð¾Æ¼­ ¿ÀºêÁ§Æ® ½ºÅ丮Áö³ª µ¥ÀÌÅÍ ¿þ¾îÇÏ¿ì¡ µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåÇÒ ¼ö ÀÖ´Â ÀÏÀ» µ¿½Ã¿¡ ó¸®ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù.

À§ÀÇ ±×¸²¿¡¼­µµ º¼ ¼ö ÀÖµí, ³ÝÇø¯½º¿¡¼­´Â ÀÌ·± ÇüÅÂÀÇ µ¥ÀÌÅÍ ÆÄÀÌÇÁ¶óÀÎ ±¸ÇöÀ» ÅëÇØ ´Ù¾çÇÑ ¸ñÀûÀ¸·Î µ¥ÀÌÅ͸¦ Ȱ¿ëÇÑ´Ù. ½ÉÁö¾î Ä«ÇÁÄ«¿¡ µé¾î¿Â µ¥ÀÌÅ͸¦ ´Ù½Ã ´Ù¸¥ Ä«ÇÁÄ« Ŭ·¯½ºÅÍ¿¡ ¿¬°áÇØ¼­ »ç¿ëÇÏ´Â ±¸¼º ¹æ½ÄÀ» ÃëÇϱ⵵ ÇÑ´Ù.

MPP µ¥ÀÌÅͺ£À̽º¿¡ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¶§´Â, OLTP¿Í °°ÀÌ ½ºÆ®¸²À¸·Î µé¾î¿À´Â Æ©ÇÃ(tuple), Áï µ¥ÀÌÅ͸¦ ÇѰǾ¿ ÀúÀåÇÏ´Â ¹æ½ÄÀ» ÃëÇÏ´Â °ÍÀÌ ¸Å¿ì ºñÈ¿À² ÀûÀÌ´Ù. µû¶ó¼­ ÀÏÁ¾ÀÇ ¾²±â ¹öÆÛ¿Í °°Àº ¿ªÇÒÀ» ÇØÁÖ´Â µµ±¸°¡ ÇÔ²² »ç¿ëµÇ´Â °ÍÀÌ ÁÁÀºµ¥, À¯ÀԵǴ µ¥ÀÌÅ͸¦ ÀÒÁö ¾ÊÀ¸¸é¼­µµ ³ôÀº ¼º´ÉÀ¸·Î ó¸®ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¹Ù·Î ÀÌ Ä«ÇÁÄ«¿Í ¿ÀÇÁÁ§Æ® ½ºÅ丮Áö ¶Ç´Â HDFS¸¦ ÇÔ²² »ç¿ëÇÏ´Â ¹æ½ÄÀÌ´Ù. Ŭ¶ó¿ìµå ȯ°æÀ» »ç¿ëÇÑ´Ù¸é ´Ù¾çÇÑ ¿ÀºêÁ§Æ® ½ºÅ丮Áö¸¦ ¼±ÅÃÇÒ ¼ö Àִµ¥, ½Å·Ú¼ºÀÌ ³ô´Ù°í ¾Ë·ÁÁø S3¿Í ¿¬µ¿À» Á¦°øÇÏ´Â MPP µ¥ÀÌÅͺ£À̽º°¡ ¸¹´Ù.

À¥¼­¹ö¿¡¼­ »ý¼ºµÈ ·Î±× ½ºÆ®¸²Àº Ä«ÇÁÄ« ¾îÆæ´õ(kafka appender)¸¦ ÅëÇØ Ä«ÇÁÄ«¿¡ Àü´ÞÇÑ´Ù. ¿©±â¿¡ ´Ù¸¥ ´ë½Ãº¸µå ¶Ç´Â ½Ç½Ã°£ ºÐ¼®¿ë ¾ÖÇø®ÄÉÀ̼ÇÀ» ÄÁ½´¸Ó·Î ºÙÀÏ ¼öµµ ÀÖ°ÚÁö¸¸, ÀÌÈÄ µ¥ÀÌÅÍ ºÐ¼®À» À§ÇØ À¯ÀÔµÈ µ¥ÀÌÅ͸¦ S3·Î ÀúÀåÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô ÀúÀåµÈ µ¥ÀÌÅÍ´Â MPP µ¥ÀÌÅͺ£À̽ºÀÇ ÄÄǻƮ ³ëµåµé¿¡¼­ Á÷Á¢ Á¢±ÙÇØ º´·Ä·Î, ¶ÇÇÑ °í¼ÓÀ¸·Î µ¥ÀÌÅ͸¦ ÀûÀçÇÒ ¼ö ÀÖ´Ù. ÀûÀç »Ó¸¸ ¾Æ´Ï¶ó MPP µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåµÈ µ¥ÀÌÅ͸¦ ´Ù½Ã S3·Î ³»¸± ¼öµµ ÀÖÀ¸¸ç, ¹Ýµå½Ã ÀûÀç°¡ ÇÊ¿äÇÏÁö ¾ÊÀº °æ¿ì¿¡´Â ‘¿ÜºÎ Å×ÀÌºí’ ·Î ¸í½ÃÇØ¼­ »ç¿ëÇÏ´Â ¹æ¹ýµµ Á¦°øÇÑ´Ù.

Ŭ¶ó¿ìµå ȯ°æÀ» »ç¿ëÇÒ ¼ö ¾ø´Â °æ¿ì¿¡´Â ÇϵÓÀ̳ª ÆÄÀÏ ½Ã½ºÅÛÀ¸·Î ºÎÅÍÀÇ µ¥ÀÌÅÍ ·Îµå¸¦ Áö¿øÇÑ´Ù. ¿ª½Ã °¢ ÄÄǻƮ ³ëµå°¡ º´·Ä·Î ¿øº» µ¥ÀÌÅÍ ¼Ò½º¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù¸é, ¸Å¿ì °í¼ÓÀ¸·Î µ¥ÀÌÅÍ ÀûÀ縦 ¼öÇàÇÒ ¼ö ÀÖ´Ù.

´Ù¾çÇÑ »ç¿ë »ç·Ê¿¡¼­, µ¥ÀÌÅÍ ·¹ÀÌÅ©(Data lake)ÀÇ ±¸ÇöÀ» »ý°¢ÇØ º¼ ¼öµµ ÀÖ´Ù. µ¥ÀÌÅÍÀÇ »ý¼º°ú ¼öÁý ºÎºÐÀ» Áö³ª, ÀúÀå¿¡ ÀÖ¾î ÇϵÓÀ̳ª S3¸¦ »ç¿ëÇÑ´Ù. ±×¸®°í Çʿ信 µû¶ó MPP µ¥ÀÌÅͺ£À̽º Ŭ·¯½ºÅ͸¦ ´Ù¾çÇÑ ¸ñÀûÀ¸·Î ¸¸µé¾î¼­ µ¥ÀÌÅ͸¦ ÀûÀçÇÑ´Ù.

ÀÌ·¸°Ô MPP µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåµÈ µ¥ÀÌÅÍ´Â ´Ù¾çÇÑ ¸ñÀûÀ¸·Î ºÐ¼®¿¡ Ȱ¿ëµÈ´Ù. ±ÝÀ¶ºÐ¾ß¿¡¼­´Â »ç¿ëÀÚÀÇ ±ÝÀ¶ °Å·¡ ÆÐÅÏÀ̳ª ºÎÁ¤ »ç¿ë ÆÐÅϵîÀ» »ìÆìº¼ ¼ö ÀÖ´Ù. Á¦Á¶ºÐ¾ß¿¡¼­´Â »ý»ê °úÁ¤¿¡¼­ ¹ß»ýÇÑ ´Ù¾çÇÑ µ¥ÀÌÅ͸¦ ÅëÇØ °øÁ¤ È¿À² °³¼±À̳ª Àåºñ ºÒ·®ÀÇ ¿¹Ãø ¸ðµ¨À» ¸¸µå´Âµ¥ »ç¿ëÇϱ⵵ ÇÑ´Ù. Áï, ´Ü¼øÈ÷ BI ·¹Æ÷Æ®¸¦ À§ÇØ »ç¿ëÇÏ´Â °Í¿¡ ±×Ä¡Áö ¾Ê°í À̸¦ ¹ÙÅÁÀ¸·Î ¸Ó½Å ·¯´× ¸ðµ¨À» ¸¸µç´Ù. µû¶ó¼­ ÃÖ±ÙÀÇ MPP µ¥ÀÌÅͺ£À̽ºµéÀº ¸Ó½Å ·¯´× µµ±¸¿Í ¿¬µ¿ÇÒ ¼ö ÀÖ´Â ´É·ÂÀ» ÇÔ²² Á¦°øÇÑ´Ù.

¸Ê-¸®µà½º ¶ó°í ¾Ë·ÁÁø µ¥ÀÌÅÍÀÇ ºÐ¼® ¹æ¹ýÀº ÀüÇô »õ·Î¿î °ÍÀÌ ¾Æ´Ï´Ù. ¹èÄ¡ ÇÁ·Î¼¼½ÌÀ» ÅëÇØ ¼öÇàÇØ ¿Ô´ø ´Ù¾çÇÑ ÀÛ¾÷µéÀº ¿À·¡ ÀüºÎÅÍ È°¿ëµÇ¾î ¿Ô´ø °ÍµéÀÌ´Ù. ±×¸®°í ÀÌ·± ºÐ»ê 󸮿¡´Â ¾ðÁ¦³ª Å¥(queue), ¸¶½ºÅÍ, ÄÄǻƮ¿Í °°Àº °³³äµéÀÌ Á¸ÀçÇÑ´Ù. MPICH¸¦ Ȱ¿ëÇÑ ¼öÆÛ ÄÄÇ»ÆÃÀ̳ª, Àü ¼¼°èÀÇ ³î°íÀÖ´Â ÄÄÇ»ÅÍ ÀÚ¿øÀ» Ȱ¿ëÇÒ ¼ö ÀÖµµ·Ï µðÀÚÀÎµÈ BOINC¿Í °°Àº µµ±¸µéÀÌ °³³äÀûÀ¸·Î´Â ´Ù À¯»çÇÏ´Ù°í º¼ ¼ö ÀÖ´Ù.

MPP µ¥ÀÌÅͺ£À̽º´Â ÀÌ·± ¹æ½ÄÀ¸·Î SQLÀ» »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, ´ë·®ÀÇ µ¥ÀÌÅ͸¦ ¾ÐÃà ÀúÀåÇϰí Çʿ信 µû¶ó Ŭ·¯½ºÅÍ ±Ô¸ð¸¦ ´Ã·Á°¥ ¼ö ÀÖ´Â ÇüÅÂÀÇ µ¥ÀÌÅͺ£À̽º´Ù. ¿©±â¿¡´Â Àß ¾Ë·ÁÁø µ¥ÀÌÅͺ£À̽ºµéÀÌ ÀÖÁö¸¸, º» ±â°í¹®¿¡¼­ ¾ð±ÞÇÑ ±â´É¼ºÀ» Á¦°øÇÏ´Â °ÍÀº Å©°Ô ¾Æ¸¶Á¸ ·¹µå½ÃÇÁÆ®(Amazon Redshift)¿Í ÇǺ¸Å»ÀÇ ±×¸°Ç÷³(Pivotal Greenplum)ÀÌ´Ù.

¾Æ¸¶Á¸ ·¹µå½ÃÇÁÆ®´Â °ü¸®Çü ¼­ºñ½ºÀ̹ǷÎ, °ü½ÉÀÌ ÀÖ´Â »ç¶÷Àº ¾Æ¸¶Á¸ À¥ ¼­ºñ½º¸¦ ÅëÇØ ¿øÇÏ´Â ±Ô¸ðÀÇ Å¬·¯½ºÅ͸¦ Áï½Ã ¸¸µé¾î »ç¿ëÇØ º¼ ¼ö ÀÖ°Ú´Ù. ÇǺ¸Å» ±×¸°Ç÷³Àº º£¾î¸ÞÅ» ¼­¹ö, °¡»ó ¸Ó½Å, ½ÉÁö¾î ÄÁÅ×À̳ʷεµ Á¦°øµÇ¹Ç·Î, MPP µ¥ÀÌÅͺ£À̽º¸¦ ·ÎÄÃÈ£½ºÆ®³ª ¿öÅ©½ºÅ×À̼Ç, ¾Æ¸¶Á¸ À¥ ¼­ºñ½º ¶Ç´Â Äí¹ö³×Ƽ½º Ŭ·¯½ºÅÍ¿¡¼­µµ »ç¿ëÀÌ °¡´ÉÇÏ´Ù. ¶ÇÇÑ ¿ÀÇ ¼Ò½º·Î °ø°³µÇ°í ÀÖÀ¸¹Ç·Î µ¿ÀÛ ¹æ½Ä¿¡ ´ëÇÑ ¿¬±¸³ª Å×½ºÆ®, ¿ÉƼ¸¶ÀÌÀúÀÇ ±¸µ¿ ¹æ½Ä µîÀÌ ±Ã±ÝÇÏ´Ù¸é ¾ðÁ¦³ª Äڵ带 ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.


¿ÀǼҽº MPP, ±×¸°Ç÷³
±×¸°Ç÷³(Greenplum)Àº ÀÌ ºÐ¾ß¿¡ À־ ¾Æ¸¶µµ °¡Àå Á¢±ÙÀÌ ½¬¿î µ¥ÀÌÅÍ ¿þ¾îÇÏ¿ì¡ µµ±¸°¡ ¾Æ´Ò±î ÇÑ´Ù. PostgreSQL ±â¹ÝÀÇ µ¥ÀÌÅÍ ¿þ¾îÇÏ¿ì¡À» À§ÇÑ µ¥ÀÌÅͺ£À̽º·Î¼­, ¸î ³â Àü¿¡ ¿ÀǼҽº·Î ÀüȯµÇ¾ú´Ù. ±×¸°Ç÷³ ȨÆäÀÌÁö(https://greenplum.org/)¿¡¼­´Â ¿ÀǼҽº ±×¸°Ç÷³ÀÌ ¾ÆÆÄÄ¡2 ¶óÀ̼¾½º·Î Á¦°øµÈ´Ù°í ¹àÈ÷°í ÀÖ´Ù.

ÀϹÝÀûÀÎ MPP µ¥ÀÌÅͺ£À̽º°¡ Á¦°øÇÏ´Â ÀåÁ¡µé¿¡ ´õÇÏ¿©, ±×¸°Ç÷³Àº ¸î °¡Áö Ãß°¡ÀûÀÎ (ÇÏÁö¸¸ Çѱ¹¿¡¼­´Â Àß ¾Ë·ÁÁöÁö ¾ÊÀº) ±â´ÉÀ» Á¦°øÇÑ´Ù. ±×Áß °­·ÂÇÑ µÎ °¡Áö´Â PivotalR°ú Apache MADlibÀÌ´Ù.

ÀÌ ±Û¿¡ °ü½ÉÀÌ ÀÖ´Â ºÐÀ̶ó¸é ¾Æ¸¶µµ RÀ» ÀÍÈ÷ µé¾îº¸¼ÌÀ» °Í °°´Ù. ºÐ¼®¿¡ ÀÚÁÖ »ç¿ëµÇ´Â RÀº ¼ö¸¹Àº µ¥ÀÌÅÍ Àü¹®°¡µé¿¡°Ô »ç¶û¹Þ¾Æ ¿Ô´Ù. ÇÏÁö¸¸ °¡Àå Å« ÇѰ踦 Çϳª ²Å¾Æ º¸¸é, ó¸®ÇØ¾ß ÇÏ´Â µ¥ÀÌÅÍ ¼¼Æ®ÀÇ ¾çÀÌ ¸¹¾ÆÁú¼ö·Ï ¾ðÁ¨°¡´Â ¸Þ¸ð¸® ÇѰ迡 µµ´ÞÇÑ´Ù´Â Á¡ÀÌ´Ù. PivotalR Àº Á¤È®È÷ ÀÌ ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. µ¥ÀÌÅ͸¦ GPDB¿¡ ÀúÀåÇϰí ÀÖ´Ù¸é, PivotalRÀº RÀ» SQL·Î º¯È¯ÇÑ´Ù. ÀÌ SQLÀ» ¹ÞÀº GPDB´Â ÀúÀåµÈ ´ë±Ô¸ðÀÇ µ¥ÀÌÅÍ¿¡ ´ëÇØ º´·Ä·Î SQLÀ» ¼öÇàÇÑ´Ù.

   
¡ã https://d1fto35gcfffzn.cloudfront.net/blog/images/2014/05/diagram-PivotalR.png

R ÄÚµå 󸮸¦ À§ÇØ º°µµÀÇ µ¥ÀÌÅÍ À̵¿ÀÌ ÀüÇô ÇÊ¿äÇÏÁö ¾ÊÀ¸¸ç, µ¿½Ã¿¡ ºÐ»êÀ¸·Î ó¸®Çؼ­ ¼öÇàµÇ±â ¶§¹®¿¡ »ó´çÈ÷ ³ôÀº ¼º´ÉÀ» ±â´ëÇÒ ¼ö ÀÖ´Ù. ´Ù¾çÇÑ µ¥ÀÌÅÍ ºÐ¼® ÇÁ·ÎÁ§Æ®µéÀÌ ´Ü¼øÈ÷ µ¥ÀÌÅ͸¦ GPDB¿¡ ÀûÀçÇÏ´Â °Í ¸¸À¸·Îµµ Å« È¿°ú¸¦ º¼ ¼ö ÀÖ´Ù. Áï R¿¡ Àͼ÷ÇÑ »ç¿ëÀÚ¶ó¸é Áï½Ã ±×¸°Ç÷³¿¡ ÀúÀåµÈ µ¥ÀÌÅ͸¦ RŬ¶óÀÌ¾ðÆ®¸¦ ÅëÇØ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.

¾ÆÆÄÄ¡ ¸Åµå¸³(Apache MADlib)Àº µ¥ÀÌÅͺ£À̽º¿¡ ¸Ó½Å ·¯´×À» À§ÇÑ ±â´ÉÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Â ¿ÀÇ ¼Ò½º ¶óÀ̺귯¸®´Ù. PivotalR°ú ÇÔ²² ±×¸°Ç÷³¿¡ °­·ÂÇÑ È®À强À» Á¦°øÇÑ´Ù. ȨÆäÀÌÁö´Â http://madlib.apache.org/ À̸ç, ÁÖÇÇÅÍ ³ëÆ®ºÏ(Jupyter Notebooks)¸¦ »ç¿ëÇÑ ‘½ÃÀÛÇØ º¸±â’¸¦ ÅëÇØ »ç¿ë ¹æ¹ýÀ» È®ÀÎÇØ º¼ ¼ö ÀÖ´Ù.

¼öÇÐ, Åë°è, ¸Ó½Å ·¯´×, ±×·¡ÇÁ ºÐ¼®, µ¥ÀÌÅÍ º¯È¯ µîÀ» ¾Æ¿ì¸£´Â ±²ÀåÈ÷ dzºÎÇÑ ºÐ¼® ¹æ¹ýÀ» Á¦°øÇÑ´Ù. PivotalR°ú ÇÔ²² ±×¸°Ç÷³¿¡¼­ »ç¿ëÇÏ°Ô µÇ¸é À̸¦ ´ë·®ÀÇ µ¥ÀÌÅÍ¿¡ ´ëÇØ º´·Ä·Î »ç¿ëÇÒ ¼ö ÀÖ´Â, ±×¾ß¸»·Î ȯ»óÀûÀÎ ¼º´ÉÀ» º¸¿©ÁØ´Ù.


±×¸°Ç÷³ »ç¿ëÇØ º¸±â
Ŭ¶ó¿ìµå, ±×¸®°í °¡»óÈ­¿Í ÄÁÅ×À̳ʰ¡ Á¦°øÇÏ´Â ÃÖ±ÙÀÇ È¯°æÀº Áö³­ ¼¼¿ù¿¡ ºñÃß¾î º¸¸é Á¤¸» ³î¶ø´Ù°í ÇÒ ¼ö ÀÖ´Ù. º°µµÀÇ ¼­¹ö³ª ÄÄÇ»ÅÍ ÀÚ¿ø ¾øÀÌ ´Ù¾çÇÑ µµ±¸µéÀ» Á¤¸» ¼ø½Ä°£¿¡ ÁغñÇØ¼­ »ç¿ëÇÏ´Â °ÍÀÌ °¡´ÉÇϱ⠶§¹®ÀÌ´Ù. MPP µ¥ÀÌÅͺ£À̽º¸¦ °³¹ßÀÚ³ª µ¥ÀÌÅͰúÇÐÀÚÀÇ ·ÎÄà ¸Ó½Å¿¡¼­ (ÀÎÅͳݸ¸ ¿¬°áµÇ¾î ÀÖ´Ù¸é) Áï½Ã ÁغñÇϰí, ¹Ù·Î Ŭ¶óÀÌ¾ðÆ® µµ±¸¿Í ¿¬°áÇØ¼­ »ç¿ëÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.

±×¸°Ç÷³Àº ÀϹÝÀûÀ¸·Î GPDB ¶ó´Â ¾à¾î·Î ÀÚÁÖ »ç¿ëµÈ´Ù. ¿ÀÇ ¼Ò½ºÀÎ GPDB´Â ±êÇé¿¡ Äڵ尡 Á¸ÀçÇÑ´Ù. ´ÙÀ½ÀÇ ¸µÅ©¿¡ ¹æ¹®Çϸé GPDBÀÇ Äڵ带 »ìÆìº¼ ¼ö ÀÖ´Ù.
¡á https://github.com/greenplum-db/gpdb

¶ÇÇÑ GPDB´Â ±×¸°Ç÷³ °ø½Ä À¥ÆäÀÌÁö¸¦ ÅëÇØ ´Ù¿î·Îµå ¹Þ°Å³ª, ¿ìºÐÅõÀÇ °æ¿ì apt ¸í·É¾î¸¦ ÅëÇØ ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡ÀÇ ¸µÅ©¿¡¼­´Â ¾ÆÆÄÄ¡ ºòž(Apache Bigtop), ¿ìºÐÅõ, µµÄ¿ À̹ÌÁöÀÇ À§Ä¡¿Í »ç¿ë ¹æ¹ýÀ» Âü°íÇØ º¼ ¼ö ÀÖ´Ù.
¡á https://greenplum.org/download/

¾Æ¸¶Á¸ ¸¶ÄÏÇ÷¹À̽º¸¦ »ç¿ëÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù. ¾Æ·¡ÀÇ ¸µÅ©¿¡¼­´Â ¿ÀǼҽº ¹öÀüÀÇ ±×¸°Ç÷³À» Áï½Ã »ç¿ëÇØ º¼ ¼ö ÀÖ´Â ¾Æ¸¶Á¸ ¸¶ÄÏÇ÷¹À̽º¸¦ »ìÆìº¼ ¼ö ÀÖ´Ù. ¾Ö¼®ÇϰԵµ ¼­¿ï ¸®ÀüÀÌ Áö¿øµÇÁö ¾Ê´Âµ¥, ÀÌ °æ¿ì¿¡´Â ¿ìºÐÅõ ¸Ó½ÅÀ» EC2·Î ÁغñÇØ¼­ À§ÀÇ ¼³Ä¡ ¹æ¹ý¿¡ µû¶ó »ç¿ëÇØ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¡á https://aws.amazon.com/marketplace/pp/B01LFMOXUE/ref=mkt_ste_catgtm_dblp

¾Æ·¡¿¡ ¼Ò°³µÇ´Â ÄÁÅ×ÀÌ³Ê ¹æ½ÄÀÌ ¸¶À½¿¡ µéÁö ¾Ê´Â´Ù¸é, °¡»ó ¸Ó½ÅÀ» »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. °¡»ó ¸Ó½Å¿¡ Á÷Á¢ ±×¸°Ç÷³À» ÁغñÇÒ ¼öµµ ÀÖÀ¸¸ç, °æ¿ì¿¡ µû¶ó¼­´Â ´ÙÀ½ ¸µÅ©ÀÇ ±×¸°Ç÷³ »÷µå¹Ú½º¸¦ Á÷Á¢ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ¸µÅ©¿¡¼­´Â »÷µå¹Ú½º¿ë À̹ÌÁö »Ó¸¸ ¾Æ´Ï¶ó ±×¸°Ç÷³ÀÇ ±âº» »ç¿ë Æ©Å丮¾óµµ ÇÔ²² Á¦°øÇϰí ÀÖ´Ù. ÇØ´ç ÆäÀÌÁö ÇÏ´ÜÀÇ ‘Æ©Å丮¾ó ¸Þ´º’ µå·Ó´Ù¿î ¹öưÀ» ´©¸£¸é ¸Þ´º°¡ È®ÀåµÈ´Ù.
¡á https://greenplum.org/gpdb-sandbox-tutorials/

¶ÇÇÑ ±×¸°Ç÷³ µµÄ¿ À̹ÌÁö¸¦ ¹ÙÅÁÀ¸·Î Áï½Ã ½ÇÇàÇØ º¼ ¼ö ÀÖ´Ù. ¾Æ·¡ÀÇ ¸µÅ©¿¡¼­ µµÄ¿ ȯ°æÀ» ´Ù¿î·Îµå ¹ÞÀ» ¼ö ÀÖ´Ù. µµÄ¿ ¿¡Áö ¸±¸®Áî(Docker Edge Release)¸¦ ´Ù¿î·Îµå ¹ÞÀ¸¸é º°µµÀÇ ¼³Ä¡ ¾øÀÌ Äí¹ö³×Ƽ½º ȯ°æÀ» ±¸¼ºÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù.
¡á  https://www.docker.com/get-docker

ÀÌ¹Ì µµÄ¿ ȯ°æÀÌ ¼³Ä¡µÇ¾î ÀÖ´Ù¸é, ¾Æ·¡ÀÇ Ä¿¸Çµå·Î ±×¸°Ç÷³À» Áï½Ã ±¸µ¿ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ¹öÃß¾ó ¸Ó½ÅÀÌ ´ë»ó ½Ã½ºÅÛ¿¡ ÁغñµÇ¾î ÀÖ´Ù¸é, docker-machineÀ» »ç¿ëÇØ¼­ ¹öÃß¾ó ¹Ú½º ȯ°æ¿¡¼­ ¾Æ·¡ÀÇ ¿¹Á¦¸¦ »ç¿ëÇØ º¼ ¼ö ÀÖ°Ú´Ù. ¹öÃß¾ó ¹Ú½º°¡ ¾ø´Ù ÇÏ´õ¶óµµ ½Ã½ºÅÛ¿¡ µµÄ¿ ȯ°æÀÌ ÁغñµÇ¾î ÀÖ´Ù¸é ¹Ù·Î docker run Ä¿¸Çµå¸¦ »ç¿ëÇÏ¸é µÇ°Ú´Ù.

¹öÃß¾ó ¸Ó½Å »ý¼º - ³Ê¹« ¸¹Àº ÀÚ¿øÀ» ÇÒ´çÇÏÁö ¾Êµµ·Ï ÁÖÀÇÇÏÀÚ
$ docker-machine create -d virtualbox --virtualbox-cpu-count 2 --virtualbox-disk-size 50000 --virtualbox-memory 4096 gpdb

»ý¼ºµÈ ȯ°æ È®ÀÎ
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
gpdb - virtualbox Running tcp://192.168.99.100:2376 v18.05.0-ce

µµÄ¿¸¦ À§ÇÑ ½Ã½ºÅÛ È¯°æ º¯¼ö ¼³Á¤
eval $(docker-machine env gpdb)

gpdb-devel µµÄ¿ À̹ÌÁö ±¸µ¿
$ docker run -it pivotaldata/gpdb-devel

Ŭ·¯½ºÅÍ »ý¼º - gpadmin °èÁ¤À» Ȱ¼ºÈ­ ÇÏ´Â ¼ø°£,
# /usr/local/gpdb/bin/gpinitsystem À» »ç¿ëÇØ¼­ #±×¸°Ç÷³ Ŭ·¯½ºÅ͸¦ ±¸µ¿ÇÑ´Ù.
$ su gpadmin

¼³Ä¡ È®ÀÎ // ²Ï ¿À·¡ °É¸®¹Ç·Î ¹Ýµå½Ã ¼öÇàÇÒ ÇÊ¿ä´Â ¾ø´Ù.
$ make installcheck-good

µ¥ÀÌÅͺ£À̽º »ý¼º°ú Á¢¼Ó
$ createdb test
$ psql test

À§ÀÇ ¸í·É¾îµéÀÌ ¹®Á¦ ¾øÀÌ ½ÇÇàµÇ¾ú´Ù¸é ±×¸°Ç÷³ÀÌ ÄÁÅ×ÀÌ³Ê È¯°æ¿¡ ÁغñµÈ °ÍÀÌ´Ù. ±âº»ÀûÀ¸·Î µµÄ¿ ȯ°æÀ̹ǷΠÄí¹ö³×Ƽ½º ȯ°æ¿¡ ¹èÆ÷ÇØ º¼ ¼öµµ ÀÖ´Ù. ½Ç ¼­ºñ½º ¼öÁØÀÇ Äí¹ö³×Ƽ½º ȯ°æÀ» º¸À¯Çϰí ÀÖ´Ù¸é, ´Ù¼öÀÇ ³ëµå·Î ±¸¼ºµÈ °í°¡¿ëÀ» Áö¿øÇÏ´Â ±×¸°Ç÷³À» »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.

   
¡ã GPDB-Docker À̹ÌÁö

µ¥ÀÌÅͺ£À̽º »ý¼º
$ createdb creditcard

PL/Python Áö¿ø Ȱ¼ºÈ­
$ createlang plpythonu -d creditcard

±×¸°Ç÷³ÀÇ creditcard µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼Ó (µ¥¸óÀ» »ç¿ëÇÑ´Ù¸é psql Ŭ¶óÀÌ¾ðÆ®¸¦ »ç¿ëÇÏ¸é µÈ´Ù)
$ psql creditcad
creditcard=#

µ¥ÀÌÅͺ£À̽º À̸§ = # ±âÈ£°¡ ³ªÅ¸³­´Ù¸é µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼ÓÇÑ »óÅ´Ù. ±âº»ÀûÀ¸·Î \dt ¿Í °°Àº PostgreSQL ¸í·É¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, Á¢¼Ó ÇØÁ¦´Â \q Ä¿¸Çµå¸¦ »ç¿ëÇÏ¸é µÈ´Ù. PL/Python Áö¿øÀ» Ȱ¼ºÈ­ Ç߱⠶§¹®¿¡ ¾Æ·¡¿Í °°ÀÌ »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ ¸¸µé¾î »ç¿ëÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù.

creditcard=#
CREATE FUNCTION return_py_int_array()
RETURNS int[]
AS $$
return [1, 11, 21, 31]
$$ LANGUAGE plpythonu;
CREATE FUNCTION

creditcard=# SELECT return_py_int_array();
return_py_int_array
---------------------
{1,11,21,31}
(1 row)

ÇǺ¸Å» ¿£Áö´Ï¾î¸µ ºí·Î±×(http://engineering.pivoal.io)¿¡´Â ±×¸°Ç÷³°ú °ü·ÃµÈ ´Ù¾çÇÑ µ¥ÀÌÅÍ »çÀ̾𽺠¿¹Á¦¸¦ ã¾Æº¼ ¼ö Àִµ¥, ¾Æ·¡ ¸µÅ©¿¡´Â ±×¸°Ç÷³¿¡¼­ ÄÉ¶ó½º¿Í ÅÙ¼­Ç÷ο츦 »ç¿ëÇØ¼­ ´ë±Ô¸ð·Î È®Àå °¡´ÉÇÑ ½ºÄھ ¹æ¹ýÀ» »ìÆìº¼ ¼ö ÀÖ´Ù.
¡á http://engineering.pivotal.io/post/scoring-at-scale-with-keras-and-tensorflow-on-pivotal-greenplum/

Àüü ³»¿ëÀ» ¼Ò°³ÇÏ´Â °ÍÀº º» ±â°í¹®ÀÇ ¹üÀ§¸¦ ³Ñ¾î°¡´Â °ÍÀ̹ǷΠ´õ ±í°Ô µé¾î°¡Áö´Â ¾Ê°ÚÀ¸³ª, ÀÌ ºÎºÐ¿¡ °ü½ÉÀÌ ÀÖ´Â ºÐµéÀ̶ó¸é °£´ÜÇÑ µö·¯´× 󸮸¦ À§ÇØ MPP µ¥ÀÌÅͺ£À̽ºÀÇ ÄÄǻƮ ³ëµå¿¡¼­ ÄÉ¶ó½º¿Í ÅÙ¼­Ç÷ο찡 ¾î¶»°Ô ¿¬µ¿ÇÒ ¼ö ÀÖ´ÂÁö¿¡ ´ëÇÑ ¾ÆÀ̵ð¾î¸¦ ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ Æ÷½ºÆ®ÀÇ ¸ðµç ³»¿ëÀ» ±×´ë·Î »ç¿ëÇØ º¸±â À§Çؼ­´Â µµÄ¿ À̹ÌÁöÀÇ python ¹öÀüÀ» ¾÷±×·¹À̵å ÇØ¾ß ÇÏ´Â µîÀÇ Ãß°¡ ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù´Â Á¡À» ¾Ë¾ÆµÎµµ·Ï ÇÏÀÚ.

À§ÀÇ ºí·Î±× Æ÷½ºÆ®¿¡ ¼Ò°³µÈ »ùÇà µ¥ÀÌÅÍ´Â ¾Æ·¡ÀÇ ¸µÅ©¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. Kaggle ÆäÀÌÁö¿¡¼­ µ¥ÀÌÅ͸¦ ¹Þ±â À§Çؼ­´Â ·Î±×ÀÎÀÌ ÇÊ¿äÇÒ ¼ö ÀÖ´Ù.
¡á https://www.kaggle.com/mlg-ulb/creditcardfraud

creditcard.csv ÆÄÀÏÀ» ¼º°øÀûÀ¸·Î ³»·Á ¹Þ¾Ò´Ù¸é, ¾Æ·¡¿Í °°ÀÌ Å×À̺íÀ» ¸¸µé°í CSV µ¥ÀÌÅ͸¦ ·ÎµåÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡ÀÇ CREATE TABLE ±¸¹®À» ½ÇÇàÇÑ´Ù.

CREATE TABLE credit_card(
Time NUMERIC, -- seconds elapsed between each transaction
V1 NUMERIC, -- first principal component
V2 NUMERIC, -- second principal component
V3 NUMERIC, -- third principal component
V4 NUMERIC,
V5 NUMERIC,
V6 NUMERIC,
V7 NUMERIC,
V8 NUMERIC,
V9 NUMERIC,
V10 NUMERIC,
V11 NUMERIC,
V12 NUMERIC,
V13 NUMERIC,
V14 NUMERIC,
V15 NUMERIC,
V16 NUMERIC,
V17 NUMERIC,
V18 NUMERIC,
V19 NUMERIC,
V20 NUMERIC,
V21 NUMERIC,
V22 NUMERIC,
V23 NUMERIC,
V24 NUMERIC,
V25 NUMERIC,
V26 NUMERIC,
V27 NUMERIC,
V28 NUMERIC, -- twenty-eighth principal component
Amount NUMERIC, -- transaction amount
Class NUMERIC -- the actual classification classes
)
WITH ( APPENDONLY=TRUE, COMPRESSTYPE=zlib, COMPRESSLEVEL=5 )
DISTRIBUTED RANDOMLY;
CREATE TABLE

Å×À̺íÀÌ ¼º°øÀûÀ¸·Î ¸¸µé¾îÁ³´Ù¸é, ´Ù¿î·Îµå ¹ÞÀº CSV ÆÄÀÏÀ» Å×ÀÌºí¿¡ ÀûÀçÇØ º¸ÀÚ.
ÇöÀç ±×¸°Ç÷³ µµÄ¿ ÄÁÅ×À̳ÊÀÇ gpadmin °èÁ¤À¸·Î ÀÛ¾÷Çϰí ÀÖ´Ù´Â »ç½ÇÀ» ÀØÁö ¸»°í, ´Ù¿î·Îµå ¹ÞÀº ÆÄÀÏÀ» ÇØ´ç °èÁ¤ÀÌ Á¢±ÙÇÒ ¼ö ÀÖ´Â À§Ä¡¿¡ ³Ö¾î¾ß ÇÑ´Ù. ¿©±â¿¡¼­´Â /tmp µð·ºÅ丮¸¦ »ç¿ëÇß´Ù.

creditcard# COPY credit_card FROM '/tmp/creditcard.csv' CSV HEADER;
COPY 284807

µ¥ÀÌÅͰ¡ Å×ÀÌºí¿¡ ÀûÀç µÇ¾ú´Ù¸é ¼º°øÀÌ´Ù. ¾Æ·¡´Â PL/Python stack_rows ÇÔ¼ö¸¦ »ý¼ºÇÑ´Ù.

CREATE FUNCTION stack_rows(
key text,
header text[], -- name of the features column
features float8[] -- independent variables (as array)
)
RETURNS text AS
$$
if 'header' not in GD:
GD['header'] = header
if not key:
gd_key = 'stack_rows'
GD[gd_key] = [features]
return gd_key
else:
GD[key].append(features)
return key
$$
LANGUAGE plpythonu;
CREATE FUNCTION

# Ä¿½ºÅÒ ¿¡±×¸®°ÔÀ̼ÇÀ» »ý¼ºÇÑ´Ù.

CREATE ORDERED AGGREGATE stack_rows(
text[], -- header (feature names)
float8[] -- features (feature values)
)
(
SFUNC = stack_rows,
STYPE = text -- the key in GD used to hold the data across calls
);
CREATE AGGREGATE


SELECT
gp_segment_id,
stack_rows(
ARRAY['features'], -- header or names of input fields
ARRAY[v1, v2, v3, v4, v5, v6, v7,
v8, v9, v10, v11, v12, v13, v14,
v15, v16, v17, v18, v19, v20, v21,
v22, v23, v24, v25, v26, v27, v28] -- feature vector
) AS stacked_input_key
FROM
credit_card
GROUP BY
gp_segment_id
;


gp_segment_id | stacked_input_key
---------------+-------------------
0 | stack_rows
1 | stack_rows
2 | stack_rows
(3 rows)

ÄÉ¶ó½º¿Í ÅÙ¼­Ç÷οì, h5py(¸ðµ¨À» ·ÎµåÇϱâ À§ÇØ ÇÊ¿ä)°¡ ¸ðµÎ ±×¸°Ç÷³ ¼¼±×¸ÕÆ®(±×¸°Ç÷³¿¡¼­ÀÇ ÄÄǻƮ ³ëµå)¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â °æ¿ì¿¡´Â ¾Æ·¡¿Í °°ÀÌ score_keras() ÇÔ¼ö¸¦ ¸¸µé¾î ±×¸°Ç÷³ÀÇ °¢ ³ëµå¿¡¼­ µö·¯´×À» À§ÇÑ ºÐ»ê󸮰¡ µ¿ÀÛÇÏ´Â ¸ð½ÀÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

ÅÙ¼­ÇÃ·Î¿ì ¼³Ä¡, pip install keras, pip install h5py ¸¦ »ç¿ëÇØ ±×¸°Ç÷³ÀÇ °¢ ³ëµå°¡ ÁغñµÈ °æ¿ì, ¾Æ·¡¿Í °°ÀÌ ÅÙ¼­Ç÷ο츦 »ç¿ëÇÏ´Â score_keras ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù.

CREATE OR REPLACE FUNCTION score_keras(
_model text,
_data_key text
)
RETURNS SETOF INTEGER[] AS
$$
# Begin: Workaround to import TensorFlow
import sys

sys.argv = {0: ""}
__file__ = ""
# End: Workaround to import TensorFlow

if 'model' not in SD:
from keras.models import load_model
SD['model'] = load_model(_model)

result = None
if _data_key in GD:
result = SD['model'].predict_classes(GD[_data_key])
del GD[_data_key]

return result
$$
LANGUAGE plpythonu IMMUTABLE;
CREATE FUNCTION

 

ÀÌ·¸°Ô ¸¸µé¾îÁø ÇÔ¼ö´Â ¾Æ·¡¿Í °°Àº Äõ¸®¸¦ ÅëÇØ È£ÃâÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

WITH cached_data AS (
SELECT
gp_segment_id,
stack_rows(
ARRAY['features'], -- header or names of input fields
ARRAY[v1, v2, v3, v4, v5, v6, v7,
v8, v9, v10, v11, v12, v13, v14,
v15, v16, v17, v18, v19, v20, v21,
v22, v23, v24, v25, v26, v27, v28] -- feature vector
) AS stacked_input_key
FROM
credit_card
GROUP BY
gp_segment_id
)

SELECT
score_keras(
'/home/gpadmin/model_file.h5', -- full path of the model
stacked_input_key -- table name containing data to score
) AS results
FROM
cached_data;

 

ÅÙ¼­Ç÷οì Å×½ºÆ®°¡ °¡´ÉÇÑ ±×¸°Ç÷³ µµÄ¿ À̹ÌÁö¸¦ Á÷Á¢ ¸¸µé¾î ¹èÆ÷ÇϰíÀÚ ÇßÀ¸³ª, µµÄ¿ À̹ÌÁö ÀÛ¾÷¿¡ »ý°¢º¸´Ù ¿À·£ ½Ã°£ÀÌ °É·Á ¸¶°¨ ½ÃÇÑÀ» ³õÄ¡°Ô µÇ¾ú´Ù. °¡»ó ¸Ó½Å ±â¹ÝÀ¸·Î ±×¸°Ç÷³ ȯ°æÀ» ±¸ÃàÇÑ´Ù¸é À§ÀÇ Å×½ºÆ®¸¦ º¸´Ù ½±°Ô ÁøÇàÇÒ ¼ö ÀÖÀ¸¸®¶ó »ý°¢ÇÑ´Ù. ¾Æ¿ï·¯ ÄÄÇ»ÅÍ¿ùµåÀÇ µ¶ÀÚ ºÐµéÀ» À§ÇØ ´ÙÀ½¹ø¿¡´Â ¼Ò°³µÈ µ¥¸ð¿¡ ´ëÇØ ´õ ±í°Ô »ìÆìº¸µµ·Ï ÇϰڴÙ.


¸¶Ä¡¸ç
µö·¯´×, ¸Ó½Å·¯´×°ú °ü·ÃÇØ¼­ ´Ù¾çÇÑ ºÐ¼® µµ±¸°¡ Á¸ÀçÇÑ´Ù. Çʿ信 µû¶ó¼­, ±×¸®°í µ¥ÀÌÅÍÀÇ Ã³¸® ÇüÅ¿¡ µû¶ó¼­ ÀûÀýÇÑ µµ±¸¸¦ ¼±ÅÃÇÏ´Â °ÍÀÌ ¾î´À ¶§º¸´Ù Áß¿äÇÑ ½Ã´ë´Ù. ±×¸®°í ¸¸¾à µ¥ÀÌÅÍ µµ±¸¸¦ óÀ½¿¡ À߸ø ¼±ÅÃÇß´õ¶óµµ, °æÇèÀ» ¹ÙÅÁÀ¸·Î ¿Ã¹Ù¸¥ µµ±¸·Î ´Ù½Ã ¹Ù²Ù°Å³ª ½ÇÇèÇÒ ¼ö Àִ ȯ°æÀ» Á¶¼ºÇÏ´Â °ÍÀÌ ¸Å¿ì Áß¿äÇÏ´Ù. ÀÌ·± Ãø¸é¿¡¼­, Ä«ÇÁÄ«¿Í °°Àº µµ±¸ÀÇ Á¸Àç´Â ´Üºñ¿Í °°´Ù.

µ¥ÀÌÅͰ¡ ¹ß»ýÇÏ´Â ¼Ò½º¿¡ Ä«ÇÁÄ«¸¦ ¿¬°áÇÒ ¼ö ÀÖ´Â »óŰ¡ µÇ¸é, ±× µÚ¿¡´Â ´Ù¾çÇÑ È®ÀåÀÌ °¡´ÉÇÏ´Ù. °¢ ¼­¹ö¿¡¼­ ¶³¾îÁö´Â ¼ö¸¹Àº µ¥ÀÌÅÍ ¶Ç´Â ´Ù¾çÇÑ IoT ±â±â¿¡¼­ ¹ß»ýÇÏ´Â µ¥ÀÌÅ͸¦ ¸ð¾Æ¼­ ¿ÀºêÁ§Æ® ½ºÅ丮Áö¿¡ ÀúÀåÇϰųª, ½ºÆÄÅ©¿Í °°Àº ½Ç½Ã°£ ºÐ¼® µµ±¸¸¦ ¿¬°áÇϰųª, ½Ç½Ã°£ ´ë½Ãº¸µå¸¦ ¿¬°áÇÒ ¼öµµ ÀÖ´Ù. ÀÌ´Â Ä«ÇÁÄ«°¡ Á¦°øÇÏ´Â ±â´ÉÀ¸·Î, ÇϳªÀÇ µ¥ÀÌÅÍ ¼Ò½º¿¡¼­ ¸¸µé¾îÁø µ¥ÀÌÅ͸¦ ´Ù¼öÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀÌ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.

ÀÌ·± ‘µ¥ÀÌÅÍ Ç÷§Æû’À» ÀÏ´Ü È®º¸Çß´Ù¸é, ÀÌÈÄ¿¡´Â µ¥ÀÌÅÍÀÇ ºÐ¼®°ú ó¸® ¿ëµµ¿¡ ¸Â´Â µµ±¸ÀÇ ¼±ÅÃÀÌ °¡´ÉÇÏ´Ù. ¿©±â¿¡ ÀÌ ¿ÀǼҽº µ¥ÀÌÅÍ ¿þ¾îÇÏ¿ì¡ µµ±¸¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ´Â º¸Åë ‘¿À·£ ±â°£¿¡ °ÉÄ£ ¼­ºñ½ºÀÇ Æ®·»µå ºÐ¼®’°ú °°Àº °÷¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. 10³â µ¿¾ÈÀÇ »ç¿ëÀÚº° ÀºÇà °èÁ ÀÌ¿ë ÆÐÅÏÀ» ã¾Æ³»°í, ¸ðµ¨À» ¸¸µå´Âµ¥ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. °¢°¢ÀÇ ¸ðµ¨Àº ´õ ¸¹Àº µ¥ÀÌÅͰ¡ Á¸ÀçÇÒ¼ö·Ï ´õ Á¤±³ÇØÁö°í, ÀÌ ¸ðµ¨Àº ´Ù½Ã ½Ç½Ã°£À¸·Î À¯ÀԵǴ µ¥ÀÌÅÍ¿ÍÀÇ ºñ±³¿¡ »ç¿ëÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.

·ÎÄÿ¡¼­ »ç¿ëÇØ º¼ ¼ö ÀÖ´Â µ¥ÀÌÅÍ ¿þ¾îÇÏ¿ì¡ µµ±¸´Â, ´Ù¾çÇÑ Äõ¸®ÀÇ ÇнÀ°ú µ¿ÀÛ ¹æ½ÄÀ» È®ÀÎÇϴµ¥µµ À¯¸®ÇÒ °ÍÀÌ´Ù. ¶ÇÇÑ µ¥ÀÌÅͺ£À̽º¸¦ ´ë»óÀ¸·Î Å×½ºÆ®¸¦ ±¸ÇöÇÏ´Â °æ¿ì¿¡µµ µµÄ¿ À̹ÌÁö¸¦ °¡Á®´Ù°¡ ¼Õ½±°Ô »ç¿ëÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ¿ÀǼҽº·Î, ±×¸®°í °¡»ó¸Ó½ÅÀ̳ª µµÄ¿¸¦ »ç¿ëÇØ¼­ DW¸¦ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¼Ò°³Çϰí, ¾Æ¿ï·¯ ¸ÅÆ®¸³À̳ª PivotalR °ú °°Àº µµ±¸ÀÇ ¼Ò°³¸¦ ÅëÇØ ´Ù¾çÇÑ µ¥ÀÌÅÍ ºÐ¼®ÀÇ È¯°æÀ» ½ÇÇèÇØ º¼ ¼ö Àֱ⸦ ¹Ù¶õ´Ù.

Àαâ±â»ç ¼øÀ§
(¿ì)08503 ¼­¿ïƯº°½Ã ±Ýõ±¸ °¡»êµðÁöÅÐ1·Î 181 (°¡»ê W CENTER) 1713~1715È£
TEL : 02-2039-6160  FAX : 02-2039-6163  »ç¾÷ÀÚµî·Ï¹øÈ£:106-86-40304
°³ÀÎÁ¤º¸/û¼Ò³âº¸È£Ã¥ÀÓÀÚ:±è¼±¿À  µî·Ï¹øÈ£:¼­¿ï ¾Æ 00418  µî·ÏÀÏÀÚ:2007.08  ¹ßÇàÀÎ:±è¿ë¼®  ÆíÁýÀÎ:±è¼±¿À