Spring Cloud Data Flow中文指南(译)

本文为Spring Cloud Data Flow官网中文翻译,原文见spring.io .由于工程量巨大,不可能一蹴而就,因此将分次完成并合并,以飨读者。同时希望有余力的同学加入到翻译工作中来。由于本人水平有限难免错误,欢迎指正。
译者:chen.Tian  
Email: tienchen1990@hotmail.com
引言:
如果你正在使用spring cloud数据流,本文适合你。这篇文章将告诉你一些诸如:spring cloud data flow是什么,怎样使用,为什么使用等基础问题。在安装过程中会有一个友好的引导。在使用spring cloud data flow开始之前,首先看一些核心原则。
1.系统要求
需要安装Java 8及以上的Java运行环境。需要安装Maven
需要安装关系数据库,用来存储数据流,任务及应用状态。本地数据流服务端默认使用内嵌式H2数据库。
如果你需要运行任何涉及分析应用程序的数据流,必须使用Redis。在单元测试和集成测试中也必须使用到Redis
如果流的任务之间需要通信,必须安装Rabbit MQ或者Kafka2.在本地部署Spring Cloud Data Flow服务2.1下载Spring Cloud Data Flow服务端:

wget http://repo.spring.io/release/org/springframework/cloud/spring-cloud-dataflow-server-local/1.2.3.RELEASE/spring-cloud-dataflow-server-local-1.2.3.RELEASE.jar
wget http://repo.spring.io/release/org/springframework/cloud/spring-cloud-dataflow-shell/1.2.3.RELEASE/spring-cloud-dataflow-shell-1.2.3.RELEASE.ja


2.2Spring Cloud Data Flow服务
    Spring Cloud Data Flow服务端是一个spring boot应用,可以使用java -jar形式启动

    $ java -jar spring-cloud-dataflow-server-local-1.2.3.RELEASE.jar


2.3启动命令:

$ java -jar spring-cloud-dataflow-shell-1.2.3.RELEASE.jar


如果数据流服务端和shell没有在没运行在同一个host下,将shell指向数据流服务器URL

server-unknown:>dataflow config serverhttp://198.51.100.0
Successfully targetedhttp://198.51.100.0
dataflow:>


默认情况,应用将不会被注册。如果想要注册所有和kafka集成的开箱即用的流应用,使用如下命令:

$ dataflow:>app import --urihttp://bit.ly/Bacon-RELEASE-stream-applications-kafka-10-maven


注意点:根据您的环境,可能需要将数据流服务器配置为指向自定义Maven存储库位置或配置代理2.4使用如下命令列出可使用的应用(发送端source,处理器processor,接收端sink)和创建流。例如:

dataflow:> stream create --name httptest --definition "http --server.port=9000 | log" --deploy


注意点:在发送数据之前,你需要等待一会儿,直到应用部署成功。在数据流服务器的日志文件中查找http和log应用的日志文件的位置。在文件的末尾查看验证每一个应用是否都被成功启动。
发送数据:

dataflow:> http post --targethttp://localhost:9000--data "hello world"


查看hello world是否最终出现在日志应用程序的日志文件中
注意点:在本地部署的时候,每个应用(每个应用实例,多实例数量>1)会被动态分配一个server.port, 除非明确指定--server.port=x形式。在这两种情况下,此设置都作为配置属性进行运行(propagated),该设置将覆盖所有较低级别的设置(比如在application.yml文件中的配置)
如果在执行命令的时候遇到意外错误,可以在logback.xml中将exception级别设置到WARNING来查看错误信息

<logger name="org.springframework.shell.core.JLineShellComponent.exceptions" level="WARNING"/>


2.5 Maven 配置
如果想覆盖特定的maven配置属性(远程仓库,代理等),在代理之后运行数据流服务,需要在启动数据流服务器时将这些属性指定为命令行参数。比如:

