±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬±¾ÎÄÖ÷Òª½éÉÜÁ˶Ô
Flink ×öÒ»¸ö¼òÒªµÄÆÊÎöÈÏʶÒÔ¼° Flink°æ±¾ÖÐ µÄ½Ó¿ÚÖ§³Ö£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
|
|
1.¸ÅÊö
ÔÚÈç½ñÊý¾Ý±¬Õ¨µÄʱ´ú£¬ÆóÒµµÄÊý¾ÝÁ¿ÓëÈÕ¾ãÔö£¬´óÊý¾Ý²úÆ·²ã³ö²»Çî¡£½ñÌì¸ø´ó¼Ò·ÖÏíÒ»¿î²úÆ·¡ª¡ª
Apache Flink£¬Ä¿Ç°£¬ÒÑÊÇ Apache ¶¥¼¶ÏîĿ֮һ¡£ÄÇô£¬½ÓÏÂÀ´£¬±ÊÕßΪ´ó¼Ò½éÉÜFlink
µÄÏà¹ØÄÚÈÝ¡£
2.ÄÚÈÝ
2.1 What's Flink
Apache Flink ÊÇÒ»¸öÃæÏò·Ö²¼Ê½Êý¾ÝÁ÷´¦ÀíºÍÅúÁ¿Êý¾Ý´¦ÀíµÄ¿ªÔ´¼ÆËãÆ½Ì¨£¬ËüÄܹ»»ùÓÚͬһ¸öFlinkÔËÐÐʱ£¨Flink
Runtime£©£¬Ìṩ֧³ÖÁ÷´¦ÀíºÍÅú´¦ÀíÁ½ÖÖÀàÐÍÓ¦ÓõŦÄÜ¡£ÏÖÓеĿªÔ´¼ÆËã·½°¸£¬»á°ÑÁ÷´¦ÀíºÍÅú´¦Àí×÷ΪÁ½ÖÖ²»Í¬µÄÓ¦ÓÃÀàÐÍ£¬ÒòΪËûÃÇËüÃÇËùÌṩµÄSLAÊÇÍêÈ«²»ÏàͬµÄ£ºÁ÷´¦ÀíÒ»°ãÐèÒªÖ§³ÖµÍÑÓ³Ù¡¢Exactly-once±£Ö¤£¬¶øÅú´¦ÀíÐèÒªÖ§³Ö¸ßÍÌÍ¡¢¸ßЧ´¦Àí£¬ËùÒÔÔÚʵÏÖµÄʱºòͨ³£ÊÇ·Ö±ð¸ø³öÁ½Ì×ʵÏÖ·½·¨£¬»òÕßͨ¹ýÒ»¸ö¶ÀÁ¢µÄ¿ªÔ´¿ò¼ÜÀ´ÊµÏÖÆäÖÐÿһÖÖ´¦Àí·½°¸¡£ÀýÈ磬ʵÏÖÅú´¦ÀíµÄ¿ªÔ´·½°¸ÓÐMapReduce¡¢Tez¡¢Crunch¡¢Spark£¬ÊµÏÖÁ÷´¦ÀíµÄ¿ªÔ´·½°¸ÓÐSamza¡¢Storm¡£
FlinkÔÚʵÏÖÁ÷´¦ÀíºÍÅú´¦Àíʱ£¬Ó봫ͳµÄһЩ·½°¸ÍêÈ«²»Í¬£¬Ëü´ÓÁíÒ»¸öÊӽǿ´´ýÁ÷´¦ÀíºÍÅú´¦Àí£¬½«¶þÕßͳһÆðÀ´£ºFlinkÊÇÍêȫ֧³ÖÁ÷´¦Àí£¬Ò²¾ÍÊÇ˵×÷ΪÁ÷´¦Àí¿´´ýʱÊäÈëÊý¾ÝÁ÷ÊÇÎÞ½çµÄ£»Åú´¦Àí±»×÷ΪһÖÖÌØÊâµÄÁ÷´¦Àí£¬Ö»ÊÇËüµÄÊäÈëÊý¾ÝÁ÷±»¶¨ÒåΪÓнçµÄ¡£»ùÓÚͬһ¸öFlinkÔËÐÐʱ£¨Flink
Runtime£©£¬·Ö±ðÌṩÁËÁ÷´¦ÀíºÍÅú´¦ÀíAPI£¬¶øÕâÁ½ÖÖAPIÒ²ÊÇʵÏÖÉϲãÃæÏòÁ÷´¦Àí¡¢Åú´¦ÀíÀàÐÍÓ¦Óÿò¼ÜµÄ»ù´¡¡£
Flink ÊÇÒ»¿îеĴóÊý¾Ý´¦ÀíÒýÇæ£¬Ä¿±êÊÇͳһ²»Í¬À´Ô´µÄÊý¾Ý´¦Àí¡£Õâ¸öÄ¿±ê¿´ÆðÀ´ºÍ
Spark ºÍÀàËÆ¡£ÕâÁ½Ì×ϵͳ¶¼ÔÚ³¢ÊÔ½¨Á¢Ò»¸öͳһµÄƽ̨¿ÉÒÔÔËÐÐÅúÁ¿£¬Á÷ʽ£¬½»»¥Ê½£¬Í¼´¦Àí£¬»úÆ÷ѧϰµÈÓ¦Óá£ËùÒÔ£¬Flink
ºÍ Spark µÄÄ¿±ê²îÒì²¢²»´ó£¬ËûÃÇ×îÖ÷ÒªµÄÇø±ðÔÚÓÚʵÏÖµÄϸ½Ú¡£
ÏÂÃæ¸½ÉÏ Flink ¼¼ÊõÕ»µÄÒ»¸ö×ÜÀÀ£¬ÈçÏÂͼËùʾ£º

