[
https://issues.apache.org/jira/browse/FLINK-3192?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15081351#comment-15081351
]
ASF GitHub Bot commented on FLINK-3192:
---------------------------------------
Github user fhueske commented on a diff in the pull request:
https://github.com/apache/flink/pull/1477#discussion_r48751756
--- Diff:
flink-java/src/main/java/org/apache/flink/api/java/RemoteEnvironment.java ---
@@ -1,271 +1,287 @@
-/*
- * 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 org.apache.flink.api.java;
-
-import org.apache.flink.api.common.InvalidProgramException;
-import org.apache.flink.api.common.JobExecutionResult;
-import org.apache.flink.api.common.JobID;
-import org.apache.flink.api.common.Plan;
-import org.apache.flink.api.common.PlanExecutor;
-import org.apache.flink.configuration.Configuration;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-/**
- * An {@link ExecutionEnvironment} that sends programs to a cluster for
execution. The environment
- * needs to be created with the address and port of the JobManager of the
Flink cluster that
- * should execute the programs.
- *
- * <p>Many programs executed via the remote environment depend on
additional classes. Such classes
- * may be the classes of functions (transformation, aggregation, ...) or
libraries. Those classes
- * must be attached to the remote environment as JAR files, to allow the
environment to ship the
- * classes into the cluster for the distributed execution.
- */
-public class RemoteEnvironment extends ExecutionEnvironment {
-
- /** The hostname of the JobManager */
- protected final String host;
-
- /** The port of the JobManager main actor system */
- protected final int port;
-
- /** The jar files that need to be attached to each job */
- private final URL[] jarFiles;
-
- /** The configuration used by the client that connects to the cluster */
- private Configuration clientConfiguration;
-
- /** The remote executor lazily created upon first use */
- private PlanExecutor executor;
-
- /** Optional shutdown hook, used in session mode to eagerly terminate
the last session */
- private Thread shutdownHook;
-
- /** The classpaths that need to be attached to each job */
- private final URL[] globalClasspaths;
-
- /**
- * Creates a new RemoteEnvironment that points to the master
(JobManager) described by the
- * given host name and port.
- *
- * <p>Each program execution will have all the given JAR files in its
classpath.
- *
- * @param host The host name or address of the master (JobManager),
where the program should be executed.
- * @param port The port of the master (JobManager), where the program
should be executed.
- * @param jarFiles The JAR files with code that needs to be shipped to
the cluster. If the program uses
- * user-defined functions, user-defined input formats,
or any libraries, those must be
- * provided in the JAR files.
- */
- public RemoteEnvironment(String host, int port, String... jarFiles) {
- this(host, port, null, jarFiles, null);
- }
-
- /**
- * Creates a new RemoteEnvironment that points to the master
(JobManager) described by the
- * given host name and port.
- *
- * <p>Each program execution will have all the given JAR files in its
classpath.
- *
- * @param host The host name or address of the master (JobManager),
where the program should be executed.
- * @param port The port of the master (JobManager), where the program
should be executed.
- * @param clientConfig The configuration used by the client that
connects to the cluster.
- * @param jarFiles The JAR files with code that needs to be shipped to
the cluster. If the program uses
- * user-defined functions, user-defined input formats,
or any libraries, those must be
- * provided in the JAR files.
- */
- public RemoteEnvironment(String host, int port, Configuration
clientConfig, String[] jarFiles) {
- this(host, port, clientConfig, jarFiles, null);
- }
-
- /**
- * Creates a new RemoteEnvironment that points to the master
(JobManager) described by the
- * given host name and port.
- *
- * <p>Each program execution will have all the given JAR files in its
classpath.
- *
- * @param host The host name or address of the master (JobManager),
where the program should be executed.
- * @param port The port of the master (JobManager), where the program
should be executed.
- * @param clientConfig The configuration used by the client that
connects to the cluster.
- * @param jarFiles The JAR files with code that needs to be shipped to
the cluster. If the program uses
- * user-defined functions, user-defined input formats,
or any libraries, those must be
- * provided in the JAR files.
- * @param globalClasspaths The paths of directories and JAR files that
are added to each user code
- * classloader on all nodes in the cluster. Note that
the paths must specify a
- * protocol (e.g. file://) and be accessible on all
nodes (e.g. by means of a NFS share).
- * The protocol must be supported by the {@link
java.net.URLClassLoader}.
- */
- public RemoteEnvironment(String host, int port, Configuration
clientConfig,
- String[] jarFiles, URL[] globalClasspaths) {
- if (!ExecutionEnvironment.areExplicitEnvironmentsAllowed()) {
- throw new InvalidProgramException(
- "The RemoteEnvironment cannot be
instantiated when running in a pre-defined context " +
- "(such as Command Line
Client, Scala Shell, or TestEnvironment)");
- }
- if (host == null) {
- throw new NullPointerException("Host must not be
null.");
- }
- if (port < 1 || port >= 0xffff) {
- throw new IllegalArgumentException("Port out of range");
- }
-
- this.host = host;
- this.port = port;
- this.clientConfiguration = clientConfig == null ? new
Configuration() : clientConfig;
- if (jarFiles != null) {
- this.jarFiles = new URL[jarFiles.length];
- for (int i = 0; i < jarFiles.length; i++) {
- try {
- this.jarFiles[i] = new
File(jarFiles[i]).getAbsoluteFile().toURI().toURL();
- } catch (MalformedURLException e) {
- throw new IllegalArgumentException("JAR
file path invalid", e);
- }
- }
- }
- else {
- this.jarFiles = null;
- }
- this.globalClasspaths = globalClasspaths;
- }
-
- //
------------------------------------------------------------------------
-
- @Override
- public JobExecutionResult execute(String jobName) throws Exception {
- ensureExecutorCreated();
-
- Plan p = createProgramPlan(jobName);
-
- // Session management is disabled, revert this commit to enable
- //p.setJobId(jobID);
- //p.setSessionTimeout(sessionTimeout);
-
- JobExecutionResult result = executor.executePlan(p);
-
- this.lastJobExecutionResult = result;
- return result;
- }
-
- @Override
- public String getExecutionPlan() throws Exception {
- Plan p = createProgramPlan("plan", false);
-
- // make sure that we do not start an new executor here
- // if one runs, fine, of not, we create a local executor
(lightweight) and let it
- // generate the plan
- if (executor != null) {
- return executor.getOptimizerPlanAsJSON(p);
- }
- else {
- PlanExecutor le =
PlanExecutor.createLocalExecutor(null);
- return le.getOptimizerPlanAsJSON(p);
- }
- }
-
- @Override
- public void startNewSession() throws Exception {
- dispose();
- jobID = JobID.generate();
- installShutdownHook();
- }
-
- private void ensureExecutorCreated() throws Exception {
- if (executor == null) {
- executor = PlanExecutor.createRemoteExecutor(host,
port, clientConfiguration,
- jarFiles, globalClasspaths);
-
executor.setPrintStatusDuringExecution(getConfig().isSysoutLoggingEnabled());
- }
-
- // if we are using sessions, we keep the executor running
- if (getSessionTimeout() > 0 && !executor.isRunning()) {
- executor.start();
- installShutdownHook();
- }
- }
-
- //
------------------------------------------------------------------------
- // Dispose
- //
------------------------------------------------------------------------
-
- protected void dispose() {
- // Remove shutdown hook to prevent resource leaks, unless this
is invoked by the
- // shutdown hook itself
- if (shutdownHook != null && shutdownHook !=
Thread.currentThread()) {
- try {
-
Runtime.getRuntime().removeShutdownHook(shutdownHook);
- }
- catch (IllegalStateException e) {
- // race, JVM is in shutdown already, we can
safely ignore this
- }
- catch (Throwable t) {
- LOG.warn("Exception while unregistering the
cleanup shutdown hook.");
- }
- }
-
- try {
- PlanExecutor executor = this.executor;
- if (executor != null) {
- executor.endSession(jobID);
- executor.stop();
- }
- }
- catch (Exception e) {
- throw new RuntimeException("Failed to dispose the
session shutdown hook.");
- }
- }
-
- @Override
- public String toString() {
- return "Remote Environment (" + this.host + ":" + this.port + "
- parallelism = " +
- (getParallelism() == -1 ? "default" :
getParallelism()) + ") : " + getIdString();
- }
-
- //
------------------------------------------------------------------------
- // Shutdown hooks and reapers
- //
------------------------------------------------------------------------
-
- private void installShutdownHook() {
- if (shutdownHook == null) {
- Thread shutdownHook = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- dispose();
- }
- catch (Throwable t) {
- LOG.error("Error in cleanup of
RemoteEnvironment during JVM shutdown: " + t.getMessage(), t);
- }
- }
- });
-
- try {
- // Add JVM shutdown hook to call shutdown of
service
-
Runtime.getRuntime().addShutdownHook(shutdownHook);
- this.shutdownHook = shutdownHook;
- }
- catch (IllegalStateException e) {
- // JVM is already shutting down. no need or a
shutdown hook
- }
- catch (Throwable t) {
- LOG.error("Cannot register shutdown hook that
cleanly terminates the BLOB service.");
- }
- }
- }
-}
+/*
+ * 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 org.apache.flink.api.java;
+
+import org.apache.flink.api.common.InvalidProgramException;
+import org.apache.flink.api.common.JobExecutionResult;
+import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.Plan;
+import org.apache.flink.api.common.PlanExecutor;
+import org.apache.flink.configuration.Configuration;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * An {@link ExecutionEnvironment} that sends programs to a cluster for
execution. The environment
+ * needs to be created with the address and port of the JobManager of the
Flink cluster that
+ * should execute the programs.
+ *
+ * <p>Many programs executed via the remote environment depend on
additional classes. Such classes
+ * may be the classes of functions (transformation, aggregation, ...) or
libraries. Those classes
+ * must be attached to the remote environment as JAR files, to allow the
environment to ship the
+ * classes into the cluster for the distributed execution.
+ */
+public class RemoteEnvironment extends ExecutionEnvironment {
+
+ /** The hostname of the JobManager */
+ protected final String host;
+
+ /** The port of the JobManager main actor system */
+ protected final int port;
+
+ /** The jar files that need to be attached to each job */
+ private final URL[] jarFiles;
+
+ /** The configuration used by the client that connects to the cluster */
+ private Configuration clientConfiguration;
+
+ /** The remote executor lazily created upon first use */
+ private PlanExecutor executor;
+
+ /** Optional shutdown hook, used in session mode to eagerly terminate
the last session */
+ private Thread shutdownHook;
+
+ /** The classpaths that need to be attached to each job */
+ private final URL[] globalClasspaths;
+
+ /**
+ * Creates a new RemoteEnvironment that points to the master
(JobManager) described by the
+ * given host name and port.
+ *
+ * <p>Each program execution will have all the given JAR files in its
classpath.
+ *
+ * @param host The host name or address of the master (JobManager),
where the program should be executed.
+ * @param port The port of the master (JobManager), where the program
should be executed.
+ * @param jarFiles The JAR files with code that needs to be shipped to
the cluster. If the program uses
+ * user-defined functions, user-defined input formats,
or any libraries, those must be
+ * provided in the JAR files.
+ */
+ public RemoteEnvironment(String host, int port, String... jarFiles) {
+ this(host, port, null, jarFiles, null);
+ }
+
+ /**
+ * Creates a new RemoteEnvironment that points to the master
(JobManager) described by the
+ * given host name and port.
+ *
+ * <p>Each program execution will have all the given JAR files in its
classpath.
+ *
+ * @param host The host name or address of the master (JobManager),
where the program should be executed.
+ * @param port The port of the master (JobManager), where the program
should be executed.
+ * @param clientConfig The configuration used by the client that
connects to the cluster.
+ * @param jarFiles The JAR files with code that needs to be shipped to
the cluster. If the program uses
+ * user-defined functions, user-defined input formats,
or any libraries, those must be
+ * provided in the JAR files.
+ */
+ public RemoteEnvironment(String host, int port, Configuration
clientConfig, String[] jarFiles) {
+ this(host, port, clientConfig, jarFiles, null);
+ }
+
+ /**
+ * Creates a new RemoteEnvironment that points to the master
(JobManager) described by the
+ * given host name and port.
+ *
+ * <p>Each program execution will have all the given JAR files in its
classpath.
+ *
+ * @param host The host name or address of the master (JobManager),
where the program should be executed.
+ * @param port The port of the master (JobManager), where the program
should be executed.
+ * @param clientConfig The configuration used by the client that
connects to the cluster.
+ * @param jarFiles The JAR files with code that needs to be shipped to
the cluster. If the program uses
+ * user-defined functions, user-defined input formats,
or any libraries, those must be
+ * provided in the JAR files.
+ * @param globalClasspaths The paths of directories and JAR files that
are added to each user code
+ * classloader on all nodes in the cluster. Note that
the paths must specify a
+ * protocol (e.g. file://) and be accessible on all
nodes (e.g. by means of a NFS share).
+ * The protocol must be supported by the {@link
java.net.URLClassLoader}.
+ */
+ public RemoteEnvironment(String host, int port, Configuration
clientConfig,
+ String[] jarFiles, URL[] globalClasspaths) {
+ if (!ExecutionEnvironment.areExplicitEnvironmentsAllowed()) {
+ throw new InvalidProgramException(
+ "The RemoteEnvironment cannot be
instantiated when running in a pre-defined context " +
+ "(such as Command Line
Client, Scala Shell, or TestEnvironment)");
+ }
+ if (host == null) {
+ throw new NullPointerException("Host must not be
null.");
+ }
+ if (port < 1 || port >= 0xffff) {
+ throw new IllegalArgumentException("Port out of range");
+ }
+
+ this.host = host;
+ this.port = port;
+ this.clientConfiguration = clientConfig == null ? new
Configuration() : clientConfig;
+ if (jarFiles != null) {
+ this.jarFiles = new URL[jarFiles.length];
+ for (int i = 0; i < jarFiles.length; i++) {
+ try {
+ this.jarFiles[i] = new
File(jarFiles[i]).getAbsoluteFile().toURI().toURL();
+ } catch (MalformedURLException e) {
+ throw new IllegalArgumentException("JAR
file path invalid", e);
+ }
+ }
+ }
+ else {
+ this.jarFiles = null;
+ }
+ this.globalClasspaths = globalClasspaths;
+ }
+
+ //
------------------------------------------------------------------------
+
+ @Override
+ public JobExecutionResult execute(String jobName) throws Exception {
+ ensureExecutorCreated();
+
+ Plan p = createProgramPlan(jobName);
+
+ // Session management is disabled, revert this commit to enable
+ //p.setJobId(jobID);
+ //p.setSessionTimeout(sessionTimeout);
+
+ JobExecutionResult result = executor.executePlan(p);
+
+ this.lastJobExecutionResult = result;
+ return result;
+ }
+
+ @Override
+ public String getExecutionPlan() throws Exception {
+ Plan p = createProgramPlan("plan", false);
+
+ // make sure that we do not start an new executor here
+ // if one runs, fine, or not, we create a local executor
(lightweight) and let it
+ // generate the plan
+ if (executor != null) {
+ return executor.getOptimizerPlanAsJSON(p);
+ }
+ else {
+ PlanExecutor le =
PlanExecutor.createLocalExecutor(null);
+ return le.getOptimizerPlanAsJSON(p);
+ }
+ }
+
+ @Override
+ public String getSqlExecutionPlan(boolean extended) throws Exception {
--- End diff --
I think you added only this method.
Can you check why the whole file is marked as changed and revert unrelated
changes?
> Add explain support to print ast and sql physical execution plan.
> ------------------------------------------------------------------
>
> Key: FLINK-3192
> URL: https://issues.apache.org/jira/browse/FLINK-3192
> Project: Flink
> Issue Type: New Feature
> Components: Table API
> Reporter: GaoLun
> Assignee: GaoLun
> Priority: Minor
> Labels: features
>
> Table API doesn't support sql-explanation now. Add the explain support to
> print ast (abstract syntax tree) and the physical execution plan of sql.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)