$ java -jar spring-cloud-dataflow-server-local-1.2.3.RELEASE.jar --maven.localRepository=mylocal
--maven.remote-repositories.repo1.url=https://repo1
--maven.remote-repositories.repo1.auth.username=user1
--maven.remote-repositories.repo1.auth.password=pass1
--maven.remote-repositories.repo2.url=https://repo2--maven.proxy.host=proxy1
--maven.proxy.port=9010 --maven.proxy.auth.username=proxyuser1
--maven.proxy.auth.password=proxypass1


默认使用http协议。如果代理不需要用户名和密码,则可以省略授权属性。Maven的默认本地仓库设置为${user.home}/.m2/repository/
就像上面的示例,如果需要的话远程仓库可以与他们的认证一起指定。如果远程仓库位于代理之后,则可以像上面一样指定代理属性。
由于这是spring boot应用@ConfigurationProperties也可以将它们指定为环境变量,例如MAVEN_REMOTE_REPOSITORIES_REPO1_URL
另一个常见方法是使用SPRING_APPLICATION_JSON环境变量设置属性。下面是使用JSON结构的一个例子

$ SPRING_APPLICATION_JSON='{ "maven": { "local-repository": null,
"remote-repositories": { "repo1": { "url": "https://repo1";, "auth": { "username": "repo1user", "password": "repo1pass" } }, "repo2": { "url": "https://repo2"; } },
"proxy": { "host": "proxyhost", "port": 9018, "auth": { "username": "proxyuser", "password": "proxypass" } } } }' java -jar spring-cloud-dataflow-server-local-{project-version}.jar


3.应用配置
你可以使用数据流服务器的以下配置属性来自定义应用程序的部署方式:

spring.cloud.deployer.local.workingDirectoriesRoot=java.io.tmpdir # Directory in which all created processes will run and create log files.
spring.cloud.deployer.local.deleteFilesOnExit=true # Whether to delete created files and directories on JVM exit.
spring.cloud.deployer.local.envVarsToInherit=TMP,LANG,LANGUAGE,"LC_.*. # Array of regular expression patterns for environment variables that will be passed to launched applications.
spring.cloud.deployer.local.javaCmd=java # Command to run java.
spring.cloud.deployer.local.shutdownTimeout=30 # Max number of seconds to wait for app shutdown.
spring.cloud.deployer.local.javaOpts= # The Java options to pass to the JVM


在部署应用的时候,还可以设置deployer属性作为前缀deployer.比如在ticktock流中的 time 应用中设置Java选项,使用如下部署选项:

dataflow:> stream create --name ticktock --definition "time --server.port=9000 | log"
dataflow:> stream deploy --name ticktock --properties "deployer.time.local.javaOpts=-Xmx2048m -Dtest=foo"


方便起见,可以使用deployer.memory属性来设置Java -Xmx. 比如:

dataflow:> stream deploy --name ticktock --properties "deployer.time.memory=2048m"


在部署时,如果您在deployer..local.javaOpts属性中指定-Xmx选项以及deployer..local.memory选项的值,javaOpts属性中的值具有优先权。此外,部署应用程序时设置的javaOpts属性也优先于数据流服务器的spring.cloud.deployer.local.javaOpts属性
应用(Application)
根据不同种类的数据集成和处理场景选择选择pre-builtstreamtask/batchstarter应用程序来学习和实验。有关详细信息,请查看register applications
架构(Architecture)4.介绍(Introduction)
Spring Cloud Data Flow简化了专注于数据处理用例的应用程序的开发和部署.该架构的主要概念是应用程序,数据流服务器和运行环境
应用程序有两种形式:
1.一个无限被消费或者通过消息中间件生成的数据的长时(Long lived)Stream应用程序。
2.处理一组有限的数据然后就终止的短时任务应用程序
根据运行环境,应用程序可以以两种方式打包
    托管在maven仓库,文件,http或任何其他Spring资源实现中的Spring Boot uber-jar
    Docker
运行环境是应用程序执行的地方。目标应用程序的运行环境是用于其他应用程序部署的平台
支持的运行环境如下:
    Cloud Foundry
    Apache YARN
    Kubernetes
    Apache Mesos
    Local Server for development