2.2 Compare
Á˽â Flink µÄ×÷ÓúÍÓÅȱµã£¬ÐèÒªÓÐÒ»¸ö²ÎÕÕÎÕâÀ±ÊÕßÒÔËüÓë
Spark À´¶Ô±È²ûÊö¡£´Ó³éÏó²ã£¬ÄÚ´æ¹ÜÀí£¬ÓïÑÔʵÏÖ£¬ÒÔ¼° API ºÍ SQL µÈ·½ÃæÀ´×¸Êö¡£
2.2.1 Abstraction
½Ó´¥¹ý Spark µÄͬѧ£¬Ó¦¸Ã±È½ÏÊìϤ£¬ÔÚ´¦ÀíÅú´¦ÀíÈÎÎñ£¬¿ÉÒÔʹÓÃ
RDD£¬¶ø¶ÔÓÚÁ÷´¦Àí£¬¿ÉÒÔʹÓà Streaming£¬È»ÆäÊÀ¼Í»¹ÊÇ RDD£¬ËùÒÔ±¾ÖÊÉÏ»¹ÊÇ RDD ³éÏó¶øÀ´¡£µ«ÊÇ£¬ÔÚ
Flink ÖУ¬Åú´¦ÀíÓà DataSet£¬¶ÔÓÚÁ÷´¦Àí£¬ÓÐ DataStreams¡£Ë¼ÏëÀàËÆ£¬µ«È´ÓÐËù²»Í¬£ºÆäÒ»£¬DataSet
ÔÚÔËÐÐʱ±íÏÖΪ Runtime Plans£¬¶øÔÚ Spark ÖУ¬RDD ÔÚÔËÐÐʱ±íÏÖΪ Java
Objects¡£ÔÚ Flink ÖÐÓÐ Logical Plan £¬ÕâºÍ Spark ÖÐµÄ DataFrames
ÀàËÆ¡£Òò¶ø£¬ÔÚ Flink ÖУ¬ÈôÊÇʹÓÃÕâÀà API £¬»á±»ÓÅÏÈÀ´ÓÅ»¯£¨¼´£º×Ô¶¯ÓÅ»¯µü´ú£©¡£ÈçÏÂͼËùʾ£º

