2323import com .qlangtech .tis .coredefine .module .action .TargetResName ;
2424import com .qlangtech .tis .manage .common .incr .StreamContextConstant .TISRes ;
2525import com .qlangtech .tis .manage .common .incr .UberJarUtil ;
26+ import org .apache .flink .client .cli .ArtifactFetchOptions ;
2627import org .apache .flink .client .deployment .application .ApplicationClusterEntryPoint ;
2728import org .apache .flink .client .deployment .application .ApplicationConfiguration ;
28- import org .apache .flink .client .deployment . application . ClassPathPackagedProgramRetriever ;
29+ import org .apache .flink .client .program . DefaultPackagedProgramRetriever ;
2930import org .apache .flink .client .program .PackagedProgram ;
3031import org .apache .flink .client .program .PackagedProgramRetriever ;
3132import org .apache .flink .client .program .PackagedProgramUtils ;
33+ import org .apache .flink .client .program .artifact .ArtifactFetchManager ;
3234import org .apache .flink .configuration .Configuration ;
3335import org .apache .flink .configuration .PipelineOptions ;
34- import org .apache .flink .kubernetes .utils .KubernetesUtils ;
36+ import org .apache .flink .core .fs .FileSystem ;
37+ import org .apache .flink .core .plugin .PluginManager ;
38+ import org .apache .flink .core .plugin .PluginUtils ;
39+ import org .apache .flink .kubernetes .configuration .KubernetesConfigOptions ;
3540import org .apache .flink .runtime .entrypoint .ClusterEntrypoint ;
3641import org .apache .flink .runtime .entrypoint .ClusterEntrypointUtils ;
3742import org .apache .flink .runtime .entrypoint .DynamicParametersConfigurationParserFactory ;
43+ import org .apache .flink .runtime .security .contexts .SecurityContext ;
44+ import org .apache .flink .runtime .util .EnvironmentInformation ;
45+ import org .apache .flink .runtime .util .JvmShutdownSafeguard ;
46+ import org .apache .flink .runtime .util .SignalHandler ;
3847import org .apache .flink .util .FlinkException ;
39- import org .apache .flink .util .Preconditions ;
4048import org .slf4j .Logger ;
4149import org .slf4j .LoggerFactory ;
4250
51+ import javax .annotation .Nullable ;
4352import java .io .File ;
44- import java .io .IOException ;
4553import java .net .URL ;
54+ import java .util .Collections ;
4655import java .util .List ;
4756import java .util .Objects ;
4857
58+ import static org .apache .flink .util .Preconditions .checkArgument ;
59+
4960/**
5061 * 当客户端选择使用 kerbernetes-application 部署方式的时候,在flink-jobManager 端服务组装构建jobGraph实例,需要从TIS-console端拉取 同步任务对应的jar包到本地
5162 *
@@ -64,12 +75,16 @@ private KubernetesApplicationClusterEntrypointOfTIS(Configuration configuration,
6475
6576 public static void main (final String [] args ) {
6677 // startup checks and logging
78+ EnvironmentInformation .logEnvironmentInfo (
79+ LOG , KubernetesApplicationClusterEntrypoint .class .getSimpleName (), args );
80+ SignalHandler .register (LOG );
81+ JvmShutdownSafeguard .installAsShutdownHook (LOG );
6782
6883 final Configuration dynamicParameters =
6984 ClusterEntrypointUtils .parseParametersOrExit (
7085 args ,
7186 new DynamicParametersConfigurationParserFactory (),
72- KubernetesApplicationClusterEntrypointOfTIS .class );
87+ KubernetesApplicationClusterEntrypoint .class );
7388 final Configuration configuration =
7489 KubernetesEntrypointUtils .loadConfiguration (dynamicParameters );
7590
@@ -80,28 +95,33 @@ public static void main(final String[] args) {
8095 break ;
8196 }
8297 Objects .requireNonNull (targetResName , "targetResName can not be null" );
98+
8399 PackagedProgram program = null ;
84100 try {
85- // baisui modify 2024/1/8
86- // 下载最新的jar包
87- // PluginMeta flinkPluginMeta = TISFlinkClassLoaderFactory.getFlinkPluginMeta(targetResName);
88- // flinkPluginMeta.copyFromRemote();
101+
89102 TISRes unberJarFile = UberJarUtil .getStreamUberJarFile (targetResName );
90103 unberJarFile .sync2Local (true );
91104 String unberJarURL = "local" + String .valueOf (unberJarFile .getFile ().toURI ().toURL ()).substring ("file" .length ());
92105 logger .info ("TIS unberJarURL:{}" , unberJarURL );
93106 TISFlinkClassLoaderFactory .synAppRelevantCfgsAndTpis (new URL []{unberJarFile .getFile ().toURI ().toURL ()});
94107 configuration .set (PipelineOptions .JARS , Lists .newArrayList (unberJarURL ));
95- program = getPackagedProgram (configuration );
108+
109+ PluginManager pluginManager =
110+ PluginUtils .createPluginManagerFromRootFolder (configuration );
111+ LOG .info (
112+ "Install default filesystem for fetching user artifacts in Kubernetes Application Mode." );
113+ FileSystem .initialize (configuration , pluginManager );
114+ SecurityContext securityContext = installSecurityContext (configuration );
115+ program = securityContext .runSecured (() -> getPackagedProgram (configuration ));
96116 } catch (Exception e ) {
97- logger .error ("Could not create application program." , e );
117+ LOG .error ("Could not create application program." , e );
98118 System .exit (1 );
99119 }
100120
101121 try {
102122 configureExecution (configuration , program );
103123 } catch (Exception e ) {
104- logger .error ("Could not apply application configuration." , e );
124+ LOG .error ("Could not apply application configuration." , e );
105125 System .exit (1 );
106126 }
107127
@@ -112,7 +132,7 @@ public static void main(final String[] args) {
112132 }
113133
114134 private static PackagedProgram getPackagedProgram (final Configuration configuration )
115- throws IOException , FlinkException {
135+ throws FlinkException {
116136
117137 final ApplicationConfiguration applicationConfiguration =
118138 ApplicationConfiguration .fromConfiguration (configuration );
@@ -128,24 +148,53 @@ private static PackagedProgram getPackagedProgram(final Configuration configurat
128148 private static PackagedProgramRetriever getPackagedProgramRetriever (
129149 final Configuration configuration ,
130150 final String [] programArguments ,
131- final String jobClassName )
132- throws IOException {
151+ @ Nullable final String jobClassName )
152+ throws FlinkException {
133153
134154 final File userLibDir = ClusterEntrypointUtils .tryFindUserLibDirectory ().orElse (null );
135- final ClassPathPackagedProgramRetriever .Builder retrieverBuilder =
136- ClassPathPackagedProgramRetriever .newBuilder (programArguments )
137- .setUserLibDirectory (userLibDir )
138- .setJobClassName (jobClassName );
139155
140156 // No need to do pipelineJars validation if it is a PyFlink job.
141157 if (!(PackagedProgramUtils .isPython (jobClassName )
142158 || PackagedProgramUtils .isPython (programArguments ))) {
143- final List <File > pipelineJars =
144- KubernetesUtils .checkJarFileForApplicationMode (configuration );
145- Preconditions .checkArgument (pipelineJars .size () == 1 , "Should only have one jar" );
146- retrieverBuilder .setJarFile (pipelineJars .get (0 ));
159+ final ArtifactFetchManager .Result fetchRes = fetchArtifacts (configuration );
160+
161+ return DefaultPackagedProgramRetriever .create (
162+ userLibDir ,
163+ fetchRes .getJobJar (),
164+ fetchRes .getArtifacts (),
165+ jobClassName ,
166+ programArguments ,
167+ configuration );
168+ }
169+
170+ return DefaultPackagedProgramRetriever .create (
171+ userLibDir , jobClassName , programArguments , configuration );
172+ }
173+
174+ private static ArtifactFetchManager .Result fetchArtifacts (Configuration configuration ) {
175+ try {
176+ String targetDir = generateJarDir (configuration );
177+ ArtifactFetchManager fetchMgr = new ArtifactFetchManager (configuration , targetDir );
178+
179+ List <String > uris = configuration .get (PipelineOptions .JARS );
180+ checkArgument (uris .size () == 1 , "Should only have one jar" );
181+ List <String > additionalUris =
182+ configuration
183+ .getOptional (ArtifactFetchOptions .ARTIFACT_LIST )
184+ .orElse (Collections .emptyList ());
185+
186+ return fetchMgr .fetchArtifacts (uris .get (0 ), additionalUris );
187+ } catch (Exception e ) {
188+ throw new RuntimeException (e );
147189 }
148- return retrieverBuilder .build ();
190+ }
191+
192+ static String generateJarDir (Configuration configuration ) {
193+ return String .join (
194+ File .separator ,
195+ new File (configuration .get (ArtifactFetchOptions .BASE_DIR )).getAbsolutePath (),
196+ configuration .get (KubernetesConfigOptions .NAMESPACE ),
197+ configuration .get (KubernetesConfigOptions .CLUSTER_ID ));
149198 }
150199
151200
0 commit comments