flink如何动态支持依赖jar包提交

        通常我们在编写一个flink的作业的时候,肯定会有依赖的jar包。flink官方希望你将所有的依赖和业务逻辑打成一个fat jar,这样方便提交,因为flink认为你应该对自己的业务逻辑做好单元测试,而不应该把这部分测试工作频繁提交到集群去做。但事实是我们往往不愿意打一个fat jar,我们希望将业务逻辑独立出来,依赖动态提交。可惜的是,flink并不支持这种提交模式。

        flink官方的文档中提供了-C这个选项,来支持提交classpath,我们当时以为这个会有作用,后来再研读源码和实际测试的情况看来,不行,-C不是这么用的。

-C,--classpath , Adds a URL to each user code classloader on all nodes in the cluster. The paths must specify a protocol (e.g. file://) and be accessible on all nodes (e.g. by means of a NFS share). You can use this option multiple times for specifying more than one URL. The protocol must be supported by the {@link

如上,是flink官方文档中对-C的解释,再加上对1.4.2版本源码以及1.5.0版本源码和1.6.0版本源码的研读,以及对cli的实际调用,总结如下:

1.此处的classpath的url必须是一个能够在client,JM和TM都被访问到的位置。

2.此位置从client端的提交到JM的分发到TM的访问的过程中,不会发生文件移动的动作,在1.4.2和1.5.0和1.6.0的版本中都是这样。

3.url支持的协议包括file,ftp,gopher,http,https,jar,mailto,netdoc,亦即java中URL类支持的协议类型。注意:不能放在hdfs上。

所以,如果要想使用-C这个选项,一般有两个做法:

1.手动将classpath中的位置在每个节点上进行部署。

2.使用共享存储,此共享存储可以被所有节点的角色访问。

那如何实现我们的要求了?

三个方案:

1.与-yt结合使用

原理:-yt是在yarnCluster模式下用来将本地jar提交到远端的参数,当指定了-yt的值后,客户端会将目录中的jar上传到hdfs中本应用的lib目录中,在tm下载之后,会存在于tm的classpath中。

优点:无需修改代码,结合-yt在创建cluster的时候先行上传依赖文件,在提交作业的时候,再指定-C选项即可。

缺点:

多个作业共享一个cluster,则此cluster需要包含所有的作业可能的依赖。
如果要替换一个依赖,则比较困难,需要重新建立集群
-yt命令虽然将依赖上传到了hdfs,但是-C命令还是需要将文件上传到client端即我们的agent端,操作比较繁杂。


2.改动PackageProgram将lib包放入其library属性中

原理:后续在构建jobGraph的过程中,以library为基准去设置userJar属性。

优点:改动的位置比较靠前,而且packageProgram感觉在将来改动的可能性还是有。

缺点:library是一个用到的地方比较多的属性,是否对其他地方的调用产生影响,需要进一步的研究。

3.改动ClusterClient中的getJobGraph方法,将lib包放入jobGraph的userJar属性中

原理:jobGraph的userJar是用来上传的属性,放入这里,lib包将会被上传到JM的BlobServer中。

优点:比较清晰,改动的影响可控可见,比较没有副作用。

缺点:改动的比较深,对于日后的升级等或许有一定影响。

 

根据我们自己的情况,我们选择了方案2,但在某种情况下,方案1虽然有点烦,但至少不用改源码,也是可以考虑的。

https://www.cnblogs.com/029zz010buct/p/9432264.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark和Flink都是大数据处理框架,它们的jar包依赖不同。Spark的依赖括Scala、Hadoop、Akka等,而Flink依赖括Scala、Hadoop、Netty等。在使用这些框架时,需要根据具体的需求选择相应的依赖,并将其添加到项目中。同时,还需要注意依赖的版本兼容性,以避免出现不兼容的情况。 ### 回答2: Spark和Flink都是流行的大数据处理框架,它们都支持在作业执行期间使用外部的jar包。 对于Spark,可以通过以下几种方式添加jar包依赖: 1. 通过命令行使用--jars参数来指定jar包的路径。例如:`spark-submit --class mainClassName --jars path/to/dependency.jar application.jar`。在这种方法中,所有的依赖jar包都会被自动分发到集群中的每个工作节点,供Spark作业使用。 2. 在代码中使用`SparkContext`的`addJar`方法来添加jar包依赖。例如:`sparkContext.addJar("path/to/dependency.jar")`。这个方法会将依赖jar包分发给集群中的每个工作节点,供Spark作业使用。 对于Flink,可以使用以下几种方式添加jar包依赖: 1. 在代码中通过`env.registerExternalLibrary`方法注册待使用的jar包。例如:`env.registerExternalLibrary("path/to/dependency.jar")`。这样注册后,Flink作业在提交和运行时会将依赖jar包自动分发到集群中。 2. 在Flink的作业配置文件中使用`pipeline.classpaths`属性来指定jar包的路径。例如:`pipeline.classpaths: ["path/to/dependency.jar"]`。Flink在运行作业时会将指定的jar包自动分发到集群中的每个任务运行实例。 以上是Spark和Flink添加jar包依赖的常用方法,通过这些方法可以将外部的jar包导入到框架的运行环境中,以供作业使用。 ### 回答3: Spark和Flink是两个常用的大数据处理框架,它们可以用来处理大规模数据集和流式数据。在使用这两个框架时,我们需要将项目打成一个可执行的jar包,并在提交任务时依赖所需的库文件。 对于Spark的jar包依赖,我们需要在构建项目时定义所需的依赖项,可以使用Maven或者其他构建工具来管理依赖关系。在pom.xml文件中添加相应的依赖项,例如Spark Core、Spark SQL、Spark Streaming等。在打项目时,构建工具会把这些依赖项打进生成的jar包中,以便在集群上执行时可以访问到这些依赖库。 对于Flinkjar包依赖,也需要在构建项目时定义相关的依赖项。与Spark类似,可以使用Maven或其他构建工具来管理依赖关系。在pom.xml文件中添加Flink的核心依赖以及其他需要使用的模块,如Flink SQL、Flink Streaming等。在打时,依赖项会被打到生成的jar包中,以便在集群中执行时可以访问到所需的依赖库。 在提交作业时,无论是Spark还是Flink,都需要指定相关的jar包路径,以告知框架要加载的依赖库。可以通过命令行参数或者在代码中设置相应的参数来指定依赖库的路径。框架会根据这些信息在集群中进行作业的执行,保证所需的依赖库可用。 总结来说,无论是Spark还是Flinkjar包依赖都需要在构建项目时定义,并在打时将依赖库打到生成的jar包中。在提交作业时,需要指定相关的依赖路径,以确保集群中可以加载到所需的依赖库。这样可以保证在分布式环境中使用Spark和Flink时,能够顺利地执行大数据处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值