有一个部署者服务提供者接口(SPI),使您能够扩展数据流以部署到其他运行环境,比如支持Docker Swarm. 有Hashicorp’s Nomad 和RedHat Openshift的社区版可使用。
负责将应用程序部署到运行环境的组件是数据流服务器。数据流服务器为每个目标运行环境提供了一个可执行jar。数据流服务器负责如下功能:
    1.解释和执行一个描述通过多个长时(long lived)应用程序的数据逻辑的流DSL
    2.启动一个长时(long lived)任务程序
    3.通过多个短时(short lived)应用程序描述数据的逻辑流程来解释并执行组合的任务DSL
    4.描述应用和程序在运行环境上的映射的应用部署清单
    5.提供已部署应用程序的运行时状态
例如,用于描述从http源到Apache Cassandra接收器的数据流的流DSL将被写为“http |Cassandra”DSL中的这些名称在数据流服务器上注册,并映射到可驻留在Maven或Docker仓库中的应用程序工件上。Spring Cloud数据流团队提供了常见用例的许多发送端,处理器和接收器应用程序(例如jdbc,hdfs,http,路由器)。管道表示通过消息传递中间件在两个应用程序之间的通信。支持的两个消息中间件是:
    Apache Kafka
    Rabbit MQ
就Kafka而言,在部署流时,数据流服务器负责创建与每个管道相对应的主题,并配置每个应用程序以从主题中生产或消费,从而实现所需的数据流。
主要组件的相互作用如下所示:
/uploads/fox/20152245_0.240
图1:spring cloud数据顶层架构                                                
在这个图中,流的DSL描述被指向到数据流服务器。基于DSL应用程序名称映射到Maven和Docker构件,http-source和cassandra-sink应用程序部署在目标运行环境5.微服务架构风格(MicroService Architecture Style)
数据流服务器将应用程序部署到符合微服务架构风格的目标运行环境。例如,流表示由多个小型微服务应用程序组成的高级应用程序,每个小应用程序在其自己的进程中运行。每个微服务应用程序可以独立于另一个应用程序进行扩展或缩减,每个应用程序都有自己的版本生命周期。
基于流和基于任务的微服务应用程序基于Spring Boot作为基础库。这为所有微服务应用程序提供了例如运行状况检查,安全性,可配置日志记录,监视和管理的功能以及可执行的FAR包
需要强调的是,这些微服务应用程序只是“应用程序”,您可以使用“java -jar”自行运行并传递适当的配置属性。我们为常用操作提供了许多常见的微服务应用程序,所以在解决基于Spring生态系统的项目(如Spring集成,Spring Data,Spring Hadoop和Spring Batch)的常见用例时,不必从头开始。创建你自己的微服务应用程序与创建其他Spring Boot应用程序相似,你可以开始使用Spring Initializer的模板或UI来创建基于Stream或基于任务的微服务的基本架构。
除了将适当的配置传递给应用程序外,数据流服务器还负责准备目标平台的基础结构,以便部署应用程序。例如,在Cloud Foundry中,它将为应用程序绑定指定的服务,并为每个应用程序执行“cf push”命令。对于Kubernetes,它将创建复制控制器,服务和负载均衡器
数据流服务器有助于简化多个应用程序到目标运行环境的部署,也可以选择手动部署每个微服务应用程序,而不使用数据流。这种方法可能更适合从小规模部署开始,在开发更多应用程序时逐渐采用数据流会更具有便利性和一致性。手动部署基于Stream和Task的微服务也是一个有益的实践,它将帮助您更好地理解Data Flow Server提供的一些自动应用程序配置和步骤。
5.1与其他平台架构进行比较
Spring Cloud Data Flow的架构风格与其他Stream和Batch处理平台不同。例如在Apache Spark中,Apache Flink和Google Cloud Dataflow应用程序运行在专用的计算引擎集群上。与Spring Cloud数据流相比,计算引擎的性质赋予这些平台更丰富的环境来执行复杂运算,但它引入了另一种复杂的执行环境,这种环境在创建以数据为中心的应用程序时常常不需要。这并不意味着在使用Spring Cloud Data Flow时不能进行实时数据计算。请参阅分析部分,其中介绍了Redis的集成以处理基于常规计数的用例以及用于功能性API驱动分析用例的RxJava的集成,例如时间滑动窗口(sliding-window)和移动平均(moving-average)等等
同样,Apache Storm,Hortonworks DataFlow和Spring Cloud Data Flow的前身Spring XD都使用专用的应用程序执行群集,每个产品都是独一无二的,它确定你的代码应该在群集上执行的位置,并执行运行状况检查以确保长时(Long lived)应用程序失败的时候重新启动。通常,需要使用特定于框架的接口,以便正确地“插入”到集群的执行框架中。
正如我们在Spring XD的演进过程中发现的那样,2015年多个容器框架的兴起,使得我们自己的运行环境产生了一些重复的工作。当有多个平台提供此功能时,没有理由构建自己的资源管理机制。考虑到这些因素,使我们转向了当前的架构,在这种架构下,我们将执行委托给受欢迎的运行平台,你可能已经在其他地方使用过。这是一个优势,因为它减少了创建和管理以数据为中心的应用程序的认知距离,因为许多用于部署其他 end-user/ Web应用程序所使用的许多相同技巧都是适用的。6.(流应用程序) Streaming Applications
Spring Boot为创建DevOps友好的微服务应用程序提供了基础,同时Spring生态系统中的其他库也可帮助创建基于Stream的微服务应用程序。其中最重要的是Spring Cloud Stream6.1命令式编程模型(Imperative Programming Model)
SpringCloud Stream与Spring集成命令“一次性事件(event at a time)”编程模型最为紧密地结合在一起。这意味着你编写的是处理单个事件回调的代码,比如:

