{"id":153447,"date":"2020-09-10T20:10:08","date_gmt":"2020-09-10T12:10:08","guid":{"rendered":"http:\/\/4563.org\/?p=153447"},"modified":"2020-09-10T20:10:08","modified_gmt":"2020-09-10T12:10:08","slug":"%e6%b5%85%e8%b0%88flink-state%e7%8a%b6%e6%80%81%e7%ae%a1%e7%90%86%e6%9c%ba%e5%88%b6","status":"publish","type":"post","link":"http:\/\/4563.org\/?p=153447","title":{"rendered":"\u6d45\u8c08flink state\u72b6\u6001\u7ba1\u7406\u673a\u5236"},"content":{"rendered":"<h2><a href=\"https:\/\/www.studytime.xin\/article\/#state-\u7b80\u8ff0\" title=\"state \u7b80\u8ff0\"><\/a>state \u7b80\u8ff0<\/h2>\n<p><strong>Apache Flink\u00ae \u2014 Stateful Computations over Data Streams<\/strong>,flink\u662f\u4e00\u4e2a\u9ed8\u8ba4\u5c31\u6709\u72b6\u6001\u7684\u5206\u5206\u6790\u5f15\u64ce\uff0c\u9488\u5bf9\u6d41\u5931\u8ba1\u7b97\u5f15\u64ce\u4e2d\u7684\u6570\u636e\u5f80\u5f80\u662f\u8f6c\u77ac\u5373\u901d\uff0c\u4f46\u5728flink\u771f\u5b9e\u4e1a\u52a1\u573a\u666f\u786e\u4e0d\u80fd\u8fd9\u6837\uff0c\u4ec0\u4e48\u90fd\u4e0d\u80fd\u7559\u4e0b\uff0c\u80af\u5b9a\u662f\u9700\u8981\u6709\u6570\u636e\u7559\u4e0b\u7684\uff0c\u9488\u5bf9\u8fd9\u4e9b\u6570\u636e\u7559\u4e0b\u6765\u5b58\u50a8\u4e0b\u6765\uff0c\u5728flink\u4e2d\u53eb\u505astate\uff0c\u4e2d\u6587\u53ef\u4ee5\u7ffb\u8bd1\u6210\u72b6\u6001\u3002<\/p>\n<h2><a href=\"https:\/\/www.studytime.xin\/article\/#state-\u7c7b\u578b\" title=\"state \u7c7b\u578b\"><\/a>state \u7c7b\u578b<\/h2>\n<p>Flink\u4e2d\u6709\u4e24\u79cd\u57fa\u672c\u7c7b\u578b\u7684State, \u5206\u522b\u4e3a Keyed State(\u952e\u63a7\u72b6\u6001) \u548c Operator State(\u7b97\u5b50\u72b6\u6001)\u3002<\/p>\n<h2><a href=\"https:\/\/www.studytime.xin\/article\/#keyed-State-\u952e\u63a7\u72b6\u6001\" title=\"keyed State(\u952e\u63a7\u72b6\u6001)\"><\/a>keyed State(\u952e\u63a7\u72b6\u6001)<\/h2>\n<p>Keyed State\uff1a\u987e\u540d\u601d\u4e49\u5c31\u662f\u57fa\u4e8e KeyedStream \u4e0a\u7684\u72b6\u6001\uff0c\u8fd9\u4e2a\u72b6\u6001\u662f\u8ddf\u7279\u5b9a\u7684Key\u7ed1\u5b9a\u7684\u3002KeyedStrean \u6d41\u4e0a\u7684\u6bcf\u4e00\u4e2aKey\uff0c\u90fd\u5bf9\u5e94\u4e00\u4e2a State\u3002Flink\u9488\u5bf9Keyed State\u63d0\u4f9b\u4e86\u4ee5\u4e0b\u516d\u79cd\u7c7b\u53ef\u4ee5\u4fdd\u5b58 State \u7684\u6570\u636e\u7ed3\u6784\u7c7b\u578b\u3002<\/p>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#keyed-state\u6258\u7ba1\u72b6\u6001\u6709\u516d\u79cd\u7c7b\u578b\" title=\"keyed state\u6258\u7ba1\u72b6\u6001\u6709\u516d\u79cd\u7c7b\u578b\"><\/a>keyed state\u6258\u7ba1\u72b6\u6001\u6709\u516d\u79cd\u7c7b\u578b<\/h3>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#ValueState\" title=\"ValueState\"><\/a>ValueState<t><\/h4>\n<p>\u4fdd\u5b58\u4e00\u4e2a\u53ef\u4ee5\u66f4\u65b0\u548c\u68c0\u7d22\u7684\u503c\uff08\u5982\u4e0a\u6240\u8ff0\uff0c\u6bcf\u4e2a\u503c\u90fd\u5bf9\u5e94\u5230\u5f53\u524d\u7684\u8f93\u5165\u6570\u636e\u7684 Key\uff0c\u56e0\u6b64\u7b97\u5b50\u63a5\u6536\u5230\u7684\u6bcf\u4e2aKey\u90fd\u53ef\u80fd\u5bf9\u5e94\u4e00\u4e2a\u503c\uff09\u3002\u8fd9\u4e2a\u503c\u53ef\u4ee5\u901a\u8fc7 update(T)\u8fdb\u884c\u66f4\u65b0\uff0c\u901a\u8fc7 T value() \u8fdb\u884c\u68c0\u7d22\u3002<\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#ListState\" title=\"ListState\"><\/a>ListState<t><\/h4>\n<p>\u4fdd\u5b58\u4e00\u4e2a\u5143\u7d20\u7684\u5217\u8868\u3002\u53ef\u4ee5\u5f80\u8fd9\u4e2a\u5217\u8868\u4e2d\u8ffd\u52a0\u6570\u636e\uff0c\u5e76\u5728\u5f53\u524d\u7684\u5217\u8868\u4e0a\u8fdb\u884c\u68c0\u7d22\u3002\u53ef\u4ee5\u901a\u8fc7 add(T) \u6216\u8005 addAll(List<t>) \u8fdb\u884c\u6dfb\u52a0\u5143\u7d20\uff0c\u901a\u8fc7 Iterable<t> get() \u83b7\u53d6\u6574\u4e2a\u5217\u8868\u3002\u8fd8\u53ef\u4ee5\u901a\u8fc7 update(List<t>) \u8986\u76d6\u5f53\u524d\u7684\u5217\u8868\u3002<\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#MapState-lt-UK-UV-gt\" title=\"MapState&lt;UK,UV&gt;\"><\/a>MapState&lt;UK,UV&gt;<\/h4>\n<p>\u7ef4\u62a4\u4e86\u4e00\u4e2a\u6dfb\u52a0\u6620\u5c04\u5217\u8868\u3002\u4f60\u53ef\u4ee5\u6dfb\u52a0\u952e\u503c\u5bf9\u5230\u72b6\u6001\u4e2d\uff0c\u4e5f\u53ef\u4ee5\u83b7\u5f97\u53cd\u6620\u5f53\u524d\u6240\u6709\u6620\u5c04\u7684\u8fed\u4ee3\u5668\u3002\u4f7f\u7528 put(UK,UV) \u6216\u8005 putAll(Map&lt;UK,UV&gt;) \u5206\u522b\u68c0\u7d22\u6620\u5c04\u3001\u952e\u548c\u503c\u7684\u53ef\u8fed\u4ee3\u89c6\u56fe\u3002<\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#ReducingState\" title=\"ReducingState\"><\/a>ReducingState<t><\/h4>\n<p>\u4fdd\u5b58\u4e00\u4e2a\u5355\u503c\uff0c\u8868\u793a\u6dfb\u52a0\u5230\u72b6\u6001\u7684\u6240\u6709\u805a\u5408\u3002\u63a5\u53e3\u4e0e ListState \u7c7b\u4f3c\uff0c\u4f7f\u7528 add(T)\u589e\u52a0\u5143\u7d20\uff0c\u4f1a\u4f7f\u7528\u63d0\u4f9b\u7684 ReduceFunction \u8fdb\u884c\u805a\u5408<\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#AggregatingState-lt-IN-OUT-gt\" title=\"AggregatingState&lt;IN.OUT&gt;\"><\/a>AggregatingState&lt;IN.OUT&gt;<\/h4>\n<p>\u4fdd\u7559\u4e00\u4e2a\u5355\u503c\uff0c\u8868\u793a\u6dfb\u52a0\u5230\u72b6\u6001\u7684\u6240\u4ee5\u503c\u7684\u805a\u5408\u3002\u548cReducingState \u76f8\u53cd\u7684\u989d\u662f\u805a\u5408\u7c7b\u578b\u53ef\u80fd\u4e0e\u6dfb\u52a0\u5230\u72b6\u6001\u7684\u5143\u7d20\u7684\u7c7b\u578b\u4e0d\u540c\u3002\u63a5\u53e3\u4e0e ListState \u7c7b\u4f3c\uff0c\u4f46\u4f7f\u7528 add(IN) \u6dfb\u52a0\u7684\u5143\u7d20\u4f1a\u7528\u6307\u5b9a\u7684 AggregateFunction \u8fdb\u884c\u805a\u5408\u3002<\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#FoldingState-lt-T-ACC-gt\" title=\"FoldingState&lt;T,ACC&gt;\"><\/a>FoldingState&lt;T,ACC&gt;<\/h4>\n<p>\u4fdd\u7559\u4e00\u4e2a\u5355\u503c\uff0c\u8868\u793a\u6dfb\u52a0\u5230\u72b6\u6001\u7684\u6240\u6709\u503c\u7684\u805a\u5408\u3002\u4e0e ReducingState \u76f8\u53cd\uff0c\u805a\u5408\u7c7b\u578b\u53ef\u80fd\u4e0e\u6dfb\u52a0\u5230\u72b6\u6001\u7684\u5143\u7d20\u7c7b\u578b\u4e0d\u540c\u3002\u63a5\u53e3\u4e0eListState\u7c7b\u578b\uff0c\u4f46\u4f7f\u7528 add(T) \u6dfb\u52a0\u7684\u5143\u7d20\u4f1a\u7528\u6307\u5b9a\u7684FoldFunction \u6298\u53e0\u6210\u805a\u5408\u503c\u3002<\/p>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#Keyed-State\u6848\u4f8b\u6f14\u793a\" title=\"Keyed State\u6848\u4f8b\u6f14\u793a\"><\/a>Keyed State\u6848\u4f8b\u6f14\u793a<\/h3>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#ValueState-\u4f7f\u7528valueState\u5b9e\u73b0\u5e73\u5747\u503c\u6c42\u53d6\" title=\"ValueState \u4f7f\u7528valueState\u5b9e\u73b0\u5e73\u5747\u503c\u6c42\u53d6\"><\/a>ValueState \u4f7f\u7528valueState\u5b9e\u73b0\u5e73\u5747\u503c\u6c42\u53d6<\/h3>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><span>2<\/span><br><span>3<\/span><br><span>4<\/span><br><span>5<\/span><br><span>6<\/span><br><span>7<\/span><br><span>8<\/span><br><span>9<\/span><br><span>10<\/span><br><span>11<\/span><br><span>12<\/span><br><span>13<\/span><br><span>14<\/span><br><span>15<\/span><br><span>16<\/span><br><span>17<\/span><br><span>18<\/span><br><span>19<\/span><br><span>20<\/span><br><span>21<\/span><br><span>22<\/span><br><span>23<\/span><br><span>24<\/span><br><span>25<\/span><br><span>26<\/span><br><span>27<\/span><br><span>28<\/span><br><span>29<\/span><br><span>30<\/span><br><span>31<\/span><br><span>32<\/span><br><span>33<\/span><br><span>34<\/span><br><span>35<\/span><br><span>36<\/span><br><span>37<\/span><br><span>38<\/span><br><span>39<\/span><br><span>40<\/span><br><span>41<\/span><br><span>42<\/span><br><span>43<\/span><br><span>44<\/span><br><span>45<\/span><br><span>46<\/span><br><span>47<\/span><br><span>48<\/span><br><span>49<\/span><br><span>50<\/span><br><span>51<\/span><br><span>52<\/span><br><span>53<\/span><br><span>54<\/span><br><span>55<\/span><br><span>56<\/span><br><span>57<\/span><br><span>58<\/span><br><span>59<\/span><br><span>60<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span><span>package<\/span> xin.studytime.scala<\/span><br><span><\/span><br><span><span>import<\/span> org.apache.flink.api.common.functions.<span>RichFlatMapFunction<\/span><\/span><br><span><span>import<\/span> org.apache.flink.api.common.state.&#123;<span>ValueState<\/span>, <span>ValueStateDescriptor<\/span>&#125;<\/span><br><span><span>import<\/span> org.apache.flink.configuration.<span>Configuration<\/span><\/span><br><span><span>import<\/span> org.apache.flink.streaming.api.scala.<span>StreamExecutionEnvironment<\/span><\/span><br><span><span>import<\/span> org.apache.flink.util.<span>Collector<\/span><\/span><br><span><\/span><br><span><span><span>object<\/span> <span>ValueStateOperate<\/span> <\/span>&#123;<\/span><br><span>  <span><span>def<\/span> <span>main<\/span><\/span>(args: <span>Array<\/span>[<span>String<\/span>]): <span>Unit<\/span> = &#123;<\/span><br><span>    <span>val<\/span> env = <span>StreamExecutionEnvironment<\/span>.getExecutionEnvironment<\/span><br><span>    <span>import<\/span> org.apache.flink.api.scala._<\/span><br><span><\/span><br><span>    env.fromCollection(<span>List<\/span>(<\/span><br><span>      (<span>1<\/span>L, <span>3<\/span>d),<\/span><br><span>      (<span>1<\/span>L, <span>5<\/span>d),<\/span><br><span>      (<span>1<\/span>L, <span>7<\/span>d),<\/span><br><span>      (<span>1<\/span>L, <span>4<\/span>d),<\/span><br><span>      (<span>1<\/span>L, <span>2<\/span>d)<\/span><br><span>    ))<\/span><br><span>      .keyBy(_._1)<\/span><br><span>      .flatMap(<span>new<\/span> <span>CountAverageWithValue<\/span>())<\/span><br><span>      .print()<\/span><br><span>    env.execute()<\/span><br><span>  &#125;<\/span><br><span>&#125;<\/span><br><span><\/span><br><span><span><span>class<\/span> <span>CountAverageWithValue<\/span> <span>extends<\/span> <span>RichFlatMapFunction<\/span>[(<span>Long<\/span>, <span>Double<\/span>), (<span>Long<\/span>, <span>Double<\/span>)] <\/span>&#123;<\/span><br><span>  <span>\/\/\u5b9a\u4e49ValueState\u7c7b\u578b\u7684\u53d8\u91cf<\/span><\/span><br><span><\/span><br><span>  <span>private<\/span> <span>var<\/span> sum: <span>ValueState<\/span>[(<span>Long<\/span>,<span>Double<\/span>)] = _<\/span><br><span>  <span>override<\/span> <span><span>def<\/span> <span>open<\/span><\/span>(parameters: <span>Configuration<\/span>): <span>Unit<\/span> = &#123;<\/span><br><span>    <span>\/\/\u521d\u59cb\u5316\u83b7\u53d6\u5386\u53f2\u72b6\u6001\u7684\u503c<\/span><\/span><br><span>    <span>val<\/span> average = <span>new<\/span> <span>ValueStateDescriptor<\/span>[(<span>Long<\/span>, <span>Double<\/span>)](<span>\"average\"<\/span>, classOf[(<span>Long<\/span>, <span>Double<\/span>)])<\/span><br><span>    sum = getRuntimeContext.getState(average)<\/span><br><span>  &#125;<\/span><br><span><\/span><br><span>  <span>override<\/span> <span><span>def<\/span> <span>flatMap<\/span><\/span>(input: (<span>Long<\/span>, <span>Double<\/span>), out: <span>Collector<\/span>[(<span>Long<\/span>, <span>Double<\/span>)]): <span>Unit<\/span> = &#123;<\/span><br><span>    <span>\/\/ access the state value<\/span><\/span><br><span>    <span>val<\/span> tmpCurrentSum = sum.value<\/span><br><span>    <span>\/\/ If it hasn't been used before, it will be null<\/span><\/span><br><span>    <span>val<\/span> currentSum = <span>if<\/span> (tmpCurrentSum != <span>null<\/span>) &#123;<\/span><br><span>      tmpCurrentSum<\/span><br><span>    &#125; <span>else<\/span> &#123;<\/span><br><span>      (<span>0<\/span>L, <span>0<\/span>d)<\/span><br><span>    &#125;<\/span><br><span>    <span>\/\/ update the count<\/span><\/span><br><span>    <span>val<\/span> newSum = (currentSum._1 + <span>1<\/span>, currentSum._2 + input._2)<\/span><br><span><\/span><br><span>    <span>\/\/ update the state<\/span><\/span><br><span>    sum.update(newSum)<\/span><br><span><\/span><br><span>    <span>\/\/ if the count reaches 2, emit the average and clear the state<\/span><\/span><br><span>    <span>if<\/span> (newSum._1 &gt;= <span>2<\/span>) &#123;<\/span><br><span>      out.collect((input._1, newSum._2 \/ newSum._1))<\/span><br><span>      <span>\/\/\u5c06\u72b6\u6001\u6e05\u9664<\/span><\/span><br><span>      <span>\/\/sum.clear()<\/span><\/span><br><span>    &#125;<\/span><br><span>  &#125;<\/span><br><span>&#125;<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#ListState-\u6c42\u53d6\u6570\u636e\u5e73\u5747\u503c\" title=\"ListState \u6c42\u53d6\u6570\u636e\u5e73\u5747\u503c\"><\/a>ListState \u6c42\u53d6\u6570\u636e\u5e73\u5747\u503c<\/h3>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><span>2<\/span><br><span>3<\/span><br><span>4<\/span><br><span>5<\/span><br><span>6<\/span><br><span>7<\/span><br><span>8<\/span><br><span>9<\/span><br><span>10<\/span><br><span>11<\/span><br><span>12<\/span><br><span>13<\/span><br><span>14<\/span><br><span>15<\/span><br><span>16<\/span><br><span>17<\/span><br><span>18<\/span><br><span>19<\/span><br><span>20<\/span><br><span>21<\/span><br><span>22<\/span><br><span>23<\/span><br><span>24<\/span><br><span>25<\/span><br><span>26<\/span><br><span>27<\/span><br><span>28<\/span><br><span>29<\/span><br><span>30<\/span><br><span>31<\/span><br><span>32<\/span><br><span>33<\/span><br><span>34<\/span><br><span>35<\/span><br><span>36<\/span><br><span>37<\/span><br><span>38<\/span><br><span>39<\/span><br><span>40<\/span><br><span>41<\/span><br><span>42<\/span><br><span>43<\/span><br><span>44<\/span><br><span>45<\/span><br><span>46<\/span><br><span>47<\/span><br><span>48<\/span><br><span>49<\/span><br><span>50<\/span><br><span>51<\/span><br><span>52<\/span><br><span>53<\/span><br><span>54<\/span><br><span>55<\/span><br><span>56<\/span><br><span>57<\/span><br><span>58<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span><span>package<\/span> xin.studytime.scala<\/span><br><span><\/span><br><span><span>import<\/span> java.lang<\/span><br><span><span>import<\/span> java.util.<span>Collections<\/span><\/span><br><span><\/span><br><span><span>import<\/span> org.apache.flink.api.common.functions.<span>RichFlatMapFunction<\/span><\/span><br><span><span>import<\/span> org.apache.flink.api.common.state.&#123;<span>ListState<\/span>, <span>ListStateDescriptor<\/span>&#125;<\/span><br><span><span>import<\/span> org.apache.flink.configuration.<span>Configuration<\/span><\/span><br><span><span>import<\/span> org.apache.flink.streaming.api.scala.<span>StreamExecutionEnvironment<\/span><\/span><br><span><span>import<\/span> org.apache.flink.util.<span>Collector<\/span><\/span><br><span><span>import<\/span> scala.collection.<span>JavaConverters<\/span>._<\/span><br><span><\/span><br><span><span><span>object<\/span> <span>ListStateOperate<\/span> <\/span>&#123;<\/span><br><span>  <span><span>def<\/span> <span>main<\/span><\/span>(args: <span>Array<\/span>[<span>String<\/span>]): <span>Unit<\/span> = &#123;<\/span><br><span>    <span>val<\/span> env = <span>StreamExecutionEnvironment<\/span>.getExecutionEnvironment<\/span><br><span>    <span>import<\/span> org.apache.flink.api.scala._<\/span><br><span>    env.fromCollection(<span>List<\/span>(<\/span><br><span>      (<span>1<\/span>L, <span>3<\/span>d),<\/span><br><span>      (<span>1<\/span>L, <span>5<\/span>d),<\/span><br><span>      (<span>1<\/span>L, <span>7<\/span>d),<\/span><br><span>      (<span>2<\/span>L, <span>4<\/span>d),<\/span><br><span>      (<span>2<\/span>L, <span>2<\/span>d),<\/span><br><span>      (<span>2<\/span>L, <span>6<\/span>d)<\/span><br><span>    )).keyBy(_._1)<\/span><br><span>      .flatMap(<span>new<\/span> <span>CountAverageWithList<\/span>)<\/span><br><span>      .print()<\/span><br><span>    env.execute()<\/span><br><span>  &#125;<\/span><br><span>&#125;<\/span><br><span><\/span><br><span><span><span>class<\/span> <span>CountAverageWithList<\/span> <span>extends<\/span> <span>RichFlatMapFunction<\/span>[(<span>Long<\/span>, <span>Double<\/span>), (<span>Long<\/span>, <span>Double<\/span>)] <\/span>&#123;<\/span><br><span>  <span>private<\/span> <span>var<\/span> elementsByKey: <span>ListState<\/span>[(<span>Long<\/span>, <span>Double<\/span>)] = _<\/span><br><span><\/span><br><span>  <span>override<\/span> <span><span>def<\/span> <span>open<\/span><\/span>(parameters: <span>Configuration<\/span>): <span>Unit<\/span> = &#123;<\/span><br><span>    <span>val<\/span> listState = <span>new<\/span> <span>ListStateDescriptor<\/span>[(<span>Long<\/span>, <span>Double<\/span>)](<span>\"listState\"<\/span>, classOf[(<span>Long<\/span>, <span>Double<\/span>)])<\/span><br><span>    elementsByKey = getRuntimeContext.getListState(listState)<\/span><br><span>  &#125;<\/span><br><span><\/span><br><span>  <span>override<\/span> <span><span>def<\/span> <span>flatMap<\/span><\/span>(in: (<span>Long<\/span>, <span>Double<\/span>), collector: <span>Collector<\/span>[(<span>Long<\/span>, <span>Double<\/span>)]): <span>Unit<\/span> = &#123;<\/span><br><span>    <span>val<\/span> currentState: lang.<span>Iterable<\/span>[(<span>Long<\/span>, <span>Double<\/span>)] = elementsByKey.get()<\/span><br><span><\/span><br><span>    <span>if<\/span> (currentState == <span>null<\/span>) &#123;<\/span><br><span>      elementsByKey.addAll(<span>Collections<\/span>.emptyList())<\/span><br><span>    &#125;<\/span><br><span>    elementsByKey.add(in)<\/span><br><span>    <span>val<\/span> allElements: <span>Iterator<\/span>[(<span>Long<\/span>, <span>Double<\/span>)] = elementsByKey.get().iterator().asScala<\/span><br><span>    <span>val<\/span> allElementList: <span>List<\/span>[(<span>Long<\/span>, <span>Double<\/span>)] = allElements.toList<\/span><br><span>    <span>if<\/span> (allElementList.size &gt; <span>3<\/span>) &#123;<\/span><br><span>      <span>var<\/span> count = <span>0<\/span>L<\/span><br><span>      <span>var<\/span> sum = <span>0<\/span>d<\/span><br><span>      <span>for<\/span> (eachElement &lt;- allElementList) &#123;<\/span><br><span>        count += <span>1<\/span><\/span><br><span>        sum += eachElement._2<\/span><br><span>      &#125;<\/span><br><span>      collector.collect(in._1, sum \/ count)<\/span><br><span>    &#125;<\/span><br><span>  &#125;<\/span><br><span>&#125;<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#MapState-\u6c42\u53d6\u6570\u636e\u5e73\u5747\u503c\" title=\"MapState \u6c42\u53d6\u6570\u636e\u5e73\u5747\u503c\"><\/a>MapState \u6c42\u53d6\u6570\u636e\u5e73\u5747\u503c<\/h3>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><span>2<\/span><br><span>3<\/span><br><span>4<\/span><br><span>5<\/span><br><span>6<\/span><br><span>7<\/span><br><span>8<\/span><br><span>9<\/span><br><span>10<\/span><br><span>11<\/span><br><span>12<\/span><br><span>13<\/span><br><span>14<\/span><br><span>15<\/span><br><span>16<\/span><br><span>17<\/span><br><span>18<\/span><br><span>19<\/span><br><span>20<\/span><br><span>21<\/span><br><span>22<\/span><br><span>23<\/span><br><span>24<\/span><br><span>25<\/span><br><span>26<\/span><br><span>27<\/span><br><span>28<\/span><br><span>29<\/span><br><span>30<\/span><br><span>31<\/span><br><span>32<\/span><br><span>33<\/span><br><span>34<\/span><br><span>35<\/span><br><span>36<\/span><br><span>37<\/span><br><span>38<\/span><br><span>39<\/span><br><span>40<\/span><br><span>41<\/span><br><span>42<\/span><br><span>43<\/span><br><span>44<\/span><br><span>45<\/span><br><span>46<\/span><br><span>47<\/span><br><span>48<\/span><br><span>49<\/span><br><span>50<\/span><br><span>51<\/span><br><span>52<\/span><br><span>53<\/span><br><span>54<\/span><br><span>55<\/span><br><span>56<\/span><br><span>57<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span><span>package<\/span> xin.studytime.scala<\/span><br><span><\/span><br><span><span>import<\/span> java.util.<span>UUID<\/span><\/span><br><span><\/span><br><span><span>import<\/span> org.apache.flink.api.common.functions.<span>RichFlatMapFunction<\/span><\/span><br><span><span>import<\/span> org.apache.flink.configuration.<span>Configuration<\/span><\/span><br><span><span>import<\/span> org.apache.flink.streaming.api.scala.<span>StreamExecutionEnvironment<\/span><\/span><br><span><span>import<\/span> org.apache.flink.util.<span>Collector<\/span><\/span><br><span><span>import<\/span> org.apache.flink.api.common.state.&#123;<span>MapState<\/span>, <span>MapStateDescriptor<\/span>&#125;<\/span><br><span><\/span><br><span><span><span>object<\/span> <span>MapStateOperate<\/span> <\/span>&#123;<\/span><br><span>  <span><span>def<\/span> <span>main<\/span><\/span>(args: <span>Array<\/span>[<span>String<\/span>]): <span>Unit<\/span> = &#123;<\/span><br><span>    <span>val<\/span> environment = <span>StreamExecutionEnvironment<\/span>.getExecutionEnvironment<\/span><br><span>    <span>import<\/span> org.apache.flink.api.scala._<\/span><br><span><\/span><br><span>    environment.fromCollection(<span>List<\/span>(<\/span><br><span>      (<span>1<\/span>L, <span>3<\/span>d),<\/span><br><span>      (<span>1<\/span>L, <span>5<\/span>d),<\/span><br><span>      (<span>1<\/span>L, <span>7<\/span>d),<\/span><br><span>      (<span>2<\/span>L, <span>4<\/span>d),<\/span><br><span>      (<span>2<\/span>L, <span>2<\/span>d),<\/span><br><span>      (<span>2<\/span>L, <span>6<\/span>d)<\/span><br><span>    )).keyBy(_._1).flatMap(<span>new<\/span> <span>CountAverageMapState<\/span>).print()<\/span><br><span><\/span><br><span>    environment.execute()<\/span><br><span>  &#125;<\/span><br><span>&#125;<\/span><br><span><\/span><br><span><span><span>class<\/span> <span>CountAverageMapState<\/span> <span>extends<\/span> <span>RichFlatMapFunction<\/span>[(<span>Long<\/span>, <span>Double<\/span>), (<span>Long<\/span>, <span>Double<\/span>)] <\/span>&#123;<\/span><br><span><\/span><br><span>  <span>private<\/span> <span>var<\/span> mapState: <span>MapState<\/span>[<span>String<\/span>, <span>Double<\/span>] = _<\/span><br><span><\/span><br><span>  <span>override<\/span> <span><span>def<\/span> <span>open<\/span><\/span>(parameters: <span>Configuration<\/span>): <span>Unit<\/span> = &#123;<\/span><br><span>    <span>val<\/span> mapStateOperate = <span>new<\/span> <span>MapStateDescriptor<\/span>[<span>String<\/span>, <span>Double<\/span>](<span>\"mapStateOperate\"<\/span>, classOf[<span>String<\/span>], classOf[<span>Double<\/span>])<\/span><br><span>    mapState = getRuntimeContext.getMapState(mapStateOperate)<\/span><br><span>  &#125;<\/span><br><span><\/span><br><span>  <span>override<\/span> <span><span>def<\/span> <span>flatMap<\/span><\/span>(in: (<span>Long<\/span>, <span>Double<\/span>), out: <span>Collector<\/span>[(<span>Long<\/span>, <span>Double<\/span>)]): <span>Unit<\/span> = &#123;<\/span><br><span><\/span><br><span>    <span>\/\/\u5c06\u76f8\u540c\u7684key\u5bf9\u5e94\u7684\u6570\u636e\u653e\u5230\u4e00\u4e2amap\u96c6\u5408\u5f53\u4e2d\u53bb\uff0c\u5c31\u662f\u8fd9\u79cd\u5bf9\u5e94  key -&gt; Map((key1, value1),(key2, value2))<\/span><\/span><br><span>    <span>\/\/\u6bcf\u6b21\u90fd\u6784\u5efa\u4e00\u4e2amap\u96c6\u5408<\/span><\/span><br><span>    mapState.put(<span>UUID<\/span>.randomUUID().toString, in._2)<\/span><br><span>    <span>import<\/span> scala.collection.<span>JavaConverters<\/span>._<\/span><br><span><\/span><br><span>    <span>\/\/\u83b7\u53d6map\u96c6\u5408\u5f53\u4e2d\u6240\u6709\u7684value\uff0c\u6211\u4eec\u6bcf\u6b21\u5c06\u6570\u636e\u7684value\u7ed9\u653e\u5230map\u7684value\u91cc\u9762\u53bb<\/span><\/span><br><span>    <span>val<\/span> listState: <span>List<\/span>[<span>Double<\/span>] = mapState.values().iterator().asScala.toList<\/span><br><span>    <span>if<\/span> (listState.size &gt;= <span>3<\/span>) &#123;<\/span><br><span>      <span>var<\/span> count = <span>0<\/span>L<\/span><br><span>      <span>var<\/span> sum = <span>0<\/span>d<\/span><br><span>      <span>for<\/span> (eachState &lt;- listState) &#123;<\/span><br><span>        count += <span>1<\/span><\/span><br><span>        sum += eachState<\/span><br><span>      &#125;<\/span><br><span>      out.collect(in._1, sum \/ count)<\/span><br><span>    &#125;<\/span><br><span>  &#125;<\/span><br><span>&#125;<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#ReducingState\u3001AggregatingState\u7b49\u8003\u8651\u5b9e\u9645\u573a\u666f\u4f7f\u7528\u4e0d\u591a\uff0c\u5c31\u4e0d\u5728\u6b64\u5217\u4e3e\u3002\" title=\"ReducingState\u3001AggregatingState\u7b49\u8003\u8651\u5b9e\u9645\u573a\u666f\u4f7f\u7528\u4e0d\u591a\uff0c\u5c31\u4e0d\u5728\u6b64\u5217\u4e3e\u3002\"><\/a>ReducingState\u3001AggregatingState\u7b49\u8003\u8651\u5b9e\u9645\u573a\u666f\u4f7f\u7528\u4e0d\u591a\uff0c\u5c31\u4e0d\u5728\u6b64\u5217\u4e3e\u3002<\/h3>\n<h2><a href=\"https:\/\/www.studytime.xin\/article\/#Operator-State-\u7b97\u5b50\u72b6\u6001\" title=\"Operator State(\u7b97\u5b50\u72b6\u6001)\"><\/a>Operator State(\u7b97\u5b50\u72b6\u6001)<\/h2>\n<p>Operator State \u4e0e Key \u65e0\u5173\uff0c\u800c\u662f\u4e0e Operator \u7ed1\u5b9a\uff0c\u6574\u4e2a Operator \u53ea\u5bf9\u5e94\u4e00\u4e2a State\u3002\u6bd4\u5982\uff1aFlink \u4e2d\u7684 Kafka Connector \u5c31\u4f7f\u7528\u4e86 Operator State\uff0c\u5b83\u4f1a\u5728\u6bcf\u4e2a Connector \u5b9e\u4f8b\u4e2d\uff0c\u4fdd\u5b58\u8be5\u5b9e\u4f8b\u6d88\u8d39 Topic \u7684\u6240\u6709\uff08partition\uff0coffset\uff09\u6620\u5c04\uff0coperator state \u53ea\u6709\u4e00\u79cd\u6258\u7ba1\u72b6\u6001\uff1aValueState<\/p>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#Operator-State\u6848\u4f8b\u6f14\u793a\" title=\"Operator State\u6848\u4f8b\u6f14\u793a\"><\/a>Operator State\u6848\u4f8b\u6f14\u793a<\/h3>\n<h2><a href=\"https:\/\/www.studytime.xin\/article\/#Flink\u7684\u72b6\u6001\u7ba1\u7406\u4e4bState-Backend\" title=\"Flink\u7684\u72b6\u6001\u7ba1\u7406\u4e4bState Backend\"><\/a>Flink\u7684\u72b6\u6001\u7ba1\u7406\u4e4bState Backend<\/h2>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cstate\u4f1a\u4fdd\u5b58\u5728taskmanager\u7684\u5185\u5b58\u4e2d\uff0ccheckpoint\u4f1a\u5b58\u50a8\u5728JobManager\u7684\u5185\u5b58\u4e2d\u3002state \u7684\u5b58\u50a8\u548ccheckpoint\u7684\u4f4d\u7f6e\u53d6\u51b3\u4e8eState Backend\u7684\u914d\u7f6e\u3002Flink\u4e00\u5171\u63d0\u4f9b\u4e863\u79cdStateBackend\uff0cMemoryStateBackend\u57fa\u4e8e\u5185\u5b58\u5b58\u50a8\u3001FsStateBackend\u57fa\u4e8e\u6587\u4ef6\u7cfb\u7edf\u5b58\u50a8\u3001RocksDBStateBackend\u57fa\u4e8e\u6570\u636e\u5e93\u5b58\u50a8\u3002\u53ef\u4ee5\u901a\u8fc7  <code>StreamExecutionEnvironment.setStateBackend(...)<\/code>\u6765\u8bbe\u7f6estate\u5b58\u50a8\u7684\u4f4d\u7f6e\u3002<\/p>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#MemoryStateBackend\" title=\"MemoryStateBackend\"><\/a>MemoryStateBackend<\/h3>\n<p>\u5c06\u6570\u636e\u6301\u4e45\u5316\u72b6\u6001\u5b58\u50a8\u5230\u5185\u5b58\u5f53\u4e2d\uff0cstate\u6570\u636e\u4fdd\u5b58\u5728java\u5806\u5185\u5b58\u4e2d\uff0c\u6267\u884ccheckpoint\u7684\u65f6\u5019\uff0c\u4f1a\u628astate\u7684\u5feb\u7167\u6570\u636e\u4fdd\u5b58\u5230jobmanager\u7684\u5185\u5b58\u4e2d\u3002\u57fa\u4e8e\u5185\u5b58\u7684state backend\u5728\u751f\u4ea7\u73af\u5883\u4e0b\u4e0d\u5efa\u8bae\u4f7f\u7528\u3002<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/09\/20200910_5f5a17ab53d71.jpg\" alt=\"\u6d45\u8c08flink state\u72b6\u6001\u7ba1\u7406\u673a\u5236\"><\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u4ee3\u7801\u914d\u7f6e\" title=\"\u4ee3\u7801\u914d\u7f6e\"><\/a>\u4ee3\u7801\u914d\u7f6e<\/h4>\n<p><code>environment.setStateBackend(new MemoryStateBackend())<\/code> \u8bbe\u7f6eMemoryStateBackend\u3002<\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u4f7f\u7528\u573a\u666f\" title=\"\u4f7f\u7528\u573a\u666f\"><\/a>\u4f7f\u7528\u573a\u666f<\/h4>\n<ul>\n<li>\u672c\u5730\u8c03\u8bd5\u573a\u666f<\/li>\n<li>flink\u4efb\u52a1\u72b6\u6001\u6570\u636e\u91cf\u8f83\u5c0f\u7684\u573a\u666f<\/li>\n<\/ul>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#FsStateBackend\" title=\"FsStateBackend\"><\/a>FsStateBackend<\/h3>\n<p>state\u6570\u636e\u4fdd\u5b58\u5728taskmanager\u7684\u5185\u5b58\u4e2d\uff0c\u6267\u884ccheckpoint\u7684\u65f6\u5019\uff0c\u4f1a\u628astate\u7684\u5feb\u7167\u6570\u636e\u4fdd\u5b58\u5230\u914d\u7f6e\u7684\u6587\u4ef6\u7cfb\u7edf\u4e2d\u3002\u53ef\u4ee5\u4f7f\u7528hdfs\u7b49\u5206\u5e03\u5f0f\u6587\u4ef6\u7cfb\u7edf.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/09\/20200910_5f5a17b136f6d.jpg\" alt=\"\u6d45\u8c08flink state\u72b6\u6001\u7ba1\u7406\u673a\u5236\"><\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u4ee3\u7801\u914d\u7f6e-1\" title=\"\u4ee3\u7801\u914d\u7f6e\"><\/a>\u4ee3\u7801\u914d\u7f6e<\/h4>\n<p><code>environment.setStateBackend(new FsStateBackend(&quot;hdfs:\/\/node01:8020\/flink\/checkDir&quot;))<\/code> <\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u4f7f\u7528\u573a\u666f-1\" title=\"\u4f7f\u7528\u573a\u666f\"><\/a>\u4f7f\u7528\u573a\u666f<\/h4>\n<ul>\n<li>\u72b6\u6001\u6570\u636e\u7279\u522b\u7684\u591a\uff0c\u8fd8\u6709\u957f\u65f6\u95f4\u7684window\u7b97\u5b50\u7b49\uff0c\u5b83\u5f88\u5b89\u5168\uff0c\u56e0\u4e3a\u57fa\u4e8ehdfs\uff0c\u6240\u4ee5\u6570\u636e\u6709\u5907\u4efd\u5f88\u5b89\u5168<\/li>\n<li>\u5927\u72b6\u6001\u3001\u957f\u7a97\u53e3\u3001\u5927key\/value\u72b6\u6001\u7684\u7684\u4efb\u52a1<\/li>\n<li>\u5168\u9ad8\u53ef\u7528\u914d\u7f6e<\/li>\n<\/ul>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#RocksDBStateBackend\" title=\"RocksDBStateBackend\"><\/a>RocksDBStateBackend<\/h3>\n<p>RocksDB\u4ecb\u7ecd\uff1a<br \/>    RocksDB\u4f7f\u7528\u4e00\u5957\u65e5\u5fd7\u7ed3\u6784\u7684\u6570\u636e\u5e93\u5f15\u64ce\uff0c\u5b83\u662fFlink\u4e2d\u5185\u7f6e\u7684\u7b2c\u4e09\u65b9\u72b6\u6001\u7ba1\u7406\u5668,\u4e3a\u4e86\u66f4\u597d\u7684\u6027\u80fd\uff0c\u8fd9\u5957\u5f15\u64ce\u662f\u7528C++\u7f16\u5199\u7684\u3002 Key\u548cvalue\u662f\u4efb\u610f\u5927\u5c0f\u7684\u5b57\u8282\u6d41\u3002RocksDB\u8ddf\u4e0a\u9762\u7684\u90fd\u7565\u6709\u4e0d\u540c\uff0c\u5b83\u4f1a\u5728\u672c\u5730\u6587\u4ef6\u7cfb\u7edf\u4e2d\u7ef4\u62a4\u72b6\u6001\uff0cstate\u4f1a\u76f4\u63a5\u5199\u5165\u672c\u5730rocksdb\u4e2d\u3002\u540c\u65f6\u5b83\u9700\u8981\u914d\u7f6e\u4e00\u4e2a\u8fdc\u7aef\u7684filesystem uri\uff08\u4e00\u822c\u662fHDFS\uff09\uff0c\u5728\u505acheckpoint\u7684\u65f6\u5019\uff0c\u4f1a\u628a\u672c\u5730\u7684\u6570\u636e\u76f4\u63a5\u590d\u5236\u5230fileSystem\u4e2d\u3002fail over\u7684\u65f6\u5019\u4ecefileSystem\u4e2d\u6062\u590d\u5230\u672c\u5730RocksDB\u514b\u670d\u4e86state\u53d7\u5185\u5b58\u9650\u5236\u7684\u7f3a\u70b9\uff0c\u540c\u65f6\u53c8\u80fd\u591f\u6301\u4e45\u5316\u5230\u8fdc\u7aef\u6587\u4ef6\u7cfb\u7edf\u4e2d\uff0c\u6bd4\u8f83\u9002\u5408\u5728\u751f\u4ea7\u4e2d\u4f7f\u7528.<\/p>\n<pre><code>![](https:\/\/static.studytime.xin\/article\/2020\/09\/15997362546353.jpg)<\/code><\/pre>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u4ee3\u7801\u914d\u7f6e-2\" title=\"\u4ee3\u7801\u914d\u7f6e\"><\/a>\u4ee3\u7801\u914d\u7f6e<\/h4>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><span>2<\/span><br><span>3<\/span><br><span>4<\/span><br><span>5<\/span><br><span>6<\/span><br><span>7<\/span><br><span>8<\/span><br><span>9<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span># \u5bfc\u5165jar\u5305\u7136\u540e\u914d\u7f6e\u4ee3\u7801<\/span><br><span>&lt;dependency&gt;<\/span><br><span>\u00a0\u00a0\u00a0 &lt;groupId&gt;org.apache.flink&lt;\/groupId&gt;<\/span><br><span>\u00a0\u00a0\u00a0 &lt;artifactId&gt;flink-statebackend-rocksdb_2<span>.11<\/span>&lt;\/artifactId&gt;<\/span><br><span>\u00a0\u00a0\u00a0 &lt;version&gt;<span>1.9<\/span><span>.2<\/span>&lt;\/version&gt;<\/span><br><span>&lt;\/dependency&gt;<\/span><br><span><\/span><br><span># \u4ee3\u7801\u914d\u7f6e<\/span><br><span>environment.setStateBackend(<span>new<\/span> <span>RocksDBStateBackend<\/span>(<span>\"hdfs:\/\/node01:8020\/flink\/checkDir\"<\/span>,<span>true<\/span>))<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#\u4f7f\u7528\u573a\u666f-2\" title=\"\u4f7f\u7528\u573a\u666f\"><\/a>\u4f7f\u7528\u573a\u666f<\/h3>\n<ul>\n<li>\u5927\u72b6\u6001\u3001\u957f\u7a97\u53e3\u3001\u5927key\/value\u72b6\u6001\u7684\u7684\u4efb\u52a1<\/li>\n<li>\u5168\u9ad8\u53ef\u7528\u914d\u7f6e<\/li>\n<\/ul>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#\u5982\u4f55\u9009\u62e9\u4ee5\u53ca\u4f7f\u7528state-backend\" title=\"\u5982\u4f55\u9009\u62e9\u4ee5\u53ca\u4f7f\u7528state-backend\"><\/a>\u5982\u4f55\u9009\u62e9\u4ee5\u53ca\u4f7f\u7528state-backend<\/h3>\n<p>\u7531\u4e8eRocksDBStateBackend\u5c06\u5de5\u4f5c\u72b6\u6001\u5b58\u50a8\u5728taskManger\u7684\u672c\u5730\u6587\u4ef6\u7cfb\u7edf\uff0c\u72b6\u6001\u6570\u91cf\u4ec5\u4ec5\u53d7\u9650\u4e8e\u672c\u5730\u78c1\u76d8\u5bb9\u91cf\u9650\u5236\uff0c\u5bf9\u6bd4\u4e8eFsStateBackend\u4fdd\u5b58\u5de5\u4f5c\u72b6\u6001\u5728\u5185\u5b58\u4e2d\uff0cRocksDBStateBackend\u80fd\u907f\u514dflink\u4efb\u52a1\u6301\u7eed\u8fd0\u884c\u53ef\u80fd\u5bfc\u81f4\u7684\u72b6\u6001\u6570\u91cf\u66b4\u589e\u800c\u5185\u5b58\u4e0d\u8db3\u7684\u60c5\u51b5\uff0c\u56e0\u6b64\u9002\u5408\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u3002<\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u4fee\u6539state-backend\u7684\u4e24\u79cd\u65b9\u5f0f\" title=\"\u4fee\u6539state-backend\u7684\u4e24\u79cd\u65b9\u5f0f\"><\/a>\u4fee\u6539state-backend\u7684\u4e24\u79cd\u65b9\u5f0f<\/h4>\n<h5><a href=\"https:\/\/www.studytime.xin\/article\/#\u5355\u4efb\u52a1\u8c03\u6574\" title=\"\u5355\u4efb\u52a1\u8c03\u6574\"><\/a>\u5355\u4efb\u52a1\u8c03\u6574<\/h5>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><span>2<\/span><br><span>3<\/span><br><span>4<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span>env.setStateBackend(<\/span><br><span>new FsStateBackend(&quot;hdfs:&#x2F;&#x2F;node01:8020&#x2F;flink&#x2F;checkDir&quot;))<\/span><br><span>\u6216\u8005new MemoryStateBackend()<\/span><br><span>\u6216\u8005new RocksDBStateBackend(filebackend, true);\u3010\u9700\u8981\u6dfb\u52a0\u7b2c\u4e09\u65b9\u4f9d\u8d56\u3011<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u5168\u5c40\u8c03\u6574\" title=\"\u5168\u5c40\u8c03\u6574\"><\/a>\u5168\u5c40\u8c03\u6574<\/h4>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><span>2<\/span><br><span>3<\/span><br><span>4<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span>vim flink-conf.yaml<\/span><br><span><\/span><br><span>state.backend: filesystem<\/span><br><span>state.checkpoints.dir: hdfs:&#x2F;&#x2F;node01:8020&#x2F;flink&#x2F;checkDir<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<p>\u6ce8\u610f\uff1astate.backend\u7684\u503c\u53ef\u4ee5\u662f\u4e0b\u9762\u51e0\u79cd<\/p>\n<ul>\n<li>jobmanager    \u8868\u793a\u4f7f\u7528 MemoryStateBackend<\/li>\n<li>filesystem    \u8868\u793a\u4f7f\u7528 FsStateBackend<\/li>\n<li>rocksdb       \u8868\u793a\u4f7f\u7528 RocksDBStateBackend<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>state \u7b80\u8ff0 Apache F&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/153447"}],"collection":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=153447"}],"version-history":[{"count":0,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/153447\/revisions"}],"wp:attachment":[{"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=153447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=153447"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=153447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}