Maven >= 3.0.4 和 Java 8.x,
使用 IDEA 来开发项目。
$ mkdir -p /data/datacenter;
$ cd /data/datacenter;
$ mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-scala \
-DarchetypeVersion=1.9.1
...
Define value for property 'groupId': org.demo
Define value for property 'artifactId': flink
Define value for property 'version' 1.0-SNAPSHOT: :<回车>
Define value for property 'package' org.demo: : <回车>
Confirm properties configuration:
groupId: org.demo
artifactId: flink
version: 1.0-SNAPSHOT
package: org.demo.flink
Y: : Y
以交互式的方式要求填写项目的 groupId,artifactId 和 package
这里以 flink.demo.org
示例,
$ mv flink flink.demo.org
$ tree flink.demo.org/
flink.demo.org/
├── pom.xml
└── src
└── main
├── resources
│ └── log4j.properties
└── scala
└── org
└── demo
└── flink
├── BatchJob.scala
└── StreamingJob.scala
BatchJob.scala 和 StreamingJob.scala 分别是批处理任务和流处理任务的示例。
现在把项目导入到 IntelliJ IDEA;
示例中的 pom 是一个非常好的实践, pom.xml 分三大段
<dependencies>dependencies>
<build>build>
<profiles>profiles>
Flink 项目,必定需要依赖 Flink 类库,Flink 应用至少需要依赖 Flink APIs。许多应用还会额外依赖连接器类库(比如 Kafka、Cassandra 等)。 当用户运行 Flink 应用时(无论是在 IDE 环境下进行测试,还是部署在分布式环境下),运行时类库都必须可用。
<dependency>
<groupId>org.apache.flinkgroupId>
<artifactId>flink-scala_${scala.binary.version}artifactId>
<version>${flink.version}version>
<scope>providedscope>
dependency>
注意:项目在 IDEA 调试时会出现
no such class
等错误而无法运行, 需要对开发环境进行另外配置,在下面第三点
profile
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
<version>2.8.5version>
dependency>
示例里 build 区块构建带有依赖的应用 jar 包, 如果使用IntelliJ IDEA,则可以把 Eclipse 相关配置删除;
另强烈建议在 build 节点增加如下配置,方便测试和线上配置文件环境隔离;
<build>
<plugins>
....
plugins>
<resources>
<resource>
<directory>src/main/resources_${profileActive}directory>
<includes>
<include>**/*include>
includes>
resource>
resources>
build>
profile 是 maven 项目常用的测试环境与生成环境配置隔离工具,修改配置如下:
<profiles>
<profile>
<id>prodid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<properties>
<profileActive>prodprofileActive>
properties>
profile>
<profile>
<id>testid>
<properties>
<profileActive>testprofileActive>
properties>
profile>
<profile>
<id>devid>
<activation>
<property>
<name>idea.versionname>
property>
activation>
<properties>
<profileActive>testprofileActive>
properties>
<dependencies>
<dependency>
<groupId>org.apache.flinkgroupId>
<artifactId>flink-scala_${scala.binary.version}artifactId>
<version>${flink.version}version>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.apache.flinkgroupId>
<artifactId>flink-streaming-scala_${scala.binary.version}artifactId>
<version>${flink.version}version>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.scala-langgroupId>
<artifactId>scala-libraryartifactId>
<version>${scala.version}version>
<scope>compilescope>
dependency>
dependencies>
profile>
profiles>
这是就能看到如下图的maven profiles 中出现了 dev prod test, pom.xml 配置文件中可以使用 ${profileActive} 来表示。
特别注意: 我这里 dev 的profileActive 写的是 test, 因为对于一般大数据开发来说,不一定有 dev 环境,建议直接使用测试集群配置即可。
profile 节点中也有一部分 dependencies, 这里就是第一点 dependiences 说了开发环境的配置,
的依赖包并不会加载到 IDEA 开发环境, 所以需要把这一类的依赖配置拷贝放到 dev profile 下面,并且把 provided 修改为 compile 可参考 profile 配置。
compile
默认scope为compile,表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包之时,会达到包里去。
test
该依赖仅仅参与测试相关的内容,包括测试用例的编译和执行,比如定性的Junit。
runtime
依赖仅参与运行周期中的使用。一般这种类库都是接口与实现相分离的类库,比如JDBC类库,在编译之时仅依赖相关的接口,在具体的运行之时,才需要具体的mysql、oracle等等数据的驱动程序。 此类的驱动都是为runtime的类库。
provided
该依赖在打包过程中,不需要打进去,这个由运行的环境来提供,比如tomcat或者基础类库等等,事实上,该依赖可以参与编译、测试和运行等周期,与compile等同。区别在于打包阶段进行了exclude操作。
system
使用上与provided相同,不同之处在于该依赖不从maven仓库中提取,而是从本地文件系统中提取,其会参照systemPath的属性进行提取依赖。
import
这个是maven2.0.9版本后出的属性,import只能在dependencyManagement的中使用,能解决maven单继承问题,import依赖关系实际上并不参与限制依赖关系的传递性。
绝大部分软件工程都需要通过修改配置文件的方式来区分「开发」、「测试」、「生产」环境,但很多项目的配置往往不甚明白。我个人见解:
本文介绍项目代码框架,我认为已经满足上述需求。
scala-flink 项目 quickstart
flink 项目依赖
https://github.com/fencex/flink.demo.org
下一篇:Flink项目最佳实践(二):第一个实时模拟ETL任务
欢迎订阅本专栏 :)
记住:
能力越大
薪资越高