È»¶ø£¬ÔÚ Spark ÖУ¬RDD ¾ÍûÓÐÕâ¿éµÄÏà¹ØÓÅ»¯£¬ÈçÏÂͼËùʾ£º

ÁíÍ⣬DataSet ºÍ DataStream ÊÇÏà¶Ô¶ÀÁ¢µÄ API£¬ÔÚ
Spark ÖУ¬ËùÓв»Í¬µÄ API£¬±ÈÈç Streaming£¬DataFrame ¶¼ÊÇ»ùÓÚ RDD
³éÏóµÄ¡£È»¶øÔÚ Flink ÖУ¬DataSet ºÍ DataStream ÊÇͬһ¸ö¹«ÓÃÒýÇæÖ®ÉϵÄÁ½¸ö¶ÀÁ¢µÄ³éÏó¡£ËùÒÔ£¬²»ÄܰÑÕâÁ½ÕßµÄÐÐΪºÏ²¢ÔÚÒ»Æð²Ù×÷£¬Ä¿Ç°¹Ù·½ÕýÔÚ´¦ÀíÕâÖÖÎÊÌ⣬Ïê¼û£ÛFLINK-2320£Ý
2.2.2 Memory
ÔÚ֮ǰµÄ°æ±¾£¨1.5ÒÔǰ£©£¬Spark ÑÓÓà Java µÄÄÚ´æ¹ÜÀíÀ´×öÊý¾Ý»º´æ£¬ÕâÑùºÜÈÝÒ×µ¼ÖÂ
OOM »òÕß GC¡£Ö®ºó£¬Spark ¿ªÊ¼×ªÏòÁíÍâ¸ü¼ÓÓѺú;«×¼µÄ¿ØÖÆÄڴ棬¼´£ºTungsten ÏîÄ¿¡£È»¶ø£¬¶ÔÓÚ
Flink À´Ëµ£¬´ÓÒ»¿ªÊ¼¾Í¼á³ÖʹÓÃ×Ô¼º¿ØÖÆÄÚ´æ¡£Flink ³ý°ÑÊý¾Ý´æÔÚ×Ô¼º¹ÜÀíµÄÄÚ´æÖ®Í⣬»¹Ö±½Ó²Ù×÷¶þ½øÖÆÊý¾Ý¡£ÔÚ
Spark 1.5Ö®ºóµÄ°æ±¾¿ªÊ¼£¬ËùÓÐµÄ DataFrame ²Ù×÷¶¼ÊÇÖ±½Ó×÷ÓÃÓÚ Tungsten
µÄ¶þ½øÖÆÊý¾ÝÉÏ¡£
PS£ºTungsten ÏîÄ¿½«ÊÇ Spark ×Ôµ®ÉúÒÔÀ´Äں˼¶±ðµÄ×î´ó¸Ä¶¯£¬ÒÔ´ó·ù¶ÈÌáÉý
Spark Ó¦ÓóÌÐòµÄÄÚ´æºÍ CPU ÀûÓÃÂÊΪĿ±ê£¬Ö¼ÔÚ×î´ó³Ì¶ÈÉÏÀûÓÃÓ²¼þÐÔÄÜ¡£¸ÃÏîÄ¿°üÀ¨ÁËÈý¸ö·½ÃæµÄ¸Ä½ø£º
ÄÚ´æ¹ÜÀíºÍ¶þ½øÖÆ´¦Àí£º¸ü¼ÓÃ÷È·µÄ¹ÜÀíÄڴ棬Ïû³ý JVM ¶ÔÏóÄ£ÐͺÍÀ¬»ø»ØÊÕ¿ªÏú¡£
»º´æÓѺüÆË㣺ʹÓÃËã·¨ºÍÊý¾Ý½á¹¹À´ÊµÏÖÄÚ´æ·Ö¼¶½á¹¹¡£
´úÂëÉú³É£ºÊ¹ÓôúÂëÉú³ÉÀ´ÀûÓÃÐÂÐͱàÒëÆ÷ºÍ CPU¡£
2.2.3 Program
Spark ʹÓà Scala À´ÊµÏֵģ¬ËüÌṩÁË Java£¬Python
ÒÔ¼° R ÓïÑԵıà³Ì½Ó¿Ú¡£¶ø¶ÔÓÚ Flink À´Ëµ£¬ËüÊÇʹÓà Java ʵÏֵģ¬Ìṩ Scala ±à³Ì
API¡£´Ó±à³ÌÓïÑԵĽǶÈÀ´¿´£¬Spark ÂÔÏԷḻһЩ¡£
2.2.4 API
Spark ºÍ Flink Á½Õß¶¼ÇãÏòÓÚʹÓà Scala À´ÊµÏÖ¶ÔÓ¦µÄÒµÎñ¡£¶Ô±ÈÁ½ÕßµÄ
WordCount ʾÀý£¬ºÜÀàËÆ¡£ÈçÏÂËùʾ£¬·Ö±ðΪ RDD ºÍ DataSet API µÄʾÀý´úÂ룺
RDD
// Spark WordCount
object WordCount {
def main(args: Array[String]) {
val env = new SparkContext("local","WordCount")
val data = List("hi","spark cluster","hi","spark")
val dataSet = env.parallelize(data)
val words = dataSet.flatMap(value => value.split("\\s+"))
val mappedWords = words.map(value => (value,1))
val sum = mappedWords.reduceByKey(_+_)
println(sum.collect())
}
} |
DataSet
// Flink WordCount
object WordCount {
def main(args: Array[String]) {
val env = ExecutionEnvironment.getExecutionEnvironment
val data = List("hello","flink
cluster","hello")
val dataSet = env.fromCollection(data)
val words = dataSet.flatMap(value => value.split("\\s+"))
val mappedWords = words.map(value => (value,1))
val grouped = mappedWords.groupBy(0)
val sum = grouped.sum(1)
println(sum.collect())
}
} |
¶ÔÓÚ Streaming£¬Spark °ÑËü¿´³É¸ü¿ìµÄÅú´¦Àí£¬¶ø Flink
°ÑÅú´¦Àí¿´³É Streaming µÄÌØÊâÀý×Ó£¬²îÒìÈçÏ£ºÆäÒ»£¬ÔÚʵʱ¼ÆËãÎÊÌâÉÏ£¬Flink ÌṩÁË»ùÓÚÿ¸öʼþµÄÁ÷ʽ´¦Àí»úÖÆ£¬ËùÒÔËü¿ÉÒÔ±»ÈÏΪÊÇÒ»¸öÕæÕýÒâÒåÉϵÄÁ÷ʽ¼ÆË㣬ÀàËÆÓÚ
Storm µÄ¼ÆËãÄ£ÐÍ¡£¶ø¶ÔÓÚ Spark À´Ëµ£¬²»ÊÇ»ùÓÚʼþÁ£¶ÈµÄ£¬¶øÊÇÓÃСÅúÁ¿À´Ä£ÄâÁ÷ʽ£¬Ò²¾ÍÊǶà¸öʼþµÄ¼¯ºÏ¡£ËùÒÔ£¬Spark
±»ÈÏΪÊÇÒ»¸ö½Ó½üʵʱµÄ´¦Àíϵͳ¡£ËäÈ»£¬´ó²¿·ÖÓ¦ÓÃʵʱÊÇ¿ÉÒÔ½ÓÊܵ쬵«¶ÔÓںܶàÓ¦ÓÃÐèÒª»ùÓÚʼþ¼¶±ðµÄÁ÷ʽ¼ÆËã¡£Òò¶ø£¬»áÑ¡Ôñ
Storm ¶ø²»ÊÇ Spark Streaming£¬ÏÖÔÚ£¬Flink Ò²ÐíÊÇÒ»¸ö²»´íµÄÑ¡Ôñ¡£
2.2.5 SQL
Ŀǰ£¬Spark SQL ÊÇÆä×é¼þÖнÏΪ»îÔ¾µÄÒ»²¿·Ö£¬ËüÌṩÁËÀàËÆÓÚ
Hive SQL À´²éѯ½á¹¹»¯Êý¾Ý£¬API ÒÀÈ»ºÜ³ÉÊì¡£¶ÔÓÚ Flink À´Ëµ£¬½ØÖÁµ½Ä¿Ç° 1.0
°æ±¾£¬Ö»Ö§³Ö Flink Table API£¬¹Ù·½ÔÚ Flink 1.1 °æ±¾ÖлáÌí¼Ó SQL µÄ½Ó¿ÚÖ§³Ö¡££ÛFlink
1.1 SQL ÏêÇ鼯»®£Ý
3.Features
Flink °üº¬Ò»ÏÂÌØÐÔ£º
¸ßÍÌÍ & µÍÑÓʱ
Ö§³Ö Event Time & ÂÒÐòʼþ
״̬¼ÆËãµÄ Exactly-Once ÓïÒå
¸ß¶ÈÁé»îµÄÁ÷ʽ´°¿Ú
´ø·´Ñ¹µÄÁ¬ÐøÁ÷Ä£ÐÍ
ÈÝ´íÐÔ
Á÷´¦ÀíºÍÅú´¦Àí¹²ÓÃÒ»¸öÒýÇæ
ÄÚ´æ¹ÜÀí
µü´ú & ÔöÁ¿µü´ú
³ÌÐòµ÷ÓÅ
Á÷´¦ÀíÓ¦ÓÃ
Åú´¦ÀíÓ¦ÓÃ
Àà¿âÉú̬
¹ã·º¼¯³É
3.1 ¸ßÍÌÍ & µÍÑÓʱ
Flink µÄÁ÷´¦ÀíÒýÇæÖ»ÐèÒªºÜÉÙÅäÖþÍÄÜʵÏÖ¸ßÍÌÍÂÂʺ͵ÍÑÓ³Ù¡£ÏÂͼչʾÁËÒ»¸ö·Ö²¼Ê½¼ÆÊýµÄÈÎÎñµÄÐÔÄÜ£¬°üÀ¨ÁËÁ÷Êý¾Ý
shuffle ¹ý³Ì¡£

3.2 Ö§³Ö Event Time & ÂÒÐòʼþ
Flink Ö§³ÖÁËÁ÷´¦ÀíºÍ Event Time ÓïÒåµÄ´°¿Ú»úÖÆ¡£Event
time ʹµÃ¼ÆËãÂÒÐòµ½´ïµÄʼþ»ò¿ÉÄÜÑÓ³Ùµ½´ïµÄʼþ¸ü¼Ó¼òµ¥¡£ÈçÏÂͼËùʾ£º

3.3 ״̬¼ÆËãµÄ exactly-once ÓïÒå
Á÷³ÌÐò¿ÉÒÔÔÚ¼ÆËã¹ý³ÌÖÐά»¤×Ô¶¨Òå״̬¡£Flink µÄ checkpointing
»úÖÆ±£Ö¤Á˼´Ê±ÔÚ¹ÊÕÏ·¢ÉúÏÂÒ²Äܱ£ÕÏ״̬µÄ exactly once ÓïÒå¡£
3.4 ¸ß¶ÈÁé»îµÄÁ÷ʽ´°¿Ú
Flink Ö§³ÖÔÚʱ¼ä´°¿Ú£¬Í³¼Æ´°¿Ú£¬session ´°¿Ú£¬ÒÔ¼°Êý¾ÝÇý¶¯µÄ´°¿Ú£¬´°¿Ú¿ÉÒÔͨ¹ýÁé»îµÄ´¥·¢Ìõ¼þÀ´¶¨ÖÆ£¬ÒÔÖ§³Ö¸´ÔÓµÄÁ÷¼ÆËãģʽ¡£
3.5 ´ø·´Ñ¹µÄÁ¬ÐøÁ÷Ä£ÐÍ
Êý¾ÝÁ÷Ó¦ÓÃÖ´ÐеÄÊDz»¼ä¶ÏµÄ£¨³£×¤£©operators¡£Flink
streaming ÔÚÔËÐÐʱÓÐ×ÅÌìÈ»µÄÁ÷¿Ø£ºÂýµÄÊý¾Ý sink ½Úµã»á·´Ñ¹£¨backpressure£©¿ìµÄÊý¾ÝÔ´£¨sources£©¡£
3.6 ÈÝ´íÐÔ
Flink µÄÈÝ´í»úÖÆÊÇ»ùÓÚ Chandy-Lamport distributed
snapshots À´ÊµÏֵġ£ÕâÖÖ»úÖÆÊǷdz£ÇáÁ¿¼¶µÄ£¬ÔÊÐíϵͳӵÓиßÍÌÍÂÂʵÄͬʱ»¹ÄÜÌṩǿһÖÂÐԵı£ÕÏ¡£
3.7 Á÷´¦ÀíºÍÅú´¦Àí¹²ÓÃÒ»¸öÒýÇæ
Flink ΪÁ÷´¦ÀíºÍÅú´¦ÀíÓ¦Óù«ÓÃÒ»¸öͨÓõÄÒýÇæ¡£Åú´¦ÀíÓ¦ÓÿÉÒÔÒÔÒ»ÖÖÌØÊâµÄÁ÷´¦ÀíÓ¦ÓøßЧµØÔËÐС£ÈçÏÂͼËùʾ£º

3.8 ÄÚ´æ¹ÜÀí
Flink ÔÚ JVM ÖÐʵÏÖÁË×Ô¼ºµÄÄÚ´æ¹ÜÀí¡£Ó¦ÓÿÉÒÔ³¬³öÖ÷ÄÚ´æµÄ´óСÏÞÖÆ£¬²¢ÇÒ³ÐÊܸüÉÙµÄÀ¬»øÊÕ¼¯µÄ¿ªÏú¡£
3.9 µü´úºÍÔöÁ¿µü´ú
Flink ¾ßÓеü´ú¼ÆËãµÄרÃÅÖ§³Ö£¨±ÈÈçÔÚ»úÆ÷ѧϰºÍͼ¼ÆËãÖУ©¡£ÔöÁ¿µü´ú¿ÉÒÔÀûÓÃÒÀÀµ¼ÆËãÀ´¸ü¿ìµØÊÕÁ²¡£ÈçÏÂͼËùʾ£º

3.10 ³ÌÐòµ÷ÓÅ
Åú´¦Àí³ÌÐò»á×Ô¶¯µØÓÅ»¯Ò»Ð©³¡¾°£¬±ÈÈç±ÜÃâһЩ°º¹óµÄ²Ù×÷£¨Èç shuffles
ºÍ sorts£©£¬»¹Óлº´æÒ»Ð©ÖмäÊý¾Ý¡£
3.11 Á÷´¦ÀíÓ¦ÓÃ
DataStream API Ö§³ÖÁËÊý¾ÝÁ÷Éϵĺ¯Êýʽת»»£¬¿ÉÒÔʹÓÃ×Ô¶¨ÒåµÄ״̬ºÍÁé»îµÄ´°¿Ú¡£ÏÂÃæÊ¾ÀýչʾÁËÈçºÎÒÔ»¬¶¯´°¿ÚµÄ·½Ê½Í³¼ÆÎı¾Êý¾ÝÁ÷Öе¥´Ê³öÏֵĴÎÊý¡£
case class Word(word:
String, freq: Long)
val texts: DataStream[String] = ...
val counts = text
.flatMap { line => line.split("\\W+")
}
.map { token => Word(token, 1) }
.keyBy("word")
.timeWindow(Time.seconds(5), Time.seconds(1))
.sum("freq") |
3.12 Åú´¦ÀíÓ¦ÓÃ
Flink µÄ DataSet API ¿ÉÒÔʹÄãÓà Java »ò
Scala д³öƯÁÁµÄ¡¢ÀàÐͰ²È«µÄ¡¢¿Éά»¤µÄ´úÂë¡£ËüÖ§³Ö¹ã·ºµÄÊý¾ÝÀàÐÍ£¬²»½ö½öÊÇ key/value
¶Ô£¬ÒÔ¼°·á¸»µÄ operators¡£ÏÂÃæÊ¾ÀýչʾÁËͼ¼ÆËãÖÐ PageRank Ëã·¨µÄÒ»¸öºËÐÄÑ»·¡£
case class Page(pageId:
Long, rank: Double)
case class Adjacency(id: Long, neighbors: Array[Long])
val result = initialRanks.iterate(30) { pages
=>
pages.join(adjacency).where("pageId").equalTo("pageId")
{
(page, adj, out : Collector[Page]) => {
out.collect(Page(page.id, 0.15 / numPages))
for (n <- adj.neighbors) {
out.collect(Page(n, 0.85*page.rank/adj.neighbors.length))
}
}
}
.groupBy("pageId").sum("rank")
} |
3.13 Àà¿âÉú̬
Flink Õ»ÖÐÌṩÁ˺ܶà¸ß¼¶ API ºÍÂú×㲻ͬ³¡¾°µÄÀà¿â£º»úÆ÷ѧϰ¡¢Í¼·ÖÎö¡¢¹ØÏµÊ½Êý¾Ý´¦Àí¡£µ±Ç°Àà¿â»¹ÔÚ
beta ״̬£¬²¢ÇÒÔÚ´óÁ¦·¢Õ¹¡£
3.14 ¹ã·º¼¯³É
Flink Ó뿪Դ´óÊý¾Ý´¦ÀíÉú̬ϵͳÖеÄÐí¶àÏîÄ¿¶¼Óм¯³É¡£Flink
¿ÉÒÔÔËÐÐÔÚ YARN ÉÏ£¬Óë HDFS Ðͬ¹¤×÷£¬´Ó Kafka ÖжÁÈ¡Á÷Êý¾Ý£¬¿ÉÒÔÖ´ÐÐ Hadoop
³ÌÐò´úÂ룬¿ÉÒÔÁ¬½Ó¶àÖÖÊý¾Ý´æ´¢ÏµÍ³¡£ÈçÏÂͼËùʾ£º

4.×ܽá
ÒÔÉÏ£¬±ãÊÇ¶Ô Flink ×öÒ»¸ö¼òÒªµÄÆÊÎöÈÏʶ£¬ÖÁÓÚÈçºÎʹÓà Flink£¬ÒÔ¼°Æä±àÒ룬°²×°£¬²¿Êð£¬ÔËÐеÈÁ÷³Ì£¬½ÏΪ¼òµ¥£¬ÕâÀï¾Í²»¶à×ö׸ÊöÁË£¬´ó¼Ò¿ÉÒÔÔÚ
Flink µÄ¹ÙÍø£¬ÔĶÁÆä QuickStart ¼´¿É£¬£Û·ÃÎʵØÖ·£Ý¡£
5.½áÊøÓï
ÕâÆª²©¿Í¾ÍºÍ´ó¼Ò·ÖÏíµ½ÕâÀÈç¹û´ó¼ÒÔÚÑо¿Ñ§Ï°µÄ¹ý³Ìµ±ÖÐÓÐʲôÎÊÌ⣬¿ÉÒÔ¼ÓȺ½øÐÐÌÖÂÛ»ò·¢ËÍÓʼþ¸øÎÒ£¬ÎһᾡÎÒËùÄÜΪÄú½â´ð£¬Óë¾ý¹²Ã㣡
|