@EnableBinding(Sink.class)
public class LoggingSink {
@StreamListener(Sink.INPUT)
public void log(String message) {
System.out.println(message);
}
}


在这种情况下,来自输入通道的消息的字符串有效载荷被交给log方法
@EnableBinding注解是用来将输入通道绑定到外部中间件上6.2函数式编程模型(Functional Programming Model)
Spring Cloud Stream也可以支持其他的编程风格。将输入和输出数据作为连续数据流处理响应式API使用,并定义每个消息应如何处理。还可以使用描述从入站到出站数据流的功能转换的运算符。即将推出的版本将支持ApacheKafka的kstream API的编程模型。7.Streams7.1 拓扑
流DSL描述流经系统的数据的线性序列。例如,在流定义http |transformer| cassandra中每个管道将左右两侧的应用连接起来。命名通道可用于路由,并将数据分发到多个消息传递目的地。Taps可以用来监听流经管道的数据。Taps可以用来作为一个独立生命周期的新流的源。
7.2并发(currency)
对于将要使用事件的应用程序,Spring Cloud流暴露了一个并发控件,该控件设置用于调度传入消息的线程池的大小。请参阅消费者属性文档以获取更多信息。
7.3分区(Partitioning)
流处理中的一种常见模式是将数据从一个应用程序移动到下一个分区,分区是状态处理中的关键概念,无论是性能还是一致性原因,都是为了确保所有相关数据一起处理。例如,在时间窗(time-window)平均计算示例中,来自任何给定传感器的所有测量值都由相同的应用程序实例处理非常重要。或者你希望缓存一些传入事件的数据,以便在不进行远程过程调用的情况下对相关数据进行检索。
Spring Cloud Data Flow通过配置Spring Cloud Stream的输出和输入绑定来支持分区。Spring Cloud Stream为在不同类型的中间件上以统一的方式实现分区处理用例提供了一个公共抽象。因此无论节点本身是否是自然分区分区(如Kafka 的topic)或没有(Rabbit MQ),都可以被用来分区。下图显示了如何将数据划分为两个位桶(buckets)使得每一个均衡处理器实例都能够消费一个唯一的数据集合。
/uploads/fox/20152245_1.240
图2 Spring Cloud Stream分区  
在一个Spring Cloud数据流中使用简单分区策略,只需在流中部署每个应用程序的实例,并在部署流时设置partitionKeyExpression生产者属性。
 
//后续章节,待翻译

0 个评论

要回复文章请先登录注册