From bbcef5c34044ad73ed633244691341684a8ddb7f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com>
Date: Thu, 24 Oct 2019 15:10:34 +0800
Subject: [PATCH] modify
---
code/Flink/flink-basis-java/pom.xml | 239 ++++++++++++++++++
.../main/java/com/heibaiying/BatchJob.java | 45 ++++
.../java/com/heibaiying/StreamingJob.java | 64 +++++
.../src/main/resources/log4j.properties | 0
.../pom.xml | 2 +-
.../src/main/resources/log4j.properties | 23 ++
.../src/main/resources/wordcount.txt | 0
.../main/scala/com/heibaiying/BatchJob.scala | 0
.../scala/com/heibaiying/StreamingJob.scala | 0
.../scala/com/heibaiying/WordCountBatch.scala | 2 +-
.../com/heibaiying/WordCountStreaming.scala | 0
pictures/flink-lib.png | Bin 14791 -> 13727 bytes
12 files changed, 373 insertions(+), 2 deletions(-)
create mode 100644 code/Flink/flink-basis-java/pom.xml
create mode 100644 code/Flink/flink-basis-java/src/main/java/com/heibaiying/BatchJob.java
create mode 100644 code/Flink/flink-basis-java/src/main/java/com/heibaiying/StreamingJob.java
rename code/Flink/{flink-basis => flink-basis-java}/src/main/resources/log4j.properties (100%)
rename code/Flink/{flink-basis => flink-basis-scala}/pom.xml (99%)
create mode 100644 code/Flink/flink-basis-scala/src/main/resources/log4j.properties
rename code/Flink/{flink-basis => flink-basis-scala}/src/main/resources/wordcount.txt (100%)
rename code/Flink/{flink-basis => flink-basis-scala}/src/main/scala/com/heibaiying/BatchJob.scala (100%)
rename code/Flink/{flink-basis => flink-basis-scala}/src/main/scala/com/heibaiying/StreamingJob.scala (100%)
rename code/Flink/{flink-basis => flink-basis-scala}/src/main/scala/com/heibaiying/WordCountBatch.scala (86%)
rename code/Flink/{flink-basis => flink-basis-scala}/src/main/scala/com/heibaiying/WordCountStreaming.scala (100%)
diff --git a/code/Flink/flink-basis-java/pom.xml b/code/Flink/flink-basis-java/pom.xml
new file mode 100644
index 0000000..82b282f
--- /dev/null
+++ b/code/Flink/flink-basis-java/pom.xml
@@ -0,0 +1,239 @@
+
+
+ 4.0.0
+
+ com.heibaiying
+ flink-basis-java
+ 1.0
+ jar
+
+ Flink Quickstart Job
+ http://www.myorganization.org
+
+
+ UTF-8
+ 1.9.0
+ 1.8
+ 2.11
+ ${java.version}
+ ${java.version}
+
+
+
+
+ apache.snapshots
+ Apache Development Snapshot Repository
+ https://repository.apache.org/content/repositories/snapshots/
+
+ false
+
+
+ true
+
+
+
+
+
+
+
+
+ org.apache.flink
+ flink-java
+ ${flink.version}
+ provided
+
+
+ org.apache.flink
+ flink-streaming-java_${scala.binary.version}
+ ${flink.version}
+ provided
+
+
+
+
+
+
+
+
+
+ org.slf4j
+ slf4j-log4j12
+ 1.7.7
+ runtime
+
+
+ log4j
+ log4j
+ 1.2.17
+ runtime
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.10
+ provided
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.1
+
+ ${java.version}
+ ${java.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.0.0
+
+
+
+ package
+
+ shade
+
+
+
+
+ org.apache.flink:force-shading
+ com.google.code.findbugs:jsr305
+ org.slf4j:*
+ log4j:*
+
+
+
+
+
+ *:*
+
+ META-INF/*.SF
+ META-INF/*.DSA
+ META-INF/*.RSA
+
+
+
+
+
+ com.heibaiying.StreamingJob
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.eclipse.m2e
+ lifecycle-mapping
+ 1.0.0
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ [3.0.0,)
+
+ shade
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ [3.1,)
+
+ testCompile
+ compile
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ add-dependencies-for-IDEA
+
+
+
+ idea.version
+
+
+
+
+
+ org.apache.flink
+ flink-java
+ ${flink.version}
+ compile
+
+
+ org.apache.flink
+ flink-streaming-java_${scala.binary.version}
+ ${flink.version}
+ compile
+
+
+
+
+
+
diff --git a/code/Flink/flink-basis-java/src/main/java/com/heibaiying/BatchJob.java b/code/Flink/flink-basis-java/src/main/java/com/heibaiying/BatchJob.java
new file mode 100644
index 0000000..7d3a48b
--- /dev/null
+++ b/code/Flink/flink-basis-java/src/main/java/com/heibaiying/BatchJob.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.heibaiying;
+
+import org.apache.flink.api.java.ExecutionEnvironment;
+import org.apache.flink.api.java.operators.DataSource;
+
+/**
+ * Skeleton for a Flink Batch Job.
+ *
+ *
For a tutorial how to write a Flink batch application, check the
+ * tutorials and examples on the Flink Website.
+ *
+ *
To package your application into a JAR file for execution,
+ * change the main class in the POM.xml file to this class (simply search for 'mainClass')
+ * and run 'mvn clean package' on the command line.
+ */
+public class BatchJob {
+
+ public static void main(String[] args) throws Exception {
+
+ final String rootPath = "D:\\BigData-Notes\\code\\Flink\\flink-basis-java\\src\\main\\resources\\";
+ // set up the batch execution environment
+ final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
+
+ DataSource readTextFile = env.readTextFile(rootPath + "log4j.properties");
+ readTextFile.print();
+ }
+}
diff --git a/code/Flink/flink-basis-java/src/main/java/com/heibaiying/StreamingJob.java b/code/Flink/flink-basis-java/src/main/java/com/heibaiying/StreamingJob.java
new file mode 100644
index 0000000..5c607c6
--- /dev/null
+++ b/code/Flink/flink-basis-java/src/main/java/com/heibaiying/StreamingJob.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.heibaiying;
+
+import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
+
+/**
+ * Skeleton for a Flink Streaming Job.
+ *
+ *
For a tutorial how to write a Flink streaming application, check the
+ * tutorials and examples on the Flink Website.
+ *
+ *
To package your application into a JAR file for execution, run
+ * 'mvn clean package' on the command line.
+ *
+ *
If you change the name of the main class (with the public static void main(String[] args))
+ * method, change the respective entry in the POM.xml file (simply search for 'mainClass').
+ */
+public class StreamingJob {
+
+ public static void main(String[] args) throws Exception {
+ // set up the streaming execution environment
+ final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
+
+ /*
+ * Here, you can start creating your execution plan for Flink.
+ *
+ * Start with getting some data from the environment, like
+ * env.readTextFile(textPath);
+ *
+ * then, transform the resulting DataStream using operations
+ * like
+ * .filter()
+ * .flatMap()
+ * .join()
+ * .coGroup()
+ *
+ * and many more.
+ * Have a look at the programming guide for the Java API:
+ *
+ * http://flink.apache.org/docs/latest/apis/streaming/index.html
+ *
+ */
+
+ // execute program
+ env.execute("Flink Streaming Java API Skeleton");
+ }
+}
diff --git a/code/Flink/flink-basis/src/main/resources/log4j.properties b/code/Flink/flink-basis-java/src/main/resources/log4j.properties
similarity index 100%
rename from code/Flink/flink-basis/src/main/resources/log4j.properties
rename to code/Flink/flink-basis-java/src/main/resources/log4j.properties
diff --git a/code/Flink/flink-basis/pom.xml b/code/Flink/flink-basis-scala/pom.xml
similarity index 99%
rename from code/Flink/flink-basis/pom.xml
rename to code/Flink/flink-basis-scala/pom.xml
index a4ef7c3..8e57e57 100644
--- a/code/Flink/flink-basis/pom.xml
+++ b/code/Flink/flink-basis-scala/pom.xml
@@ -22,7 +22,7 @@ under the License.
4.0.0com.heibaiying
- flink-basis
+ flink-basis-scala1.0jar
diff --git a/code/Flink/flink-basis-scala/src/main/resources/log4j.properties b/code/Flink/flink-basis-scala/src/main/resources/log4j.properties
new file mode 100644
index 0000000..da32ea0
--- /dev/null
+++ b/code/Flink/flink-basis-scala/src/main/resources/log4j.properties
@@ -0,0 +1,23 @@
+################################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+################################################################################
+
+log4j.rootLogger=INFO, console
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %-60c %x - %m%n
diff --git a/code/Flink/flink-basis/src/main/resources/wordcount.txt b/code/Flink/flink-basis-scala/src/main/resources/wordcount.txt
similarity index 100%
rename from code/Flink/flink-basis/src/main/resources/wordcount.txt
rename to code/Flink/flink-basis-scala/src/main/resources/wordcount.txt
diff --git a/code/Flink/flink-basis/src/main/scala/com/heibaiying/BatchJob.scala b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/BatchJob.scala
similarity index 100%
rename from code/Flink/flink-basis/src/main/scala/com/heibaiying/BatchJob.scala
rename to code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/BatchJob.scala
diff --git a/code/Flink/flink-basis/src/main/scala/com/heibaiying/StreamingJob.scala b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/StreamingJob.scala
similarity index 100%
rename from code/Flink/flink-basis/src/main/scala/com/heibaiying/StreamingJob.scala
rename to code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/StreamingJob.scala
diff --git a/code/Flink/flink-basis/src/main/scala/com/heibaiying/WordCountBatch.scala b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountBatch.scala
similarity index 86%
rename from code/Flink/flink-basis/src/main/scala/com/heibaiying/WordCountBatch.scala
rename to code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountBatch.scala
index a7ec2a7..ff52ae7 100644
--- a/code/Flink/flink-basis/src/main/scala/com/heibaiying/WordCountBatch.scala
+++ b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountBatch.scala
@@ -6,7 +6,7 @@ object WordCountBatch {
def main(args: Array[String]): Unit = {
val benv = ExecutionEnvironment.getExecutionEnvironment
- val text = benv.readTextFile("D:\\BigData-Notes\\code\\Flink\\flink-basis\\src\\main\\resources\\wordcount.txt")
+ val text = benv.readTextFile("D:\\BigData-Notes\\code\\Flink\\flink-basis-scala\\src\\main\\resources\\wordcount.txt")
val counts = text.flatMap { _.toLowerCase.split(",") filter { _.nonEmpty } }.map { (_, 1) }.groupBy(0).sum(1)
counts.print()
}
diff --git a/code/Flink/flink-basis/src/main/scala/com/heibaiying/WordCountStreaming.scala b/code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountStreaming.scala
similarity index 100%
rename from code/Flink/flink-basis/src/main/scala/com/heibaiying/WordCountStreaming.scala
rename to code/Flink/flink-basis-scala/src/main/scala/com/heibaiying/WordCountStreaming.scala
diff --git a/pictures/flink-lib.png b/pictures/flink-lib.png
index d43cd3468c2d35fb0f5aca5aa976b03fa178c18d..9d76b9dedb91d450274965fc4e0c27d8e5190dc5 100644
GIT binary patch
literal 13727
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
literal 14791
zcmcJWbyQS;->wIc5QdgU8Ug8Uh7M5#q#FV0?gmLkx&);|1eER=q(iz}IuwB+hhb*U
z@Qdg7yze>BIaIt~`<
zv)X;c0qVGLt-x_1FsjZue^LMJ!}9kTD0i_{8wt>az{PX2t(EJaIVcrMk?&Pa=_v%|!Bj`z7e;hJP5uOTE-TsBiS&b`;S
z(y)?&5n9S0nu7xf>!6@9ILfu$ISjeom<_Bnkqh29ZXNHe(m$>dFeX!|`E^4q?-3fM
z>oWO7$|bf$h>5aOuyN4Kk1sjXwhQmZSAytz$Tf15jq5>l)CASLn@>H)U;Kf*`9<-`
z30+40v5ttypm~HXrfxLiVKn`aFzd8f&gr$_0Z3K_M`qyF{T|$CkwaOFqTJ9rCv&VI
z+uG20NeVM)h}sVr6!{?=-uA-~8vrOcB+*jlxh7~znT|7|Boxl{;
zcP3T4^=1f?|2m@Yj7V2!f6
zg*l;T@7Fz~ZTGhxK3z)ffZWGpN>=heA^_#M8*GSGe)O(s?ZD&jYCZZn8`$v6Cbayv
z8nUYP$oZlLcur36pKi%xP9n5s3P%E9ql_WfJq
zr6DdmhH~00_P3y}k1VNlbx(FL;|dX4^;IIu+*{i4l^U@0S%+t+&IuIq!7bO}@St*gM$KRw@xqG1a*w>AzLj`Eq&n>QYlnOrf(XO}kg?Awhc6
zVxeKEC>&rjT}IsvM%JMm<(8V%(^h${u+n*SgU2>?XQRE>Z
z(pN1{N~VLKQHkr&&)wTkuz4!x;k~F8@@8&(PlIb`QJ#+Isv%^wAnLw)R>dvW+Kf%{
zney}$#}gfzmp#w@Loav_GTKeZ28$nVKSfKu7bSAT=Q2*ySk(dHh8S#5hdI#_0Vq48
zpE|C4j`2kS%Y4XeIp(*dl=NHmPDQ4djepz
z@)@sH#MQ9xF5SSfc%_@IpXj~p%xtA&I9cZnnR{RYSwhd;=)?w|P>5k$&-0HrALkXQ
z!QkrbZjri}>-V&q!oCTFXd1-7$eNOA%o4br)g;0~IMSM|t_$Zsz#_*T#|M_ruk;Nb
z8WO|&M(x)n!53Be_dT9=D{fNh@%OGr?_S?H=fm2b8zFNy
z@I>64JvZV@Q}@k&lA9Ai?c1)2tqjwKFM`u(b~AMqoFWS60f5TRe(UW{{|W)+I8Ns+Xs1&N>HrS?_H^FJm9!5Ra7G61@M0(gLC^Gzx7W6M
zOxJ7oRXfFcFZzkVouGjj+1eM^$#k1JJV*rjz`R^jft4SWD{3^dbRDWI`|!3-f2D8o
z1aivd_Z!)r$rx|0yeCWQ*QSI~BZd%7%D=Zp=dpj_fu8BR+cPVk;Ci8ZES=!oPY*bE
zm7(fXsqR_NnriF3l($X(WXN>Ai^KE*pMR_`})4R=8B_cA$}G>54nS+Lg;*C7GyN>Lr~EgR(aoPi+wdHCq2FkKEO5{Gwk0y9H7Qvx
zWjw;+sOZVOCi`Ii(~L(K^e_D#blZn{+is}}n?M-*6eOjM!o@zoT#
z$QuEPR|Sn+(Xi{EIT)w0sy-!opv1UJn{Rz<*7`=SG+|}1w$#XNXO6~G*j5_x9$i3(
zW;WSIM}Dg?D&iF#7d5F>f*hnxM1!`UiBnbe#((!g8QxSzL5G*O!d&R&8BB|>x9$0!
z7(#`3_>yrAaV4GbEbgiIHxDQMa|BI*>L%=7m_0@5mHr?YjGn)i23`vZ@2JQpH};*u
zw5KqZOHfjbR);Aug{*{x1pv3~{PwDHMc_?PF05R5(ORRuQTZ7pz`Jb86zNkim
z#Dms4U1gnK3|h0-^RNghQc)!ennto~ErY$vb4aZpHEH(jsuY-0lSR-lMei^!Gz)t~
z%O9jYJov;D!UN>hrGih==#LV9EsYh?m9G=vkmL%0WnU1Y_nb|1;P7)LW|ttR#C{Ce
zKK8%REYrhI3{pOdJEhWj29jPs@ClZ-T|1ohQK?k%c_oD?=CLkL7NvEyz@yUi$&f7#
zqvy+satolW?(Pba!)3U=jVljsSj|_<^vpQr=SQ?diZ)Rzl92H|wpn`MX9!TG>UA?~
zYu_H~6|c5Kmg19DnM-vhJpK=mkhM_kedbc0T=e8Fv*fcHhS|!j>1OL}ys;bSS9J^1
zOE!Y(eFO27*}kcB7M~yiNE;QnK7q~}p@P>1nd`)<9N)$=>x`*6R*CEU`UTqCT9Y)t
zDZ9>x*y%#D=`(e%a<}OLX|BJvHC2@1E4xoE7H+GBd_2Uca-cN%8Q8seaI~!=;!zUJ
zVos4xg5|QSvod@vN+Hg{LAEVt)uTe~(n9B+ImmwFJ6jR>p#Dy*^M#@Aw7(*FXZ5G~
zr^gO(M}KdaG(fv0F6i0x21CT$n+Bv&{l-()@5a4fq1sfgtwzh#OYgSoat>tFg)pjky0b
zIoydh)C`*J9(QX)U$LBO+_m*(<7YgjtSjs-V!JoyOt8HNO9pG;03g~Q#hZLaois-;g7v-Om
z4J?nf(r#^j=LA&-5q6pd_as)GU#f48>=@);Z*{4ZwX#E88WTez->aeU3NYnWaYj
z*4UGX%dd5#0I(zrRXv!AU!38nbmU8U%@(cC($;D7UJF#+9b_V(tVp7k$k)=s&CHRa
z_;HUkmq?4=nD6Z_zE%+Bhb`>LtZrP&TdZ3r$4<^4O_NHWLSveflo^O}1wM>#<>9WMU*lk#m`F6tx-+D74
zxXj@{^^FB%W;a
zA5kMG-cd7e-1n<~(hX?_ZDQvmKZVBQ`<_aVtC%}`A+}%WEeR%ACtlK?K6E5UZ8BK6
z*|M=Ie@BerA17yr(t2O>J12ZsZP({3t_-riy!G633`6~~k1)V+hbs4w+#3>!2DMskFI>1mb<8bpKAdoV%gIfBbBSeL!ce6v+mWRHmVW4O7D~XBS
z@3LX$sq4e`J9j~&A8H1nqWgpbL~+v)Je@v+~{R~)@6Z{6X26e3Jgamw)VhLF+e+C0A
z^`!Wc@47O0-vr1X^*0#%!@pOk!2KgilJ}xMbM0PMhL-{iX$Km?c0*(4wtlq5@yVGi
zX}-gD?+`i>IGSqGk!iy3Y+II;Z@T1=YN$O$QW9UaXwya~9?}6R`U*ls93yN(OX~%c
z82Fw`{iN_gC<%ifGD$$A(ac9=zy6j5>S*}#RIOQzIX|}~p3bRS7EhlaKc)H-9@D3F
zFJDck;-hD$F1+%w?*}Z|Eni7#5{`(Hc!esvFUwbpH6a~^i8#++u~yrr(C6R6$sl`8
z*8v~|Y+k1N=2x--2I=^zz}!Gp5i{eJSm$r%rXAm)k`rd>-ZqdhFV