±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎÄÖ÷Òª½éÉÜÁËFlinkÏîÄ¿µÄһЩ¹Ø¼üÌØÐÔ£¬Ï£Íûͨ¹ý±¾ÎĵĽéÉÜÄܹ»ÈöÁÕß¶ÔFlinkÓиü¶àµÄÁ˽⣬ҲÈøü¶àµÄÈËʹÓÃÉõÖÁ²ÎÓëµ½FlinkÏîÄ¿ÖÐÈ¥¡£
|
|
Apache Flink£¨Ï¼ò³ÆFlink£©ÏîÄ¿ÊÇ´óÊý¾Ý´¦ÀíÁìÓò×î½üȽȽÉýÆðµÄÒ»¿ÅÐÂÐÇ£¬Æä²»Í¬ÓÚÆäËû´óÊý¾ÝÏîÄ¿µÄÖî¶àÌØÐÔÎüÒýÁËÔ½À´Ô½¶àÈ˵ĹØ×¢¡£±¾ÎĽ«ÉîÈë·ÖÎöFlinkµÄһЩ¹Ø¼ü¼¼ÊõÓëÌØÐÔ£¬Ï£ÍûÄܹ»°ïÖú¶ÁÕß¶ÔFlinkÓиü¼ÓÉîÈëµÄÁ˽⣬¶ÔÆäËû´óÊý¾Ýϵͳ¿ª·¢ÕßÒ²ÄÜÓÐËùñÔÒæ¡£±¾ÎļÙÉè¶ÁÕßÒѶÔMapReduce¡¢Spark¼°StormµÈ´óÊý¾Ý´¦Àí¿ò¼ÜÓÐËùÁ˽⣬ͬʱÊìϤÁ÷´¦ÀíÓëÅú´¦ÀíµÄ»ù±¾¸ÅÄî¡£
Flink¼ò½é
FlinkºËÐÄÊÇÒ»¸öÁ÷ʽµÄÊý¾ÝÁ÷Ö´ÐÐÒýÇæ£¬ÆäÕë¶ÔÊý¾ÝÁ÷µÄ·Ö²¼Ê½¼ÆËãÌṩÁËÊý¾Ý·Ö²¼¡¢Êý¾ÝͨÐÅÒÔ¼°ÈÝ´í»úÖÆµÈ¹¦ÄÜ¡£»ùÓÚÁ÷Ö´ÐÐÒýÇæ£¬FlinkÌṩÁËÖî¶à¸ü¸ß³éÏó²ãµÄAPIÒÔ±ãÓû§±àд·Ö²¼Ê½ÈÎÎñ£º
DataSet API£¬ ¶Ô¾²Ì¬Êý¾Ý½øÐÐÅú´¦Àí²Ù×÷£¬½«¾²Ì¬Êý¾Ý³éÏó³É·Ö²¼Ê½µÄÊý¾Ý¼¯£¬Óû§¿ÉÒÔ·½±ãµØÊ¹ÓÃFlinkÌṩµÄ¸÷ÖÖ²Ù×÷·û¶Ô·Ö²¼Ê½Êý¾Ý¼¯½øÐд¦Àí£¬Ö§³ÖJava¡¢ScalaºÍPython¡£
DataStream API£¬¶ÔÊý¾ÝÁ÷½øÐÐÁ÷´¦Àí²Ù×÷£¬½«Á÷ʽµÄÊý¾Ý³éÏó³É·Ö²¼Ê½µÄÊý¾ÝÁ÷£¬Óû§¿ÉÒÔ·½±ãµØ¶Ô·Ö²¼Ê½Êý¾ÝÁ÷½øÐи÷ÖÖ²Ù×÷£¬Ö§³ÖJavaºÍScala¡£
Table API£¬¶Ô½á¹¹»¯Êý¾Ý½øÐвéѯ²Ù×÷£¬½«½á¹¹»¯Êý¾Ý³éÏó³É¹ØÏµ±í£¬²¢Í¨¹ýÀàSQLµÄDSL¶Ô¹ØÏµ±í½øÐи÷ÖÖ²éѯ²Ù×÷£¬Ö§³ÖJavaºÍScala¡£
´ËÍ⣬Flink»¹Õë¶ÔÌØ¶¨µÄÓ¦ÓÃÁìÓòÌṩÁËÁìÓò¿â£¬ÀýÈ磺
Flink ML£¬FlinkµÄ»úÆ÷ѧϰ¿â£¬ÌṩÁË»úÆ÷ѧϰPipelines API²¢ÊµÏÖÁ˶àÖÖ»úÆ÷ѧϰËã·¨¡£
Gelly£¬FlinkµÄͼ¼ÆËã¿â£¬ÌṩÁËͼ¼ÆËãµÄÏà¹ØAPI¼°¶àÖÖͼ¼ÆËãË㷨ʵÏÖ¡£
FlinkµÄ¼¼ÊõÕ»Èçͼ1Ëùʾ£º
ͼ1 Flink¼¼ÊõÕ»
´ËÍ⣬FlinkÒ²¿ÉÒÔ·½±ãµØºÍHadoopÉú̬ȦÖÐÆäËûÏîÄ¿¼¯³É£¬ÀýÈçFlink¿ÉÒÔ¶ÁÈ¡´æ´¢ÔÚHDFS»òHBaseÖеľ²Ì¬Êý¾Ý£¬ÒÔKafka×÷ΪÁ÷ʽµÄÊý¾ÝÔ´£¬Ö±½ÓÖØÓÃMapReduce»òStorm´úÂ룬»òÊÇͨ¹ýYARNÉêÇ뼯Ⱥ×ÊÔ´µÈ¡£
ͳһµÄÅú´¦ÀíÓëÁ÷´¦Àíϵͳ
ÔÚ´óÊý¾Ý´¦ÀíÁìÓò£¬Åú´¦ÀíÈÎÎñÓëÁ÷´¦ÀíÈÎÎñÒ»°ã±»ÈÏΪÊÇÁ½ÖÖ²»Í¬µÄÈÎÎñ£¬Ò»¸ö´óÊý¾ÝÏîĿһ°ã»á±»Éè¼ÆÎªÖ»ÄÜ´¦ÀíÆäÖÐÒ»ÖÖÈÎÎñ£¬ÀýÈçApache
Storm¡¢Apache SmazaÖ»Ö§³ÖÁ÷´¦ÀíÈÎÎñ£¬¶øAapche MapReduce¡¢Apache
Tez¡¢Apache SparkÖ»Ö§³ÖÅú´¦ÀíÈÎÎñ¡£Spark StreamingÊÇApache SparkÖ®ÉÏÖ§³ÖÁ÷´¦ÀíÈÎÎñµÄ×Óϵͳ£¬¿´ËÆÒ»¸öÌØÀý£¬ÊµÔò²»È»¡ª¡ªSpark
Streaming²ÉÓÃÁËÒ»ÖÖmicro-batchµÄ¼Ü¹¹£¬¼´°ÑÊäÈëµÄÊý¾ÝÁ÷ÇзֳÉϸÁ£¶ÈµÄbatch£¬²¢ÎªÃ¿Ò»¸öbatchÊý¾ÝÌá½»Ò»¸öÅú´¦ÀíµÄSparkÈÎÎñ£¬ËùÒÔSpark
Streaming±¾ÖÊÉÏ»¹ÊÇ»ùÓÚSparkÅú´¦Àíϵͳ¶ÔÁ÷ʽÊý¾Ý½øÐд¦Àí£¬ºÍApache Storm¡¢Apache
SmazaµÈÍêÈ«Á÷ʽµÄÊý¾Ý´¦Àí·½Ê½ÍêÈ«²»Í¬¡£Í¨¹ýÆäÁé»îµÄÖ´ÐÐÒýÇæ£¬FlinkÄܹ»Í¬Ê±Ö§³ÖÅú´¦ÀíÈÎÎñÓëÁ÷´¦ÀíÈÎÎñ¡£
ÔÚÖ´ÐÐÒýÇæÕâÒ»²ã£¬Á÷´¦ÀíϵͳÓëÅú´¦Àíϵͳ×î´ó²»Í¬ÔÚÓÚ½Úµã¼äµÄÊý¾Ý´«Ê䷽ʽ¡£¶ÔÓÚÒ»¸öÁ÷´¦Àíϵͳ£¬Æä½Úµã¼äÊý¾Ý´«ÊäµÄ±ê׼ģÐÍÊÇ£ºµ±Ò»ÌõÊý¾Ý±»´¦ÀíÍê³Éºó£¬ÐòÁл¯µ½»º´æÖУ¬È»ºóÁ¢¿Ìͨ¹ýÍøÂç´«Êäµ½ÏÂÒ»¸ö½Úµã£¬ÓÉÏÂÒ»¸ö½Úµã¼ÌÐø´¦Àí¡£¶ø¶ÔÓÚÒ»¸öÅú´¦Àíϵͳ£¬Æä½Úµã¼äÊý¾Ý´«ÊäµÄ±ê׼ģÐÍÊÇ£ºµ±Ò»ÌõÊý¾Ý±»´¦ÀíÍê³Éºó£¬ÐòÁл¯µ½»º´æÖУ¬²¢²»»áÁ¢¿Ìͨ¹ýÍøÂç´«Êäµ½ÏÂÒ»¸ö½Úµã£¬µ±»º´æÐ´Âú£¬¾Í³Ö¾Ã»¯µ½±¾µØÓ²ÅÌÉÏ£¬µ±ËùÓÐÊý¾Ý¶¼±»´¦ÀíÍê³Éºó£¬²Å¿ªÊ¼½«´¦ÀíºóµÄÊý¾Ýͨ¹ýÍøÂç´«Êäµ½ÏÂÒ»¸ö½Úµã¡£ÕâÁ½ÖÖÊý¾Ý´«ÊäģʽÊÇÁ½¸ö¼«¶Ë£¬¶ÔÓ¦µÄÊÇÁ÷´¦Àíϵͳ¶ÔµÍÑÓ³ÙµÄÒªÇóºÍÅú´¦Àíϵͳ¶Ô¸ßÍÌÍÂÁ¿µÄÒªÇó¡£FlinkµÄÖ´ÐÐÒýÇæ²ÉÓÃÁËÒ»ÖÖÊ®·ÖÁé»îµÄ·½Ê½£¬Í¬Ê±Ö§³ÖÁËÕâÁ½ÖÖÊý¾Ý´«ÊäÄ£ÐÍ¡£FlinkÒԹ̶¨µÄ»º´æ¿éΪµ¥Î»½øÐÐÍøÂçÊý¾Ý´«Ê䣬Óû§¿ÉÒÔͨ¹ý»º´æ¿é³¬Ê±ÖµÖ¸¶¨»º´æ¿éµÄ´«Êäʱ»ú¡£Èç¹û»º´æ¿éµÄ³¬Ê±ÖµÎª0£¬ÔòFlinkµÄÊý¾Ý´«Ê䷽ʽÀàËÆÉÏÎÄËùÌáµ½Á÷´¦ÀíϵͳµÄ±ê׼ģÐÍ£¬´Ëʱϵͳ¿ÉÒÔ»ñµÃ×îµÍµÄ´¦ÀíÑÓ³Ù¡£Èç¹û»º´æ¿éµÄ³¬Ê±ÖµÎªÎÞÏÞ´ó£¬ÔòFlinkµÄÊý¾Ý´«Ê䷽ʽÀàËÆÉÏÎÄËùÌáµ½Åú´¦ÀíϵͳµÄ±ê׼ģÐÍ£¬´Ëʱϵͳ¿ÉÒÔ»ñµÃ×î¸ßµÄÍÌÍÂÁ¿¡£Í¬Ê±»º´æ¿éµÄ³¬Ê±ÖµÒ²¿ÉÒÔÉèÖÃΪ0µ½ÎÞÏÞ´óÖ®¼äµÄÈÎÒâÖµ¡£»º´æ¿éµÄ³¬Ê±ãÐֵԽС£¬ÔòFlinkÁ÷´¦ÀíÖ´ÐÐÒýÇæµÄÊý¾Ý´¦ÀíÑÓ³ÙÔ½µÍ£¬µ«ÍÌÍÂÁ¿Ò²»á½µµÍ£¬·´Ö®ÒàÈ»¡£Í¨¹ýµ÷Õû»º´æ¿éµÄ³¬Ê±ãÐÖµ£¬Óû§¿É¸ù¾ÝÐèÇóÁé»îµØÈ¨ºâϵͳÑÓ³ÙºÍÍÌÍÂÁ¿¡£
ͼ2 FlinkÖ´ÐÐÒýÇæÊý¾Ý´«Êäģʽ
ÔÚͳһµÄÁ÷ʽִÐÐÒýÇæ»ù´¡ÉÏ£¬Flinkͬʱ֧³ÖÁËÁ÷¼ÆËãºÍÅú´¦Àí£¬²¢¶ÔÐÔÄÜ£¨ÑÓ³Ù¡¢ÍÌÍÂÁ¿µÈ£©ÓÐËù±£ÕÏ¡£Ïà¶ÔÓÚÆäËûÔÉúµÄÁ÷´¦ÀíÓëÅú´¦Àíϵͳ£¬²¢Ã»ÓÐÒòΪͳһִÐÐÒýÇæ¶øÊܵ½Ó°Ïì´Ó¶ø´ó·ù¶È¼õÇáÁËÓû§°²×°¡¢²¿Êð¡¢¼à¿Ø¡¢Î¬»¤µÈ³É±¾¡£
FlinkÁ÷´¦ÀíµÄÈÝ´í»úÖÆ
¶ÔÓÚÒ»¸ö·Ö²¼Ê½ÏµÍ³À´Ëµ£¬µ¥¸ö½ø³Ì»òÊǽڵã±ÀÀ£µ¼ÖÂÕû¸öJobʧ°ÜÊǾ³£·¢ÉúµÄÊÂÇ飬ÔÚÒì³£·¢Éúʱ²»»á¶ªÊ§Óû§Êý¾Ý²¢ÄÜ×Ô¶¯»Ö¸´²ÅÊÇ·Ö²¼Ê½ÏµÍ³±ØÐëÖ§³ÖµÄÌØÐÔÖ®Ò»¡£±¾½ÚÖ÷Òª½éÉÜFlinkÁ÷´¦ÀíϵͳÈÎÎñ¼¶±ðµÄÈÝ´í»úÖÆ¡£
Åú´¦Àíϵͳ±È½ÏÈÝÒ×ʵÏÖÈÝ´í»úÖÆ£¬ÓÉÓÚÎļþ¿ÉÒÔÖØ¸´·ÃÎÊ£¬µ±Ä³¸öÈÎÎñʧ°Üºó£¬ÖØÆô¸ÃÈÎÎñ¼´¿É¡£µ«Êǵ½ÁËÁ÷´¦Àíϵͳ£¬ÓÉÓÚÊý¾ÝÔ´ÊÇÎÞÏÞµÄÊý¾ÝÁ÷£¬´Ó¶øµ¼ÖÂÒ»¸öÁ÷´¦ÀíÈÎÎñÖ´Ðм¸¸öÔµÄÇé¿ö£¬½«ËùÓÐÊý¾Ý»º´æ»òÊdz־û¯£¬Áô´ýÒÔºóÖØ¸´·ÃÎÊ»ù±¾ÉÏÊDz»¿ÉÐеġ£Flink»ùÓÚ·Ö²¼Ê½¿ìÕÕÓë¿É²¿·ÖÖØ·¢µÄÊý¾ÝԴʵÏÖÁËÈÝ´í¡£Óû§¿É×Ô¶¨Òå¶ÔÕû¸öJob½øÐпìÕÕµÄʱ¼ä¼ä¸ô£¬µ±ÈÎÎñʧ°Üʱ£¬Flink»á½«Õû¸öJob»Ö¸´µ½×î½üÒ»´Î¿ìÕÕ£¬²¢´ÓÊý¾ÝÔ´ÖØ·¢¿ìÕÕÖ®ºóµÄÊý¾Ý¡£FlinkµÄ·Ö²¼Ê½¿ìÕÕʵÏÖ½è¼øÁËChandyºÍLamportÔÚ1985Äê·¢±íµÄһƪ¹ØÓÚ·Ö²¼Ê½¿ìÕÕµÄÂÛÎÄ£¬ÆäʵÏÖµÄÖ÷Ҫ˼ÏëÈçÏ£º
°´ÕÕÓû§×Ô¶¨ÒåµÄ·Ö²¼Ê½¿ìÕÕ¼ä¸ôʱ¼ä£¬Flink»á¶¨Ê±ÔÚËùÓÐÊý¾ÝÔ´ÖвåÈëÒ»ÖÖÌØÊâµÄ¿ìÕÕ±ê¼ÇÏûÏ¢£¬ÕâЩ¿ìÕÕ±ê¼ÇÏûÏ¢ºÍÆäËûÏûÏ¢Ò»ÑùÔÚDAGÖÐÁ÷¶¯£¬µ«ÊDz»»á±»Óû§¶¨ÒåµÄÒµÎñÂß¼Ëù´¦Àí£¬Ã¿Ò»¸ö¿ìÕÕ±ê¼ÇÏûÏ¢¶¼½«ÆäËùÔÚµÄÊý¾ÝÁ÷·Ö³ÉÁ½²¿·Ö£º±¾´Î¿ìÕÕÊý¾ÝºÍÏ´οìÕÕÊý¾Ý¡£
ͼ3 Flink°üº¬¿ìÕÕ±ê¼ÇÏûÏ¢µÄÏûÏ¢Á÷
¿ìÕÕ±ê¼ÇÏûÏ¢ÑØ×ÅDAGÁ÷¾¸÷¸ö²Ù×÷·û£¬µ±²Ù×÷·û´¦Àíµ½¿ìÕÕ±ê¼ÇÏûϢʱ£¬»á¶Ô×Ô¼ºµÄ״̬½øÐпìÕÕ£¬²¢´æ´¢ÆðÀ´¡£µ±Ò»¸ö²Ù×÷·ûÓжà¸öÊäÈëµÄʱºò£¬Flink»á½«ÏȵִïµÄ¿ìÕÕ±ê¼ÇÏûÏ¢¼°ÆäÖ®ºóµÄÏûÏ¢»º´æÆðÀ´£¬µ±ËùÓеÄÊäÈëÖжÔÓ¦¸Ã´Î¿ìÕյĿìÕÕ±ê¼ÇÏûϢȫ²¿µÖ´ïºó£¬²Ù×÷·û¶Ô×Ô¼ºµÄ״̬¿ìÕÕ²¢´æ´¢£¬Ö®ºó´¦ÀíËùÓпìÕÕ±ê¼ÇÏûÏ¢Ö®ºóµÄÒÑ»º´æÏûÏ¢¡£²Ù×÷·û¶Ô×Ô¼ºµÄ״̬¿ìÕÕ²¢´æ´¢¿ÉÒÔÊÇÒì²½ÓëÔöÁ¿µÄ²Ù×÷£¬²¢²»ÐèÒª×èÈûÏûÏ¢µÄ´¦Àí¡£·Ö²¼Ê½¿ìÕÕµÄÁ÷³ÌÈçͼ4Ëùʾ£º
ͼ4 Flink·Ö²¼Ê½¿ìÕÕÁ÷³Ìͼ
µ±ËùÓеÄData Sink£¨ÖÕµã²Ù×÷·û£©¶¼ÊÕµ½¿ìÕÕ±ê¼ÇÐÅÏ¢²¢¶Ô×Ô¼ºµÄ״̬¿ìÕպʹ洢ºó£¬Õû¸ö·Ö²¼Ê½¿ìÕÕ¾ÍÍê³ÉÁË£¬Í¬Ê±Í¨ÖªÊý¾ÝÔ´ÊͷŸÿìÕÕ±ê¼ÇÏûϢ֮ǰµÄËùÓÐÏûÏ¢¡£ÈôÖ®ºó·¢Éú½Úµã±ÀÀ£µÈÒì³£Çé¿öʱ£¬Ö»ÐèÒª»Ö¸´Ö®Ç°´æ´¢µÄ·Ö²¼Ê½¿ìÕÕ״̬£¬²¢´ÓÊý¾ÝÔ´ÖØ·¢¸Ã¿ìÕÕÒÔºóµÄÏûÏ¢¾Í¿ÉÒÔÁË¡£
Exactly-OnceÊÇÁ÷´¦ÀíϵͳÐèÒªÖ§³ÖµÄÒ»¸ö·Ç³£ÖØÒªµÄÌØÐÔ£¬Ëü±£Ö¤Ã¿Ò»ÌõÏûÏ¢Ö»±»Á÷´¦Àíϵͳ´¦ÀíÒ»´Î£¬Ðí¶àÁ÷´¦ÀíÈÎÎñµÄÒµÎñÂß¼¶¼ÒÀÀµÓÚExactly-OnceÌØÐÔ¡£Ïà¶ÔÓÚAt-Least-Once»òÊÇAt-Most-Once,
Exactly-OnceÌØÐÔ¶ÔÁ÷´¦ÀíϵͳµÄÒªÇó¸üΪÑϸñ£¬ÊµÏÖÒ²¸ü¼ÓÀ§ÄÑ¡£Flink»ùÓÚ·Ö²¼Ê½¿ìÕÕʵÏÖÁËExactly-OnceÌØÐÔ¡£
Ïà¶ÔÓÚÆäËûÁ÷´¦ÀíϵͳµÄÈÝ´í·½°¸£¬Flink»ùÓÚ·Ö²¼Ê½¿ìÕյķ½°¸ÔÚ¹¦ÄܺÍÐÔÄÜ·½Ãæ¶¼¾ßÓкܶàÓŵ㣬°üÀ¨£º
µÍÑÓ³Ù¡£ÓÉÓÚ²Ù×÷·û״̬µÄ´æ´¢¿ÉÒÔÒì²½£¬ËùÒÔ½øÐпìÕյĹý³Ì»ù±¾Éϲ»»á×èÈûÏûÏ¢µÄ´¦Àí£¬Òò´Ë²»»á¶ÔÏûÏ¢ÑÓ³Ù²úÉú¸ºÃæÓ°Ïì¡£
¸ßÍÌÍÂÁ¿¡£µ±²Ù×÷·û״̬½ÏÉÙʱ£¬¶ÔÍÌÍÂÁ¿»ù±¾Ã»ÓÐÓ°Ïì¡£µ±²Ù×÷·û״̬½Ï¶àʱ£¬Ïà¶ÔÓÚÆäËûµÄÈÝ´í»úÖÆ£¬·Ö²¼Ê½¿ìÕÕµÄʱ¼ä¼ä¸ôÊÇÓû§×Ô¶¨ÒåµÄ£¬ËùÒÔÓû§¿ÉÒÔȨºâ´íÎó»Ö¸´Ê±¼äºÍÍÌÍÂÁ¿ÒªÇóÀ´µ÷Õû·Ö²¼Ê½¿ìÕÕµÄʱ¼ä¼ä¸ô¡£
ÓëÒµÎñÂß¼µÄ¸ôÀë¡£FlinkµÄ·Ö²¼Ê½¿ìÕÕ»úÖÆÓëÓû§µÄÒµÎñÂß¼ÊÇÍêÈ«¸ôÀëµÄ£¬Óû§µÄÒµÎñÂß¼²»»áÒÀÀµ»òÊǶԷֲ¼Ê½¿ìÕÕ²úÉúÈκÎÓ°Ïì¡£
´íÎó»Ö¸´´ú¼Û¡£·Ö²¼Ê½¿ìÕÕµÄʱ¼ä¼ä¸ôÔ½¶Ì£¬´íÎó»Ö¸´µÄʱ¼äÔ½ÉÙ£¬ÓëÍÌÍÂÁ¿¸ºÏà¹Ø¡£
FlinkÁ÷´¦ÀíµÄʱ¼ä´°¿Ú
¶ÔÓÚÁ÷´¦ÀíϵͳÀ´Ëµ£¬Á÷ÈëµÄÏûÏ¢²»´æÔÚÉÏÏÞ£¬ËùÒÔ¶ÔÓھۺϻòÊÇÁ¬½ÓµÈ²Ù×÷£¬Á÷´¦ÀíϵͳÐèÒª¶ÔÁ÷ÈëµÄÏûÏ¢½øÐзֶΣ¬È»ºó»ùÓÚÿһ¶ÎÊý¾Ý½øÐоۺϻòÊÇÁ¬½Ó¡£ÏûÏ¢µÄ·Ö¶Î¼´³ÆÎª´°¿Ú£¬Á÷´¦Àíϵͳ֧³ÖµÄ´°¿ÚÓкܶàÀàÐÍ£¬×î³£¼ûµÄ¾ÍÊÇʱ¼ä´°¿Ú£¬»ùÓÚʱ¼ä¼ä¸ô¶ÔÏûÏ¢½øÐзֶδ¦Àí¡£±¾½ÚÖ÷Òª½éÉÜFlinkÁ÷´¦Àíϵͳ֧³ÖµÄ¸÷ÖÖʱ¼ä´°¿Ú¡£
¶ÔÓÚĿǰ´ó²¿·ÖÁ÷´¦ÀíϵͳÀ´Ëµ£¬Ê±¼ä´°¿ÚÒ»°ãÊǸù¾ÝTaskËùÔÚ½ÚµãµÄ±¾µØÊ±ÖÓ½øÐÐÇз֣¬ÕâÖÖ·½Ê½ÊµÏÖÆðÀ´±È½ÏÈÝÒ×£¬²»»á²úÉú×èÈû¡£µ«ÊÇ¿ÉÄÜÎÞ·¨Âú×ãijЩӦÓÃÐèÇ󣬱ÈÈ磺
ÏûÏ¢±¾Éí´øÓÐʱ¼ä´Á£¬Óû§Ï£Íû°´ÕÕÏûÏ¢±¾ÉíµÄʱ¼äÌØÐÔ½øÐзֶδ¦Àí¡£
ÓÉÓÚ²»Í¬½ÚµãµÄʱÖÓ¿ÉÄܲ»Í¬£¬ÒÔ¼°ÏûÏ¢ÔÚÁ÷¾¸÷¸ö½ÚµãµÄÑÓ³Ù²»Í¬£¬ÔÚij¸ö½ÚµãÊôÓÚͬһ¸öʱ¼ä´°¿Ú´¦ÀíµÄÏûÏ¢£¬Á÷µ½ÏÂÒ»¸ö½Úµãʱ¿ÉÄܱ»Çзֵ½²»Í¬µÄʱ¼ä´°¿ÚÖУ¬´Ó¶ø²úÉú²»·ûºÏÔ¤ÆÚµÄ½á¹û¡£
FlinkÖ§³Ö3ÖÖÀàÐ͵Äʱ¼ä´°¿Ú£¬·Ö±ðÊÊÓÃÓÚÓû§¶ÔÓÚʱ¼ä´°¿Ú²»Í¬ÀàÐ͵ÄÒªÇó£º
Operator Time¡£¸ù¾ÝTaskËùÔÚ½ÚµãµÄ±¾µØÊ±ÖÓÀ´ÇзֵÄʱ¼ä´°¿Ú¡£
Event Time¡£ÏûÏ¢×Ô´øÊ±¼ä´Á£¬¸ù¾ÝÏûÏ¢µÄʱ¼ä´Á½øÐд¦Àí£¬È·±£Ê±¼ä´ÁÔÚͬһ¸öʱ¼ä´°¿ÚµÄËùÓÐÏûÏ¢Ò»¶¨»á±»ÕýÈ·´¦Àí¡£ÓÉÓÚÏûÏ¢¿ÉÄÜÂÒÐòÁ÷ÈëTask£¬ËùÒÔTaskÐèÒª»º´æµ±Ç°Ê±¼ä´°¿ÚÏûÏ¢´¦ÀíµÄ״̬£¬Ö±µ½È·ÈÏÊôÓÚ¸Ãʱ¼ä´°¿ÚµÄËùÓÐÏûÏ¢¶¼±»´¦Àí£¬²Å¿ÉÒÔÊÍ·Å£¬Èç¹ûÂÒÐòµÄÏûÏ¢Ñӳٺܸ߻áÓ°Ïì·Ö²¼Ê½ÏµÍ³µÄÍÌÍÂÁ¿ºÍÑÓ³Ù¡£
Ingress Time¡£ÓÐʱÏûÏ¢±¾Éí²¢²»´øÓÐʱ¼ä´ÁÐÅÏ¢£¬µ«Óû§ÒÀȻϣÍû°´ÕÕÏûÏ¢¶ø²»ÊǽڵãʱÖÓ»®·Öʱ¼ä´°¿Ú£¬ÀýÈç±ÜÃâÉÏÃæÌáµ½µÄµÚ¶þ¸öÎÊÌ⣬´Ëʱ¿ÉÒÔÔÚÏûÏ¢Ô´Á÷ÈëFlinkÁ÷´¦Àíϵͳʱ×Ô¶¯Éú³ÉÔöÁ¿µÄʱ¼ä´Á¸³ÓèÏûÏ¢£¬Ö®ºó´¦ÀíµÄÁ÷³ÌÓëEvent
TimeÏàͬ¡£Ingress Time¿ÉÒÔ¿´³ÉÊÇEvent TimeµÄÒ»¸öÌØÀý£¬ÓÉÓÚÆäÔÚÏûÏ¢Ô´´¦Ê±¼ä´ÁÒ»¶¨ÊÇÓÐÐòµÄ£¬ËùÒÔÔÚÁ÷´¦ÀíϵͳÖУ¬Ïà¶ÔÓÚEvent
Time£¬ÆäÂÒÐòµÄÏûÏ¢ÑÓ³Ù²»»áºÜ¸ß£¬Òò´Ë¶ÔFlink·Ö²¼Ê½ÏµÍ³µÄÍÌÍÂÁ¿ºÍÑÓ³ÙµÄÓ°ÏìÒ²»á¸üС¡£
Event Timeʱ¼ä´°¿ÚµÄʵÏÖ
Flink½è¼øÁËGoogleµÄMillWheelÏîÄ¿£¬Í¨¹ýWaterMarkÀ´Ö§³Ö»ùÓÚEvent TimeµÄʱ¼ä´°¿Ú¡£
µ±²Ù×÷·ûͨ¹ý»ùÓÚEvent TimeµÄʱ¼ä´°¿ÚÀ´´¦ÀíÊý¾Ýʱ£¬Ëü±ØÐëÔÚÈ·¶¨ËùÓÐÊôÓÚ¸Ãʱ¼ä´°¿ÚµÄÏûϢȫ²¿Á÷Èë´Ë²Ù×÷·ûºó²ÅÄÜ¿ªÊ¼Êý¾Ý´¦Àí¡£µ«ÊÇÓÉÓÚÏûÏ¢¿ÉÄÜÊÇÂÒÐòµÄ£¬ËùÒÔ²Ù×÷·ûÎÞ·¨Ö±½ÓÈ·ÈϺÎʱËùÓÐÊôÓÚ¸Ãʱ¼ä´°¿ÚµÄÏûϢȫ²¿Á÷Èë´Ë²Ù×÷·û¡£WaterMark°üº¬Ò»¸öʱ¼ä´Á£¬FlinkʹÓÃWaterMark±ê¼ÇËùÓÐСÓÚ¸Ãʱ¼ä´ÁµÄÏûÏ¢¶¼ÒÑÁ÷È룬FlinkµÄÊý¾ÝÔ´ÔÚÈ·ÈÏËùÓÐСÓÚij¸öʱ¼ä´ÁµÄÏûÏ¢¶¼ÒÑÊä³öµ½FlinkÁ÷´¦Àíϵͳºó£¬»áÉú³ÉÒ»¸ö°üº¬¸Ãʱ¼ä´ÁµÄWaterMark£¬²åÈëµ½ÏûÏ¢Á÷ÖÐÊä³öµ½FlinkÁ÷´¦ÀíϵͳÖУ¬Flink²Ù×÷·û°´ÕÕʱ¼ä´°¿Ú»º´æËùÓÐÁ÷ÈëµÄÏûÏ¢£¬µ±²Ù×÷·û´¦Àíµ½WaterMarkʱ£¬Ëü¶ÔËùÓÐСÓÚ¸ÃWaterMarkʱ¼ä´ÁµÄʱ¼ä´°¿ÚÊý¾Ý½øÐд¦Àí²¢·¢Ë͵½ÏÂÒ»¸ö²Ù×÷·û½Úµã£¬È»ºóÒ²½«WaterMark·¢Ë͵½ÏÂÒ»¸ö²Ù×÷·û½Úµã¡£
ΪÁ˱£Ö¤Äܹ»´¦ÀíËùÓÐÊôÓÚij¸öʱ¼ä´°¿ÚµÄÏûÏ¢£¬²Ù×÷·û±ØÐëµÈµ½´óÓÚÕâ¸öʱ¼ä´°¿ÚµÄWaterMarkÖ®ºó²ÅÄÜ¿ªÊ¼¶Ô¸Ãʱ¼ä´°¿ÚµÄÏûÏ¢½øÐд¦Àí£¬Ïà¶ÔÓÚ»ùÓÚOperator
TimeµÄʱ¼ä´°¿Ú£¬FlinkÐèÒªÕ¼Óøü¶àÄڴ棬ÇÒ»áÖ±½ÓÓ°ÏìÏûÏ¢´¦ÀíµÄÑÓ³Ùʱ¼ä¡£¶Ô´Ë£¬Ò»¸ö¿ÉÄܵÄÓÅ»¯´ëÊ©ÊÇ£¬¶ÔÓÚ¾ÛºÏÀàµÄ²Ù×÷·û£¬¿ÉÒÔÌáǰ¶Ô²¿·ÖÏûÏ¢½øÐоۺϲÙ×÷£¬µ±ÓÐÊôÓÚ¸Ãʱ¼ä´°¿ÚµÄÐÂÏûÏ¢Á÷Èëʱ£¬»ùÓÚ֮ǰµÄ²¿·Ö¾ÛºÏ½á¹û¼ÌÐø¼ÆË㣬ÕâÑùµÄ»°£¬Ö»Ð軺´æÖÐ¼ä¼ÆËã½á¹û¼´¿É£¬ÎÞÐ軺´æ¸Ãʱ¼ä´°¿ÚµÄËùÓÐÏûÏ¢¡£
¶ÔÓÚ»ùÓÚEvent Timeʱ¼ä´°¿ÚµÄ²Ù×÷·ûÀ´Ëµ£¬Á÷ÈëWaterMarkµÄʱ¼ä´ÁÓ뵱ǰ½ÚµãµÄʱÖÓÒ»ÖÂÊÇ×î¼òµ¥ÀíÏëµÄ×´¿ö£¬µ«ÊÇÔÚʵ¼Ê»·¾³ÖÐÊDz»¿ÉÄܵģ¬ÓÉÓÚÏûÏ¢µÄÂÒÐòÒÔ¼°Ç°Ãæ½Úµã´¦ÀíЧÂʵIJ»Í¬£¬×ÜÊÇ»áÓÐijЩÏûÏ¢Á÷Èëʱ¼ä´óÓÚÆä±¾ÉíµÄʱ¼ä´Á£¬ÕæÊµWaterMarkʱ¼ä´ÁÓëÀíÏëÇé¿öÏÂWaterMarkʱ¼ä´ÁµÄ²î±ð³ÆÎªTime
Skew£¬Èçͼ5Ëùʾ£º
ͼ5 WaterMarkµÄTime Skewͼ
Time Skew¾ö¶¨Á˸ÃWaterMarkÓëÉÏÒ»¸öWaterMarkÖ®¼äµÄʱ¼ä´°¿ÚËùÓÐÊý¾ÝÐèÒª»º´æµÄʱ¼ä£¬Time
Skewʱ¼äÔ½³¤£¬¸Ãʱ¼ä´°¿ÚÊý¾ÝµÄÑÓ³ÙÔ½³¤£¬Õ¼ÓÃÄÚ´æµÄʱ¼äÒ²Ô½³¤£¬Í¬Ê±»á¶ÔÁ÷´¦ÀíϵͳµÄÍÌÍÂÁ¿²úÉú¸ºÃæÓ°Ïì¡£
»ùÓÚʱ¼ä´ÁµÄÅÅÐò
ÔÚÁ÷´¦ÀíϵͳÖУ¬ÓÉÓÚÁ÷ÈëµÄÏûÏ¢ÊÇÎÞÏ޵ģ¬ËùÒÔ¶ÔÏûÏ¢½øÐÐÅÅÐò»ù±¾Éϱ»ÈÏΪÊDz»¿ÉÐеġ£µ«ÊÇÔÚFlinkÁ÷´¦ÀíϵͳÖУ¬»ùÓÚWaterMark£¬FlinkʵÏÖÁË»ùÓÚʱ¼ä´ÁµÄÈ«¾ÖÅÅÐò¡£ÅÅÐòµÄʵÏÖ˼·ÈçÏ£ºÅÅÐò²Ù×÷·û»º´æËùÓÐÁ÷ÈëµÄÏûÏ¢£¬µ±Æä½ÓÊÕµ½WaterMarkʱ£¬¶Ôʱ¼ä´ÁСÓÚ¸ÃWaterMarkµÄÏûÏ¢½øÐÐÅÅÐò£¬²¢·¢Ë͵½ÏÂÒ»¸ö½Úµã£¬ÔÚ´ËÅÅÐò²Ù×÷·ûÖÐÊÍ·ÅËùÓÐʱ¼ä´ÁСÓÚ¸ÃWaterMarkµÄÏûÏ¢£¬¼ÌÐø»º´æÁ÷ÈëµÄÏûÏ¢£¬µÈ´ýÏÂÒ»¸öWaterMark´¥·¢ÏÂÒ»´ÎÅÅÐò¡£
ÓÉÓÚWaterMark±£Ö¤ÁËÔÚÆäÖ®ºó²»»á³öÏÖʱ¼ä´Á±ÈËüСµÄÏûÏ¢£¬ËùÒÔ¿ÉÒÔ±£Ö¤ÅÅÐòµÄÕýÈ·ÐÔ¡£ÐèҪעÒâµÄÊÇ£¬Èç¹ûÅÅÐò²Ù×÷·ûÓжà¸ö½Úµã£¬Ö»Äܱ£Ö¤Ã¿¸ö½ÚµãµÄÁ÷³öÏûÏ¢ÊÇÓÐÐòµÄ£¬½ÚµãÖ®¼äµÄÏûÏ¢²»Äܱ£Ö¤ÓÐÐò£¬ÒªÊµÏÖÈ«¾ÖÓÐÐò£¬ÔòÖ»ÄÜÓÐÒ»¸öÅÅÐò²Ù×÷·û½Úµã¡£
ͨ¹ýÖ§³Ö»ùÓÚEvent TimeµÄÏûÏ¢´¦Àí£¬FlinkÀ©Õ¹ÁËÆäÁ÷´¦ÀíϵͳµÄÓ¦Ó÷¶Î§£¬Ê¹µÃ¸ü¶àµÄÁ÷´¦ÀíÈÎÎñ¿ÉÒÔͨ¹ýFlinkÀ´Ö´ÐС£
¶¨ÖƵÄÄÚ´æ¹ÜÀí
FlinkÏîÄ¿»ùÓÚJava¼°ScalaµÈJVMÓïÑÔ£¬JVM±¾Éí×÷Ϊһ¸ö¸÷ÖÖÀàÐÍÓ¦ÓõÄÖ´ÐÐÆ½Ì¨£¬Æä¶ÔJava¶ÔÏóµÄ¹ÜÀíÒ²ÊÇ»ùÓÚͨÓõĴ¦Àí²ßÂÔ£¬ÆäÀ¬»ø»ØÊÕÆ÷ͨ¹ý¹ÀËãJava¶ÔÏóµÄÉúÃüÖÜÆÚ¶ÔJava¶ÔÏó½øÐÐÓÐЧÂʵĹÜÀí¡£
Õë¶Ô²»Í¬ÀàÐ͵ÄÓ¦Óã¬Óû§¿ÉÄÜÐèÒªÕë¶Ô¸ÃÀàÐÍÓ¦ÓõÄÌØµã£¬ÅäÖÃÕë¶ÔÐÔµÄJVM²ÎÊý¸üÓÐЧÂʵĹÜÀíJava¶ÔÏ󣬴ӶøÌá¸ßÐÔÄÜ¡£ÕâÖÖJVMµ÷ÓŵĺÚħ·¨ÐèÒªÓû§¶ÔÓ¦Óñ¾Éí¼°JVMµÄ¸÷²ÎÊýÓÐÉîÈëÁ˽⣬¼«´óµØÌá¸ßÁË·Ö²¼Ê½¼ÆËãÆ½Ì¨µÄµ÷ÓÅÃż÷¡£Flink¿ò¼Ü±¾ÉíÁË½â¼ÆËãÂ߼ÿ¸ö²½ÖèµÄÊý¾Ý´«Ê䣬Ïà±ÈÓÚJVMÀ¬»ø»ØÊÕÆ÷£¬ÆäÁ˽â¸ü¶àµÄJava¶ÔÏóÉúÃüÖÜÆÚ£¬´Ó¶øÎª¸üÓÐЧÂʵعÜÀíJava¶ÔÏóÌṩÁË¿ÉÄÜ¡£
JVM´æÔÚµÄÎÊÌâ
Java¶ÔÏó¿ªÏú
Ïà¶ÔÓÚc/c++µÈ¸ü¼Ó½Ó½üµ×²ãµÄÓïÑÔ£¬Java¶ÔÏóµÄ´æ´¢ÃܶÈÏà¶ÔÆ«µÍ£¬ÀýÈç[1]£¬¡°abcd¡±ÕâÑù¼òµ¥µÄ×Ö·û´®ÔÚUTF-8±àÂëÖÐÐèÒª4¸ö×Ö½Ú´æ´¢£¬µ«²ÉÓÃÁËUTF-16±àÂë´æ´¢×Ö·û´®µÄJavaÔòÐèÒª8¸ö×Ö½Ú£¬Í¬Ê±Java¶ÔÏó»¹ÓÐheaderµÈÆäËû¶îÍâÐÅÏ¢£¬Ò»¸ö4×Ö½Ú×Ö·û´®¶ÔÏóÔÚJavaÖÐÐèÒª48×ֽڵĿռäÀ´´æ´¢¡£¶ÔÓڴ󲿷ֵĴóÊý¾ÝÓ¦Óã¬ÄÚ´æ¶¼ÊÇϡȱ×ÊÔ´£¬¸üÓÐЧÂʵØÄÚ´æ´æ´¢£¬Òâζ×ÅCPUÊý¾Ý·ÃÎÊÍÌÍÂÁ¿¸ü¸ß£¬ÒÔ¼°¸üÉÙ´ÅÅÌÂ䵨µÄ´æÔÚ¡£
¶ÔÏó´æ´¢½á¹¹Òý·¢µÄcache miss
ΪÁË»º½âCPU´¦ÀíËÙ¶ÈÓëÄÚ´æ·ÃÎÊËٶȵIJî¾à[2]£¬ÏÖ´úCPUÊý¾Ý·ÃÎÊÒ»°ã¶¼»áÓж༶»º´æ¡£µ±´ÓÄÚ´æ¼ÓÔØÊý¾Ýµ½»º´æÊ±£¬Ò»°ãÊÇÒÔcache
lineΪµ¥Î»¼ÓÔØÊý¾Ý£¬ËùÒÔµ±CPU·ÃÎʵÄÊý¾ÝÈç¹ûÊÇÔÚÄÚ´æÖÐÁ¬Ðø´æ´¢µÄ»°£¬·ÃÎʵÄЧÂÊ»á·Ç³£¸ß¡£Èç¹ûCPUÒª·ÃÎʵÄÊý¾Ý²»ÔÚµ±Ç°»º´æËùÓеÄcache
lineÖУ¬ÔòÐèÒª´ÓÄÚ´æÖмÓÔØ¶ÔÓ¦µÄÊý¾Ý£¬Õâ±»³ÆÎªÒ»´Îcache miss¡£µ±cache miss·Ç³£¸ßµÄʱºò£¬CPU´ó²¿·ÖµÄʱ¼ä¶¼ÔڵȴýÊý¾Ý¼ÓÔØ£¬¶ø²»ÊÇÕæÕýµÄ´¦ÀíÊý¾Ý¡£Java¶ÔÏó²¢²»ÊÇÁ¬ÐøµÄ´æ´¢ÔÚÄÚ´æÉÏ£¬Í¬Ê±ºÜ¶àµÄJavaÊý¾Ý½á¹¹µÄÊý¾Ý¾Û¼¯ÐÔÒ²²»ºÃ¡£
´óÊý¾ÝµÄÀ¬»ø»ØÊÕ
JavaµÄÀ¬»ø»ØÊÕ»úÖÆÒ»Ö±ÈÃJava¿ª·¢ÕßÓÖ°®ÓÖºÞ£¬Ò»·½ÃæËüÃâÈ¥ÁË¿ª·¢Õß×Ô¼º»ØÊÕ×ÊÔ´µÄ²½Ö裬Ìá¸ßÁË¿ª·¢Ð§ÂÊ£¬¼õÉÙÁËÄÚ´æÐ¹Â©µÄ¿ÉÄÜ£¬ÁíÒ»·½ÃæÀ¬»ø»ØÊÕÒ²ÊÇJavaÓ¦ÓõIJ»¶¨Ê±Õ¨µ¯£¬ÓÐʱÃë¼¶ÉõÖÁÊÇ·ÖÖÓ¼¶µÄÀ¬»ø»ØÊÕ¼«´óÓ°ÏìÁËJavaÓ¦ÓõÄÐÔÄܺͿÉÓÃÐÔ¡£ÔÚʱÏÂÊý¾ÝÖÐÐÄ£¬´óÈÝÁ¿ÄÚ´æµÃµ½Á˹㷺µÄÓ¦Óã¬ÉõÖÁ³öÏÖÁ˵¥Ì¨»úÆ÷ÅäÖÃTBÄÚ´æµÄÇé¿ö£¬Í¬Ê±£¬´óÊý¾Ý·ÖÎöͨ³£»á±éÀúÕû¸öÔ´Êý¾Ý¼¯£¬¶ÔÊý¾Ý½øÐÐת»»¡¢ÇåÏ´¡¢´¦ÀíµÈ²½Öè¡£ÔÚÕâ¸ö¹ý³ÌÖУ¬»á²úÉúº£Á¿µÄJava¶ÔÏó£¬JVMµÄÀ¬»ø»ØÊÕÖ´ÐÐЧÂʶÔÐÔÄÜÓкܴóÓ°Ï졣ͨ¹ýJVM²ÎÊýµ÷ÓÅÌá¸ßÀ¬»ø»ØÊÕЧÂÊÐèÒªÓû§¶ÔÓ¦Óúͷֲ¼Ê½¼ÆËã¿ò¼ÜÒÔ¼°JVMµÄ¸÷²ÎÊýÓÐÉîÈëÁ˽⣬¶øÇÒÓÐʱºòÕâÒ²Ô¶Ô¶²»¹»¡£
OOMÎÊÌâ
OutOfMemoryErrorÊÇ·Ö²¼Ê½¼ÆËã¿ò¼Ü¾³£»áÓöµ½µÄÎÊÌ⣬µ±JVMÖÐËùÓжÔÏó´óС³¬¹ý·ÖÅ䏸JVMµÄÄÚ´æ´óСʱ£¬¾Í»á³öÏÖOutOfMemoryError´íÎó£¬JVM±ÀÀ££¬·Ö²¼Ê½¿ò¼ÜµÄ½¡×³ÐÔºÍÐÔÄܶ¼»áÊܵ½Ó°Ï졣ͨ¹ýJVM¹ÜÀíÄڴ棬ͬʱÊÔͼ½â¾öOOMÎÊÌâµÄÓ¦Óã¬Í¨³£¶¼ÐèÒª¼ì²éJava¶ÔÏóµÄ´óС£¬²¢ÔÚijЩ´æ´¢Java¶ÔÏóÌØ±ð¶àµÄÊý¾Ý½á¹¹ÖÐÉèÖÃãÐÖµ½øÐпØÖÆ¡£µ«ÊÇJVM²¢Ã»ÓÐÌṩ¹Ù·½¼ì²éJava¶ÔÏó´óСµÄ¹¤¾ß£¬µÚÈý·½µÄ¹¤¾ßÀà¿â¿ÉÄÜÎÞ·¨×¼È·Í¨ÓõØÈ·¶¨Java¶ÔÏó´óС[6]¡£ÇÖÈëʽµÄãÐÖµ¼ì²éÒ²»áΪ·Ö²¼Ê½¼ÆËã¿ò¼ÜµÄʵÏÖÔö¼ÓºÜ¶à¶îÍâÓëÒµÎñÂß¼Î޹صĴúÂë¡£
FlinkµÄ´¦Àí²ßÂÔ
ΪÁ˽â¾öÒÔÉÏÌáµ½µÄÎÊÌ⣬¸ßÐÔÄÜ·Ö²¼Ê½¼ÆËã¿ò¼Üͨ³£ÐèÒªÒÔϼ¼Êõ£º
¶¨ÖƵÄÐòÁл¯¹¤¾ß¡£ÏÔʽÄÚ´æ¹ÜÀíµÄǰÌá²½Öè¾ÍÊÇÐòÁл¯£¬½«Java¶ÔÏóÐòÁл¯³É¶þ½øÖÆÊý¾Ý´æ´¢ÔÚÄÚ´æÉÏ£¨on
heap»òÊÇoff-heap£©¡£Í¨ÓõÄÐòÁл¯¿ò¼Ü£¬ÈçJavaĬÈÏʹÓÃjava.io.Serializable½«Java¶ÔÏó¼°Æä³ÉÔ±±äÁ¿µÄËùÓÐÔªÐÅÏ¢×÷ΪÆäÐòÁл¯Êý¾ÝµÄÒ»²¿·Ö£¬ÐòÁл¯ºóµÄÊý¾Ý°üº¬ÁËËùÓз´ÐòÁл¯ËùÐèµÄÐÅÏ¢¡£ÕâÔÚijЩ³¡¾°ÖÐÊ®·Ö±ØÒª£¬µ«ÊǶÔÓÚFlinkÕâÑùµÄ·Ö²¼Ê½¼ÆËã¿ò¼ÜÀ´Ëµ£¬ÕâЩԪÊý¾ÝÐÅÏ¢¿ÉÄÜÊÇÈßÓàÊý¾Ý¡£¶¨ÖƵÄÐòÁл¯¿ò¼Ü£¬ÈçHadoopµÄorg.apache.hadoop.io.WritableÐèÒªÓû§ÊµÏָýӿڣ¬²¢×Ô¶¨ÒåÀàµÄÐòÁл¯ºÍ·´ÐòÁл¯·½·¨¡£ÕâÖÖ·½Ê½Ð§ÂÊ×î¸ß£¬µ«ÐèÒªÓû§¶îÍâµÄ¹¤×÷£¬²»¹»ÓѺá£
ÏÔʽµÄÄÚ´æ¹ÜÀí¡£Ò»°ãͨÓõÄ×ö·¨ÊÇÅúÁ¿ÉêÇëºÍÊÍ·ÅÄڴ棬ÿ¸öJVMʵÀýÓÐÒ»¸öͳһµÄÄÚ´æ¹ÜÀíÆ÷£¬ËùÓÐÄÚ´æµÄÉêÇëºÍÊͷŶ¼Í¨¹ý¸ÃÄÚ´æ¹ÜÀíÆ÷½øÐС£Õâ¿ÉÒÔ±ÜÃâ³£¼ûµÄÄÚ´æË鯬ÎÊÌ⣬ͬʱÓÉÓÚÊý¾ÝÒÔ¶þ½øÖƵķ½Ê½´æ´¢£¬¿ÉÒÔ´ó´ó¼õÇáÀ¬»ø»ØÊÕѹÁ¦¡£
»º´æÓѺõÄÊý¾Ý½á¹¹ºÍËã·¨¡£¶ÔÓÚ¼ÆËãÃܼ¯µÄÊý¾Ý½á¹¹ºÍËã·¨£¬Ö±½Ó²Ù×÷ÐòÁл¯ºóµÄ¶þ½øÖÆÊý¾Ý£¬¶ø²»Êǽ«¶ÔÏó·´ÐòÁл¯ºóÔÙ½øÐвÙ×÷¡£Í¬Ê±£¬Ö»½«²Ù×÷Ïà¹ØµÄÊý¾ÝÁ¬Ðø´æ´¢£¬¿ÉÒÔ×î´ó»¯µÄÀûÓÃL1/L2/L3»º´æ£¬¼õÉÙCache
missµÄ¸ÅÂÊ£¬ÌáÉýCPU¼ÆËãµÄÍÌÍÂÁ¿¡£ÒÔÅÅÐòΪÀý£¬ÓÉÓÚÅÅÐòµÄÖ÷Òª²Ù×÷ÊǶÔKey½øÐжԱȣ¬Èç¹û½«ËùÓÐÅÅÐòÊý¾ÝµÄKeyÓëValue·Ö¿ª²¢¶ÔKeyÁ¬Ðø´æ´¢£¬ÄÇô·ÃÎÊKeyʱµÄCacheÃüÖÐÂÊ»á´ó´óÌá¸ß¡£
¶¨ÖƵÄÐòÁл¯¹¤¾ß
·Ö²¼Ê½¼ÆËã¿ò¼Ü¿ÉÒÔʹÓö¨ÖÆÐòÁл¯¹¤¾ßµÄǰÌáÊÇÒª´ý´¦ÀíÊý¾ÝÁ÷ͨ³£ÊÇͬһÀàÐÍ£¬ÓÉÓÚÊý¾Ý¼¯¶ÔÏóµÄÀàÐ͹̶¨£¬´Ó¶ø¿ÉÒÔÖ»±£´æÒ»·Ý¶ÔÏóSchemaÐÅÏ¢£¬½ÚÊ¡´óÁ¿µÄ´æ´¢¿Õ¼ä¡£Í¬Ê±£¬¶ÔÓڹ̶¨´óСµÄÀàÐÍ£¬Ò²¿Éͨ¹ý¹Ì¶¨µÄÆ«ÒÆÎ»ÖôæÈ¡¡£ÔÚÐèÒª·ÃÎÊij¸ö¶ÔÏó³ÉÔ±±äÁ¿Ê±£¬Í¨¹ý¶¨ÖƵÄÐòÁл¯¹¤¾ß£¬²¢²»ÐèÒª·´ÐòÁл¯Õû¸öJava¶ÔÏ󣬶øÊÇÖ±½Óͨ¹ýÆ«ÒÆÁ¿£¬´Ó¶øÖ»ÐèÒª·´ÐòÁл¯Ìض¨µÄ¶ÔÏó³ÉÔ±±äÁ¿¡£Èç¹û¶ÔÏóµÄ³ÉÔ±±äÁ¿½Ï¶àʱ£¬Äܹ»´ó´ó¼õÉÙJava¶ÔÏóµÄ´´½¨¿ªÏú£¬ÒÔ¼°ÄÚ´æÊý¾ÝµÄ¿½±´´óС¡£FlinkÊý¾Ý¼¯¶¼Ö§³ÖÈÎÒâJava»òÊÇScalaÀàÐÍ£¬Í¨¹ý×Ô¶¯Éú³É¶¨ÖÆÐòÁл¯¹¤¾ß£¬¼È±£Ö¤ÁËAPI½Ó¿Ú¶ÔÓû§ÓѺ㨲»ÓÃÏñHadoopÄÇÑùÊý¾ÝÀàÐÍÐèÒª¼Ì³ÐʵÏÖorg.apache.hadoop.io.Writable½Ó¿Ú£©£¬Ò²´ïµ½Á˺ÍHadoopÀàËÆµÄÐòÁл¯Ð§ÂÊ¡£
Flink¶ÔÊý¾Ý¼¯µÄÀàÐÍÐÅÏ¢½øÐзÖÎö£¬È»ºó×Ô¶¯Éú³É¶¨ÖƵÄÐòÁл¯¹¤¾ßÀà¡£FlinkÖ§³ÖÈÎÒâµÄJava»òÊÇScalaÀàÐÍ£¬Í¨¹ýJava
Reflection¿ò¼Ü·ÖÎö»ùÓÚJavaµÄFlink³ÌÐòUDF£¨User Define Function£©µÄ·µ»ØÀàÐ͵ÄÀàÐÍÐÅÏ¢£¬Í¨¹ýScala
Compiler·ÖÎö»ùÓÚScalaµÄFlink³ÌÐòUDFµÄ·µ»ØÀàÐ͵ÄÀàÐÍÐÅÏ¢¡£ÀàÐÍÐÅÏ¢ÓÉTypeInformationÀà±íʾ£¬Õâ¸öÀàÓÐÖî¶à¾ßÌåʵÏÖÀ࣬ÀýÈ磺
BasicTypeInfoÈÎÒâJava»ù±¾ÀàÐÍ£¨×°°ü»òδװ°ü£©ºÍStringÀàÐÍ¡£
BasicArrayTypeInfoÈÎÒâJava»ù±¾ÀàÐÍÊý×飨װ°ü»òδװ°ü£©ºÍStringÊý×é¡£
WritableTypeInfoÈÎÒâHadoopµÄWritable½Ó¿ÚµÄʵÏÖÀà¡£
TupleTypeInfoÈÎÒâµÄFlink tupleÀàÐÍ(Ö§³ÖTuple1 to Tuple25)¡£
Flink tuplesÊǹ̶¨³¤¶È¹Ì¶¨ÀàÐ͵ÄJava TupleʵÏÖ¡£
CaseClassTypeInfoÈÎÒâµÄ Scala CaseClass(°üÀ¨ Scala tuples)¡£
PojoTypeInfoÈÎÒâµÄPOJO (Java or Scala)£¬ÀýÈçJava¶ÔÏóµÄËùÓгÉÔ±±äÁ¿£¬ÒªÃ´ÊÇpublicÐÞÊηû¶¨Ò壬ҪôÓÐgetter/setter·½·¨¡£
GenericTypeInfoÈÎÒâÎÞ·¨Æ¥Åä֮ǰ¼¸ÖÖÀàÐ͵ÄÀà¡£
ǰ6ÖÖÀàÐÍÊý¾Ý¼¯¼¸ºõ¸²¸ÇÁ˾ø´ó²¿·ÖµÄFlink³ÌÐò£¬Õë¶Ôǰ6ÖÖÀàÐÍÊý¾Ý¼¯£¬Flink½Ô¿ÉÒÔ×Ô¶¯Éú³É¶ÔÓ¦µÄTypeSerializer¶¨ÖÆÐòÁл¯¹¤¾ß£¬·Ç³£ÓÐЧÂʵضÔÊý¾Ý¼¯½øÐÐÐòÁл¯ºÍ·´ÐòÁл¯¡£¶ÔÓÚµÚ7ÖÖÀàÐÍ£¬FlinkʹÓÃKryo½øÐÐÐòÁл¯ºÍ·´ÐòÁл¯¡£´ËÍ⣬¶ÔÓڿɱ»ÓÃ×÷KeyµÄÀàÐÍ£¬Flink»¹Í¬Ê±×Ô¶¯Éú³ÉTypeComparator£¬ÓÃÀ´¸¨ÖúÖ±½Ó¶ÔÐòÁл¯ºóµÄ¶þ½øÖÆÊý¾ÝÖ±½Ó½øÐÐcompare¡¢hashµÈ²Ù×÷¡£¶ÔÓÚTuple¡¢CaseClass¡¢PojoµÈ×éºÏÀàÐÍ£¬Flink×Ô¶¯Éú³ÉµÄTypeSerializer¡¢TypeComparatorͬÑùÊÇ×éºÏµÄ£¬²¢°ÑÆä³ÉÔ±µÄÐòÁл¯/·´ÐòÁл¯´úÀí¸øÆä³ÉÔ±¶ÔÓ¦µÄTypeSerializer¡¢TypeComparator£¬Èçͼ6Ëùʾ£º
ͼ6 Flink×éºÏÀàÐÍÐòÁл¯
´ËÍâÈçÓÐÐèÒª£¬Óû§¿Éͨ¹ý¼¯³ÉTypeInformation½Ó¿Ú¶¨ÖÆÊµÏÖ×Ô¼ºµÄÐòÁл¯¹¤¾ß¡£
ÏÔʽµÄÄÚ´æ¹ÜÀí
À¬»ø»ØÊÕÊÇJVMÄÚ´æ¹ÜÀí»Ø±Ü²»Á˵ÄÎÊÌ⣬JDK8µÄG1Ëã·¨¸ÄÉÆÁËJVMÀ¬»ø»ØÊÕµÄЧÂʺͿÉÓ÷¶Î§£¬µ«¶ÔÓÚ´óÊý¾Ý´¦Àíʵ¼Ê»·¾³»¹Ô¶Ô¶²»¹»¡£ÕâÒ²ºÍÏÖÔÚ·Ö²¼Ê½¿ò¼ÜµÄ·¢Õ¹Ç÷ÊÆÓÐËù³åÍ»£¬Ô½À´Ô½¶àµÄ·Ö²¼Ê½¼ÆËã¿ò¼ÜÏ£Íû¾¡¿ÉÄÜ¶àµØ½«´ý´¦ÀíÊý¾Ý¼¯·ÅÈëÄڴ棬¶ø¶ÔÓÚJVMÀ¬»ø»ØÊÕÀ´Ëµ£¬ÄÚ´æÖÐJava¶ÔÏóÔ½ÉÙ¡¢´æ»îʱ¼äÔ½¶Ì£¬ÆäЧÂÊÔ½¸ß¡£Í¨¹ýJVM½øÐÐÄÚ´æ¹ÜÀíµÄ»°£¬OutOfMemoryErrorÒ²ÊÇÒ»¸öºÜÄѽâ¾öµÄÎÊÌ⡣ͬʱ£¬ÔÚJVMÄÚ´æ¹ÜÀíÖУ¬Java¶ÔÏóÓÐDZÔÚµÄË鯬»¯´æ´¢ÎÊÌ⣨Java¶ÔÏóËùÓÐÐÅÏ¢¿ÉÄÜÔÚÄÚ´æÖÐÁ¬Ðø´æ´¢£©£¬Ò²ÓпÉÄÜÔÚËùÓÐJava¶ÔÏó´óСûÓг¬¹ýJVM·ÖÅäÄÚ´æÊ±£¬³öÏÖOutOfMemoryErrorÎÊÌâ¡£Flink½«ÄÚ´æ·ÖΪ3¸ö²¿·Ö£¬Ã¿¸ö²¿·Ö¶¼Óв»Í¬ÓÃ;£º
Network buffers: һЩÒÔ32KB ByteÊý×éΪµ¥Î»µÄbuffer£¬Ö÷Òª±»ÍøÂçÄ£¿éÓÃÓÚÊý¾ÝµÄÍøÂç´«Êä¡£
Memory Manager pool´óÁ¿ÒÔ32KB ByteÊý×éΪµ¥Î»µÄÄÚ´æ³Ø£¬ËùÓеÄÔËÐÐʱËã·¨£¨ÀýÈçSort/Shuffle/Join£©¶¼´ÓÕâ¸öÄÚ´æ³ØÉêÇëÄڴ棬²¢½«ÐòÁл¯ºóµÄÊý¾Ý´æ´¢ÆäÖУ¬½áÊøºóÊÍ·Å»ØÄÚ´æ³Ø¡£
Remaining (Free) HeapÖ÷ÒªÁô¸øUDFÖÐÓû§×Ô¼º´´½¨µÄJava¶ÔÏó£¬ÓÉJVM¹ÜÀí¡£
Network buffersÔÚFlinkÖÐÖ÷Òª»ùÓÚNettyµÄÍøÂç´«Ê䣬ÎÞÐè¶à½²¡£Remaining
HeapÓÃÓÚUDFÖÐÓû§×Ô¼º´´½¨µÄJava¶ÔÏó£¬ÔÚUDFÖУ¬Óû§Í¨³£ÊÇÁ÷ʽµÄ´¦ÀíÊý¾Ý£¬²¢²»ÐèÒªºÜ¶àÄڴ棬ͬʱFlinkÒ²²»¹ÄÀøÓû§ÔÚUDFÖлº´æºÜ¶àÊý¾Ý£¬ÒòΪÕâ»áÒýÆðÇ°ÃæÌáµ½µÄÖî¶àÎÊÌâ¡£Memory
Manager pool£¨ÒÔºóÒÔÄÚ´æ³Ø´úÖ¸£©Í¨³£»áÅäÖÃΪ×î´óµÄÒ»¿éÄڴ棬½ÓÏÂÀ´»áÏêϸ½éÉÜ¡£
ÔÚFlinkÖУ¬ÄÚ´æ³ØÓɶà¸öMemorySegment×é³É£¬Ã¿¸öMemorySegment´ú±íÒ»¿éÁ¬ÐøµÄÄڴ棬µ×²ã´æ´¢ÊÇbyte[]£¬Ä¬ÈÏ32KB´óС¡£MemorySegmentÌṩÁ˸ù¾ÝÆ«ÒÆÁ¿·ÃÎÊÊý¾ÝµÄ¸÷ÖÖ·½·¨£¬Èçget/put
int¡¢long¡¢float¡¢doubleµÈ£¬MemorySegmentÖ®¼äÊý¾Ý¿½±´µÈ·½·¨ºÍjava.nio.ByteBufferÀàËÆ¡£¶ÔÓÚFlinkµÄÊý¾Ý½á¹¹£¬Í¨³£°üÀ¨¶à¸öÏòÄÚ´æ³ØÉêÇëµÄMemeorySegment£¬ËùÓÐÒª´æÈëµÄ¶ÔÏóͨ¹ýTypeSerializerÐòÁл¯Ö®ºó£¬½«¶þ½øÖÆÊý¾Ý´æ´¢ÔÚMemorySegmentÖУ¬ÔÚÈ¡³öʱͨ¹ýTypeSerializer·´ÐòÁл¯¡£Êý¾Ý½á¹¹Í¨¹ýMemorySegmentÌṩµÄset/get·½·¨·ÃÎʾßÌåµÄ¶þ½øÖÆÊý¾Ý¡£FlinkÕâÖÖ¿´ÆðÀ´±È½Ï¸´ÔÓµÄÄÚ´æ¹ÜÀí·½Ê½´øÀ´µÄºÃ´¦Ö÷ÒªÓУº
¶þ½øÖƵÄÊý¾Ý´æ´¢´ó´óÌá¸ßÁËÊý¾Ý´æ´¢Ãܶȣ¬½ÚÊ¡ÁË´æ´¢¿Õ¼ä¡£
ËùÓеÄÔËÐÐʱÊý¾Ý½á¹¹ºÍËã·¨Ö»ÄÜͨ¹ýÄÚ´æ³ØÉêÇëÄڴ棬±£Ö¤ÁËÆäʹÓõÄÄÚ´æ´óСÊǹ̶¨µÄ£¬²»»áÒòΪÔËÐÐʱÊý¾Ý½á¹¹ºÍËã·¨¶ø·¢ÉúOOM¡£¶ÔÓڴ󲿷ֵķֲ¼Ê½¼ÆËã¿ò¼ÜÀ´Ëµ£¬Õⲿ·ÖÓÉÓÚÒª»º´æ´óÁ¿Êý¾Ý×îÓпÉÄܵ¼ÖÂOOM¡£
ÄÚ´æ³ØËäȻռ¾ÝÁ˴󲿷ÖÄڴ棬µ«ÆäÖеÄMemorySegmentÈÝÁ¿½Ï´ó£¨Ä¬ÈÏ32KB£©£¬ËùÒÔÄÚ´æ³ØÖеÄJava¶ÔÏóÆäʵºÜÉÙ£¬¶øÇÒÒ»Ö±±»ÄÚ´æ³ØÒýÓã¬ËùÓÐÔÚÀ¬»ø»ØÊÕʱºÜ¿ì½øÈë³Ö¾Ã´ú£¬´ó´ó¼õÇáÁËJVMÀ¬»ø»ØÊÕµÄѹÁ¦¡£
Remaining HeapµÄÄÚ´æËäÈ»ÓÉJVM¹ÜÀí£¬µ«ÊÇÓÉÓÚÆäÖ÷ÒªÓÃÀ´´æ´¢Óû§´¦ÀíµÄÁ÷ʽÊý¾Ý£¬ÉúÃüÖÜÆÚ·Ç³£¶Ì£¬ËٶȺܿìµÄMinor
GC¾Í»áÈ«²¿»ØÊÕµô£¬Ò»°ã²»»á´¥·¢Full GC¡£
Flinkµ±Ç°µÄÄÚ´æ¹ÜÀíÔÚ×îµ×²ãÊÇ»ùÓÚbyte[]£¬ËùÒÔÊý¾Ý×îÖÕ»¹ÊÇon-heap£¬×î½üFlinkÔö¼ÓÁËoff-heapµÄÄÚ´æ¹ÜÀíÖ§³Ö¡£Flink
off-heapµÄÄÚ´æ¹ÜÀíÏà¶ÔÓÚon-heapµÄÓŵãÖ÷ÒªÔÚÓÚ£º
Æô¶¯·ÖÅäÁË´óÄÚ´æ(ÀýÈç100G)µÄJVMºÜºÄ·Ñʱ¼ä£¬À¬»ø»ØÊÕÒ²ºÜÂý¡£Èç¹û²ÉÓÃoff-heap£¬Ê£ÏµÄNetwork
bufferºÍRemaining heap¶¼»áºÜС£¬À¬»ø»ØÊÕÒ²²»Óÿ¼ÂÇMemorySegmentÖеÄJava¶ÔÏóÁË¡£
¸üÓÐЧÂʵÄIO²Ù×÷¡£ÔÚoff-heapÏ£¬½«MemorySegmentдµ½´ÅÅÌ»òÊÇÍøÂç¿ÉÒÔÖ§³Özeor-copy¼¼Êõ£¬¶øon-heapµÄ»°ÔòÖÁÉÙÐèÒªÒ»´ÎÄڴ濽±´¡£
off-heap¿ÉÓÃÓÚ´íÎó»Ö¸´£¬±ÈÈçJVM±ÀÀ££¬ÔÚon-heapʱÊý¾ÝÒ²ËæÖ®¶ªÊ§£¬µ«ÔÚoff-heapÏ£¬off-heapµÄÊý¾Ý¿ÉÄÜ»¹ÔÚ¡£´ËÍ⣬off-heapÉϵÄÊý¾Ý»¹¿ÉÒÔºÍÆäËû³ÌÐò¹²Ïí¡£
»º´æÓѺõļÆËã
´ÅÅÌIOºÍÍøÂçIO֮ǰһֱ±»ÈÏΪÊÇHadoopϵͳµÄÆ¿¾±£¬µ«ÊÇËæ×ÅSpark¡¢FlinkµÈÐÂÒ»´ú·Ö²¼Ê½¼ÆËã¿ò¼ÜµÄ·¢Õ¹£¬Ô½À´Ô½¶àµÄÇ÷ÊÆÊ¹µÃCPU/MemoryÖð½¥³ÉΪƿ¾±£¬ÕâЩÇ÷ÊÆ°üÀ¨£º
¸üÏȽøµÄIOÓ²¼þÖð½¥ÆÕ¼°¡£10GBÍøÂçºÍSSDÓ²Å̵ÈÒѾ±»Ô½À´Ô½¶àµÄÊý¾ÝÖÐÐÄʹÓá£
¸ü¸ßЧµÄ´æ´¢¸ñʽ¡£Parquet£¬ORCµÈÁÐʽ´æ´¢±»Ô½À´Ô½¶àµÄHadoopÏîĿ֧³Ö£¬Æä·Ç³£¸ßЧµÄѹËõÐÔÄÜ´ó´ó¼õÉÙÁËÂ䵨´æ´¢µÄÊý¾ÝÁ¿¡£
¸ü¸ßЧµÄÖ´Ðмƻ®¡£ÀýÈçºÜ¶àSQLϵͳִÐмƻ®ÓÅ»¯Æ÷µÄFliter-Push-DownÓÅ»¯»á½«¹ýÂËÌõ¼þ¾¡¿ÉÄܵÄÌáǰ£¬ÉõÖÁÌáǰµ½ParquetµÄÊý¾Ý·ÃÎʲ㣬ʹµÃÔںܶàʵ¼ÊµÄ¹¤×÷¸ºÔØÖв¢²»ÐèÒªºÜ¶àµÄ´ÅÅÌIO¡£
ÓÉÓÚCPU´¦ÀíËٶȺÍÄÚ´æ·ÃÎÊËٶȵIJî¾à£¬ÌáÉýCPUµÄ´¦ÀíЧÂʵĹؼüÔÚÓÚ×î´ó»¯µÄÀûÓÃL1/L2/L3/Memory£¬¼õÉÙÈκβ»±ØÒªµÄCache
miss¡£¶¨ÖƵÄÐòÁл¯¹¤¾ß¸øFlinkÌṩÁË¿ÉÄÜ£¬Í¨¹ý¶¨ÖƵÄÐòÁл¯¹¤¾ß£¬Flink·ÃÎʵĶþ½øÖÆÊý¾Ý±¾Éí£¬ÒòΪռÓÃÄÚ´æ½ÏС£¬´æ´¢ÃܶȱȽϴ󣬶øÇÒ»¹¿ÉÒÔÔÚÉè¼ÆÊý¾Ý½á¹¹ºÍË㷨ʱ¾¡Á¿Á¬Ðø´æ´¢£¬¼õÉÙÄÚ´æË鯬»¯¶ÔCacheÃüÖÐÂʵÄÓ°Ï죬ÉõÖÁ¸ü½øÒ»²½£¬Flink¿ÉÒÔÖ»Êǽ«ÐèÒª²Ù×÷µÄ²¿·ÖÊý¾Ý£¨ÈçÅÅÐòʱµÄKey£©Á¬Ðø´æ´¢£¬¶ø½«ÆäËû²¿·ÖµÄÊý¾Ý´æ´¢ÔÚÆäËûµØ·½£¬´Ó¶ø×î´ó¿ÉÄܵØÌáÉýCacheÃüÖеĸÅÂÊ¡£
ÒÔFlinkÖеÄÅÅÐòΪÀý£¬ÅÅÐòͨ³£ÊÇ·Ö²¼Ê½¼ÆËã¿ò¼ÜÖÐÒ»¸ö·Ç³£ÖصIJÙ×÷£¬Flinkͨ¹ýÌØÊâÉè¼ÆµÄÅÅÐòËã·¨»ñµÃÁ˷dz£ºÃµÄÐÔÄÜ£¬ÆäÅÅÐòËã·¨µÄʵÏÖÈçÏ£º
½«´ýÅÅÐòµÄÊý¾Ý¾¹ýÐòÁл¯ºó´æ´¢ÔÚÁ½¸ö²»Í¬µÄMemorySegment¼¯ÖС£Êý¾ÝÈ«²¿µÄÐòÁл¯Öµ´æ·ÅÓÚÆäÖÐÒ»¸öMemorySegment¼¯ÖС£Êý¾ÝÐòÁл¯ºóµÄKeyºÍÖ¸ÏòµÚÒ»¸öMemorySegment¼¯ÖÐÖµµÄÖ¸Õë´æ·ÅÓÚµÚ¶þ¸öMemorySegment¼¯ÖС£
¶ÔµÚ¶þ¸öMemorySegment¼¯ÖеÄKey½øÐÐÅÅÐò£¬ÈçÐè½»»»KeyλÖã¬Ö»Ðè½»»»¶ÔÓ¦µÄKey+PointerµÄλÖ㬵ÚÒ»¸öMemorySegment¼¯ÖеÄÊý¾ÝÎÞÐè¸Ä±ä¡£
µ±±È½ÏÁ½¸öKey´óСʱ£¬TypeComparatorÌṩÁËÖ±½Ó»ùÓÚ¶þ½øÖÆÊý¾ÝµÄ¶Ô±È·½·¨£¬ÎÞÐè·´ÐòÁл¯ÈκÎÊý¾Ý¡£
ÅÅÐòÍê³Éºó£¬·ÃÎÊÊý¾Ýʱ£¬°´ÕÕµÚ¶þ¸öMemorySegment¼¯ÖÐKeyµÄ˳Ðò·ÃÎÊ£¬²¢Í¨¹ýPointerÖµÕÒµ½Êý¾ÝÔÚµÚÒ»¸öMemorySegment¼¯ÖеÄλÖã¬Í¨¹ýTypeSerializer·´ÐòÁл¯³ÉJava¶ÔÏ󷵻ء£
ͼ7 FlinkÅÅÐòËã·¨
ÕâÑùʵÏֵĺô¦ÓУº
ͨ¹ýKeyºÍFull data·ÖÀë´æ´¢µÄ·½Ê½¾¡Á¿½«±»²Ù×÷µÄÊý¾Ý×îС»¯£¬Ìá¸ßCacheÃüÖеĸÅÂÊ£¬´Ó¶øÌá¸ßCPUµÄÍÌÍÂÁ¿¡£
ÒÆ¶¯Êý¾Ýʱ£¬Ö»ÐèÒÆ¶¯Key+Pointer£¬¶øÎÞÐëÒÆ¶¯Êý¾Ý±¾Éí£¬´ó´ó¼õÉÙÁËÄڴ濽±´µÄÊý¾ÝÁ¿¡£
TypeComparatorÖ±½Ó»ùÓÚ¶þ½øÖÆÊý¾Ý½øÐвÙ×÷£¬½ÚÊ¡ÁË·´ÐòÁл¯µÄʱ¼ä¡£
ͨ¹ý¶¨ÖƵÄÄÚ´æ¹ÜÀí£¬Flinkͨ¹ý³ä·ÖÀûÓÃÄÚ´æÓëCPU»º´æ£¬´ó´óÌá¸ßÁËCPUµÄÖ´ÐÐЧÂÊ£¬Í¬Ê±ÓÉÓڴ󲿷ÖÄÚ´æ¶¼ÓÉ¿ò¼Ü×Ô¼º¿ØÖÆ£¬Ò²ºÜ´ó³Ì¶ÈÌáÉýÁËϵͳµÄ½¡×³ÐÔ£¬¼õÉÙÁËOOM³öÏֵĿÉÄÜ¡£
×ܽá
FlinkÊÇÒ»¸öÓµÓÐÖî¶àÌØÉ«µÄÏîÄ¿£¬°üÀ¨ÆäͳһµÄÅú´¦ÀíºÍÁ÷´¦ÀíÖ´ÐÐÒýÇæ£¬Í¨ÓôóÊý¾Ý¼ÆËã¿ò¼ÜÓ봫ͳÊý¾Ý¿âϵͳµÄ¼¼Êõ½áºÏ£¬ÒÔ¼°Á÷´¦ÀíϵͳµÄÖî¶à¼¼Êõ´´Ðµȣ¬ÒòΪƪ·ùÓÐÏÞ£¬Flink»¹ÓÐһЩÆäËûºÜÓÐÒâ˼µÄÌØÐÔûÓÐÏêϸ½éÉÜ£¬±ÈÈçDataSet
API¼¶±ðµÄÖ´Ðмƻ®ÓÅ»¯Æ÷£¬ÔÉúµÄµü´ú²Ù×÷·ûµÈ£¬¸ÐÐËȤµÄ¶ÁÕß¿ÉÒÔͨ¹ýFlink¹ÙÍøÁ˽â¸ü¶àFlinkµÄÏêϸÄÚÈÝ¡£
|