mirror of https://github.com/apache/nifi.git
NIFI-4683 This closes #2339. added a few missing license/notice entries for spark controller service and processor nars, removed dead code, cleaned up logging. This sign off is relevant to commit 52684c3ec3b7c0ee28c6cf64cfd178976996615a
Signed-off-by: joewitt <joewitt@apache.org>
This commit is contained in:
parent
2192138b06
commit
a12abc24e5
|
@ -207,3 +207,51 @@ The Apache NiFi project contains subcomponents with separate copyright
|
||||||
notices and license terms. Your use of the source code for the these
|
notices and license terms. Your use of the source code for the these
|
||||||
subcomponents is subject to the terms and conditions of the following
|
subcomponents is subject to the terms and conditions of the following
|
||||||
licenses.
|
licenses.
|
||||||
|
|
||||||
|
The binary distribution of this product bundles 'Bouncy Castle JDK 1.5'
|
||||||
|
under an MIT style license.
|
||||||
|
|
||||||
|
Copyright (c) 2000 - 2015 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
The binary distribution of this product bundles 'Slf4j' which is available under
|
||||||
|
an MIT license.
|
||||||
|
|
||||||
|
Copyright (c) 2004-2013 QOS.ch
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -45,3 +45,25 @@ The following binary components are provided under the Apache Software License v
|
||||||
Apache Commons IO
|
Apache Commons IO
|
||||||
Copyright 2002-2016 The Apache Software Foundation
|
Copyright 2002-2016 The Apache Software Foundation
|
||||||
|
|
||||||
|
(ASLv2) Jackson JSON processor
|
||||||
|
The following NOTICE information applies:
|
||||||
|
# Jackson JSON processor
|
||||||
|
|
||||||
|
Jackson is a high-performance, Free/Open Source JSON processing library.
|
||||||
|
It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
|
||||||
|
been in development since 2007.
|
||||||
|
It is currently developed by a community of developers, as well as supported
|
||||||
|
commercially by FasterXML.com.
|
||||||
|
|
||||||
|
## Licensing
|
||||||
|
|
||||||
|
Jackson core and extension components may licensed under different licenses.
|
||||||
|
To find the details that apply to this artifact see the accompanying LICENSE file.
|
||||||
|
For more information, including possible other licensing options, contact
|
||||||
|
FasterXML.com (http://fasterxml.com).
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
A list of contributors may be found from CREDITS file, which is included
|
||||||
|
in some artifacts (usually source distributions); but is always available
|
||||||
|
from the source code management (SCM) system project uses.
|
||||||
|
|
|
@ -58,7 +58,6 @@ import org.apache.nifi.processor.exception.ProcessException;
|
||||||
import org.apache.nifi.processor.util.StandardValidators;
|
import org.apache.nifi.processor.util.StandardValidators;
|
||||||
import org.apache.nifi.ssl.SSLContextService;
|
import org.apache.nifi.ssl.SSLContextService;
|
||||||
import org.codehaus.jackson.map.ObjectMapper;
|
import org.codehaus.jackson.map.ObjectMapper;
|
||||||
import org.codehaus.jettison.json.JSONArray;
|
|
||||||
import org.codehaus.jettison.json.JSONException;
|
import org.codehaus.jettison.json.JSONException;
|
||||||
import org.codehaus.jettison.json.JSONObject;
|
import org.codehaus.jettison.json.JSONObject;
|
||||||
|
|
||||||
|
@ -194,7 +193,6 @@ public class LivySessionController extends AbstractControllerService implements
|
||||||
@OnEnabled
|
@OnEnabled
|
||||||
public void onConfigured(final ConfigurationContext context) {
|
public void onConfigured(final ConfigurationContext context) {
|
||||||
ComponentLog log = getLogger();
|
ComponentLog log = getLogger();
|
||||||
log.info("********** Starting Livy Session Controller Service...");
|
|
||||||
|
|
||||||
final String livyHost = context.getProperty(LIVY_HOST).evaluateAttributeExpressions().getValue();
|
final String livyHost = context.getProperty(LIVY_HOST).evaluateAttributeExpressions().getValue();
|
||||||
final String livyPort = context.getProperty(LIVY_PORT).evaluateAttributeExpressions().getValue();
|
final String livyPort = context.getProperty(LIVY_PORT).evaluateAttributeExpressions().getValue();
|
||||||
|
@ -220,9 +218,7 @@ public class LivySessionController extends AbstractControllerService implements
|
||||||
manageSessions();
|
manageSessions();
|
||||||
Thread.sleep(sessionManagerStatusInterval);
|
Thread.sleep(sessionManagerStatusInterval);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
Thread.currentThread().interrupt();
|
||||||
log.debug("********** " + Thread.currentThread().getName()
|
|
||||||
+ " run() Interrupt Status: " + Thread.currentThread().isInterrupted());
|
|
||||||
enabled = false;
|
enabled = false;
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
throw new ProcessException(ioe);
|
throw new ProcessException(ioe);
|
||||||
|
@ -237,15 +233,16 @@ public class LivySessionController extends AbstractControllerService implements
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
ComponentLog log = getLogger();
|
ComponentLog log = getLogger();
|
||||||
try {
|
try {
|
||||||
log.info("********** Starting Livy Session Controller Service...");
|
|
||||||
enabled = false;
|
enabled = false;
|
||||||
livySessionManagerThread.interrupt();
|
livySessionManagerThread.interrupt();
|
||||||
livySessionManagerThread.join();
|
livySessionManagerThread.join();
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
log.error("Livy Session Manager Thread interrupted");
|
log.error("Livy Session Manager Thread interrupted");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Map<String, String> getSession() {
|
public Map<String, String> getSession() {
|
||||||
Map<String, String> sessionMap = new HashMap<>();
|
Map<String, String> sessionMap = new HashMap<>();
|
||||||
try {
|
try {
|
||||||
|
@ -265,6 +262,7 @@ public class LivySessionController extends AbstractControllerService implements
|
||||||
return sessionMap;
|
return sessionMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public HttpURLConnection getConnection(String urlString) throws IOException {
|
public HttpURLConnection getConnection(String urlString) throws IOException {
|
||||||
URL url = new URL(urlString);
|
URL url = new URL(urlString);
|
||||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||||
|
@ -288,16 +286,16 @@ public class LivySessionController extends AbstractControllerService implements
|
||||||
try {
|
try {
|
||||||
sessionsInfo = listSessions();
|
sessionsInfo = listSessions();
|
||||||
if (sessions.isEmpty()) {
|
if (sessions.isEmpty()) {
|
||||||
log.debug("********** manageSessions() the active session list is empty, populating from acquired list...");
|
log.debug("manageSessions() the active session list is empty, populating from acquired list...");
|
||||||
sessions.putAll(sessionsInfo);
|
sessions.putAll(sessionsInfo);
|
||||||
}
|
}
|
||||||
for (Integer sessionId : new ArrayList<>(sessions.keySet())) {
|
for (Integer sessionId : new ArrayList<>(sessions.keySet())) {
|
||||||
JSONObject currentSession = sessions.get(sessionId);
|
JSONObject currentSession = sessions.get(sessionId);
|
||||||
log.debug("********** manageSessions() Updating current session: " + currentSession);
|
log.debug("manageSessions() Updating current session: " + currentSession);
|
||||||
if (sessionsInfo.containsKey(sessionId)) {
|
if (sessionsInfo.containsKey(sessionId)) {
|
||||||
String state = currentSession.getString("state");
|
String state = currentSession.getString("state");
|
||||||
String sessionKind = currentSession.getString("kind");
|
String sessionKind = currentSession.getString("kind");
|
||||||
log.debug("********** manageSessions() controller kind: {}, session kind: {}, session state: {}",
|
log.debug("manageSessions() controller kind: {}, session kind: {}, session state: {}",
|
||||||
new Object[]{controllerKind, sessionKind, state});
|
new Object[]{controllerKind, sessionKind, state});
|
||||||
if (state.equalsIgnoreCase("idle") && sessionKind.equalsIgnoreCase(controllerKind)) {
|
if (state.equalsIgnoreCase("idle") && sessionKind.equalsIgnoreCase(controllerKind)) {
|
||||||
// Keep track of how many sessions are in an idle state and thus available
|
// Keep track of how many sessions are in an idle state and thus available
|
||||||
|
@ -319,36 +317,36 @@ public class LivySessionController extends AbstractControllerService implements
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Prune sessions that no longer exist
|
// Prune sessions that no longer exist
|
||||||
log.debug("********** manageSessions() session exists in session pool but not in source snapshot, removing from pool...");
|
log.debug("manageSessions() session exists in session pool but not in source snapshot, removing from pool...");
|
||||||
sessions.remove(sessionId);
|
sessions.remove(sessionId);
|
||||||
// Remove session from session list source of truth snapshot since it has been dealt with
|
// Remove session from session list source of truth snapshot since it has been dealt with
|
||||||
sessionsInfo.remove(sessionId);
|
sessionsInfo.remove(sessionId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int numSessions = sessions.size();
|
int numSessions = sessions.size();
|
||||||
log.debug("********** manageSessions() There are " + numSessions + " sessions in the pool");
|
log.debug("manageSessions() There are " + numSessions + " sessions in the pool");
|
||||||
// Open new sessions equal to the number requested by sessionPoolSize
|
// Open new sessions equal to the number requested by sessionPoolSize
|
||||||
if (numSessions == 0) {
|
if (numSessions == 0) {
|
||||||
for (int i = 0; i < sessionPoolSize; i++) {
|
for (int i = 0; i < sessionPoolSize; i++) {
|
||||||
newSessionInfo = openSession();
|
newSessionInfo = openSession();
|
||||||
sessions.put(newSessionInfo.getInt("id"), newSessionInfo);
|
sessions.put(newSessionInfo.getInt("id"), newSessionInfo);
|
||||||
log.debug("********** manageSessions() Registered new session: " + newSessionInfo);
|
log.debug("manageSessions() Registered new session: " + newSessionInfo);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Open one new session if there are no idle sessions
|
// Open one new session if there are no idle sessions
|
||||||
if (idleSessions == 0) {
|
if (idleSessions == 0) {
|
||||||
log.debug("********** manageSessions() There are " + numSessions + " sessions in the pool but none of them are idle sessions, creating...");
|
log.debug("manageSessions() There are " + numSessions + " sessions in the pool but none of them are idle sessions, creating...");
|
||||||
newSessionInfo = openSession();
|
newSessionInfo = openSession();
|
||||||
sessions.put(newSessionInfo.getInt("id"), newSessionInfo);
|
sessions.put(newSessionInfo.getInt("id"), newSessionInfo);
|
||||||
log.debug("********** manageSessions() Registered new session: " + newSessionInfo);
|
log.debug("manageSessions() Registered new session: " + newSessionInfo);
|
||||||
}
|
}
|
||||||
// Open more sessions if number of sessions is less than target pool size
|
// Open more sessions if number of sessions is less than target pool size
|
||||||
if (numSessions < sessionPoolSize) {
|
if (numSessions < sessionPoolSize) {
|
||||||
log.debug("********** manageSessions() There are " + numSessions + ", need more sessions to equal requested pool size of " + sessionPoolSize + ", creating...");
|
log.debug("manageSessions() There are " + numSessions + ", need more sessions to equal requested pool size of " + sessionPoolSize + ", creating...");
|
||||||
for (int i = 0; i < sessionPoolSize - numSessions; i++) {
|
for (int i = 0; i < sessionPoolSize - numSessions; i++) {
|
||||||
newSessionInfo = openSession();
|
newSessionInfo = openSession();
|
||||||
sessions.put(newSessionInfo.getInt("id"), newSessionInfo);
|
sessions.put(newSessionInfo.getInt("id"), newSessionInfo);
|
||||||
log.debug("********** manageSessions() Registered new session: " + newSessionInfo);
|
log.debug("manageSessions() Registered new session: " + newSessionInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -423,7 +421,7 @@ public class LivySessionController extends AbstractControllerService implements
|
||||||
}
|
}
|
||||||
|
|
||||||
payload.append("}");
|
payload.append("}");
|
||||||
log.debug("********** openSession() Session Payload: " + payload.toString());
|
log.debug("openSession() Session Payload: " + payload.toString());
|
||||||
Map<String, String> headers = new HashMap<>();
|
Map<String, String> headers = new HashMap<>();
|
||||||
headers.put("Content-Type", APPLICATION_JSON);
|
headers.put("Content-Type", APPLICATION_JSON);
|
||||||
headers.put("X-Requested-By", USER);
|
headers.put("X-Requested-By", USER);
|
||||||
|
@ -431,9 +429,9 @@ public class LivySessionController extends AbstractControllerService implements
|
||||||
newSessionInfo = readJSONObjectFromUrlPOST(sessionsUrl, headers, payload.toString());
|
newSessionInfo = readJSONObjectFromUrlPOST(sessionsUrl, headers, payload.toString());
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
while (newSessionInfo.getString("state").equalsIgnoreCase("starting")) {
|
while (newSessionInfo.getString("state").equalsIgnoreCase("starting")) {
|
||||||
log.debug("********** openSession() Waiting for session to start...");
|
log.debug("openSession() Waiting for session to start...");
|
||||||
newSessionInfo = getSessionInfo(newSessionInfo.getInt("id"));
|
newSessionInfo = getSessionInfo(newSessionInfo.getInt("id"));
|
||||||
log.debug("********** openSession() newSessionInfo: " + newSessionInfo);
|
log.debug("openSession() newSessionInfo: " + newSessionInfo);
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -463,28 +461,6 @@ public class LivySessionController extends AbstractControllerService implements
|
||||||
return readAllIntoJSONObject(content);
|
return readAllIntoJSONObject(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
private JSONArray readJSONArrayFromUrlPOST(String urlString, Map<String, String> headers, String payload) throws IOException, JSONException {
|
|
||||||
URL url = new URL(urlString);
|
|
||||||
HttpURLConnection connection = getConnection(urlString);
|
|
||||||
connection.setRequestMethod(POST);
|
|
||||||
connection.setDoOutput(true);
|
|
||||||
|
|
||||||
for (Map.Entry<String, String> entry : headers.entrySet()) {
|
|
||||||
connection.setRequestProperty(entry.getKey(), entry.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
OutputStream os = connection.getOutputStream();
|
|
||||||
os.write(payload.getBytes());
|
|
||||||
os.flush();
|
|
||||||
|
|
||||||
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK && connection.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
|
|
||||||
throw new RuntimeException("Failed : HTTP error code : " + connection.getResponseCode() + " : " + connection.getResponseMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
InputStream content = connection.getInputStream();
|
|
||||||
return readAllIntoJSONArray(content);
|
|
||||||
}
|
|
||||||
|
|
||||||
private JSONObject readJSONFromUrl(String urlString, Map<String, String> headers) throws IOException, JSONException {
|
private JSONObject readJSONFromUrl(String urlString, Map<String, String> headers) throws IOException, JSONException {
|
||||||
|
|
||||||
HttpURLConnection connection = getConnection(urlString);
|
HttpURLConnection connection = getConnection(urlString);
|
||||||
|
@ -497,29 +473,12 @@ public class LivySessionController extends AbstractControllerService implements
|
||||||
return readAllIntoJSONObject(content);
|
return readAllIntoJSONObject(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
private JSONArray readJSONArrayFromUrl(String urlString, Map<String, String> headers) throws IOException, JSONException {
|
|
||||||
HttpURLConnection connection = getConnection(urlString);
|
|
||||||
for (Map.Entry<String, String> entry : headers.entrySet()) {
|
|
||||||
connection.setRequestProperty(entry.getKey(), entry.getValue());
|
|
||||||
}
|
|
||||||
connection.setRequestMethod(GET);
|
|
||||||
connection.setDoOutput(true);
|
|
||||||
InputStream content = connection.getInputStream();
|
|
||||||
return readAllIntoJSONArray(content);
|
|
||||||
}
|
|
||||||
|
|
||||||
private JSONObject readAllIntoJSONObject(InputStream content) throws IOException, JSONException {
|
private JSONObject readAllIntoJSONObject(InputStream content) throws IOException, JSONException {
|
||||||
BufferedReader rd = new BufferedReader(new InputStreamReader(content, StandardCharsets.UTF_8));
|
BufferedReader rd = new BufferedReader(new InputStreamReader(content, StandardCharsets.UTF_8));
|
||||||
String jsonText = IOUtils.toString(rd);
|
String jsonText = IOUtils.toString(rd);
|
||||||
return new JSONObject(jsonText);
|
return new JSONObject(jsonText);
|
||||||
}
|
}
|
||||||
|
|
||||||
private JSONArray readAllIntoJSONArray(InputStream content) throws IOException, JSONException {
|
|
||||||
BufferedReader rd = new BufferedReader(new InputStreamReader(content, StandardCharsets.UTF_8));
|
|
||||||
String jsonText = IOUtils.toString(rd);
|
|
||||||
return new JSONArray(jsonText);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setSslSocketFactory(HttpsURLConnection httpsURLConnection, SSLContextService sslService, SSLContext sslContext)
|
private void setSslSocketFactory(HttpsURLConnection httpsURLConnection, SSLContextService sslService, SSLContext sslContext)
|
||||||
throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {
|
throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {
|
||||||
final String keystoreLocation = sslService.getKeyStoreFile();
|
final String keystoreLocation = sslService.getKeyStoreFile();
|
||||||
|
|
|
@ -207,3 +207,51 @@ The Apache NiFi project contains subcomponents with separate copyright
|
||||||
notices and license terms. Your use of the source code for the these
|
notices and license terms. Your use of the source code for the these
|
||||||
subcomponents is subject to the terms and conditions of the following
|
subcomponents is subject to the terms and conditions of the following
|
||||||
licenses.
|
licenses.
|
||||||
|
|
||||||
|
The binary distribution of this product bundles 'Bouncy Castle JDK 1.5'
|
||||||
|
under an MIT style license.
|
||||||
|
|
||||||
|
Copyright (c) 2000 - 2015 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
The binary distribution of this product bundles 'Slf4j' which is available under
|
||||||
|
an MIT license.
|
||||||
|
|
||||||
|
Copyright (c) 2004-2013 QOS.ch
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -53,3 +53,37 @@ The following binary components are provided under the Apache Software License v
|
||||||
Apache Commons IO
|
Apache Commons IO
|
||||||
Copyright 2002-2016 The Apache Software Foundation
|
Copyright 2002-2016 The Apache Software Foundation
|
||||||
|
|
||||||
|
(ASLv2) Jackson JSON processor
|
||||||
|
The following NOTICE information applies:
|
||||||
|
# Jackson JSON processor
|
||||||
|
|
||||||
|
Jackson is a high-performance, Free/Open Source JSON processing library.
|
||||||
|
It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
|
||||||
|
been in development since 2007.
|
||||||
|
It is currently developed by a community of developers, as well as supported
|
||||||
|
commercially by FasterXML.com.
|
||||||
|
|
||||||
|
## Licensing
|
||||||
|
|
||||||
|
Jackson core and extension components may licensed under different licenses.
|
||||||
|
To find the details that apply to this artifact see the accompanying LICENSE file.
|
||||||
|
For more information, including possible other licensing options, contact
|
||||||
|
FasterXML.com (http://fasterxml.com).
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
A list of contributors may be found from CREDITS file, which is included
|
||||||
|
in some artifacts (usually source distributions); but is always available
|
||||||
|
from the source code management (SCM) system project uses.
|
||||||
|
|
||||||
|
(ASLv2) Jettison
|
||||||
|
The following NOTICE information applies:
|
||||||
|
Copyright 2006 Envoi Solutions LLC
|
||||||
|
|
||||||
|
************************
|
||||||
|
Common Development and Distribution License 1.0
|
||||||
|
************************
|
||||||
|
|
||||||
|
The following binary components are provided under the Common Development and Distribution License 1.0. See project link for details.
|
||||||
|
|
||||||
|
(CDDL 1.0) (GPL3) Streaming API For XML (javax.xml.stream:stax-api:jar:1.0-1 - no url provided)
|
||||||
|
|
|
@ -84,7 +84,8 @@ public class ExecuteSparkInteractive extends AbstractProcessor {
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Points to the charset name corresponding to the incoming flow file's encoding.
|
* Points to the charset name corresponding to the incoming flow file's
|
||||||
|
* encoding.
|
||||||
*/
|
*/
|
||||||
public static final PropertyDescriptor CHARSET = new PropertyDescriptor.Builder()
|
public static final PropertyDescriptor CHARSET = new PropertyDescriptor.Builder()
|
||||||
.name("exec-spark-iactive-charset")
|
.name("exec-spark-iactive-charset")
|
||||||
|
@ -124,7 +125,7 @@ public class ExecuteSparkInteractive extends AbstractProcessor {
|
||||||
private volatile List<PropertyDescriptor> properties;
|
private volatile List<PropertyDescriptor> properties;
|
||||||
private volatile Set<Relationship> relationships;
|
private volatile Set<Relationship> relationships;
|
||||||
|
|
||||||
|
@Override
|
||||||
public void init(final ProcessorInitializationContext context) {
|
public void init(final ProcessorInitializationContext context) {
|
||||||
List<PropertyDescriptor> properties = new ArrayList<>();
|
List<PropertyDescriptor> properties = new ArrayList<>();
|
||||||
properties.add(LIVY_CONTROLLER_SERVICE);
|
properties.add(LIVY_CONTROLLER_SERVICE);
|
||||||
|
@ -194,7 +195,7 @@ public class ExecuteSparkInteractive extends AbstractProcessor {
|
||||||
String payload = "{\"code\":\"" + code + "\"}";
|
String payload = "{\"code\":\"" + code + "\"}";
|
||||||
try {
|
try {
|
||||||
final JSONObject result = submitAndHandleJob(livyUrl, livySessionService, sessionId, payload, statusCheckInterval);
|
final JSONObject result = submitAndHandleJob(livyUrl, livySessionService, sessionId, payload, statusCheckInterval);
|
||||||
log.debug("********** ExecuteSparkInteractive Result of Job Submit: " + result);
|
log.debug("ExecuteSparkInteractive Result of Job Submit: " + result);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
session.transfer(flowFile, REL_FAILURE);
|
session.transfer(flowFile, REL_FAILURE);
|
||||||
} else {
|
} else {
|
||||||
|
@ -228,23 +229,23 @@ public class ExecuteSparkInteractive extends AbstractProcessor {
|
||||||
headers.put("X-Requested-By", LivySessionService.USER);
|
headers.put("X-Requested-By", LivySessionService.USER);
|
||||||
headers.put("Accept", "application/json");
|
headers.put("Accept", "application/json");
|
||||||
|
|
||||||
log.debug("********** submitAndHandleJob() Submitting Job to Spark via: " + statementUrl);
|
log.debug("submitAndHandleJob() Submitting Job to Spark via: " + statementUrl);
|
||||||
try {
|
try {
|
||||||
JSONObject jobInfo = readJSONObjectFromUrlPOST(statementUrl, livySessionService, headers, payload);
|
JSONObject jobInfo = readJSONObjectFromUrlPOST(statementUrl, livySessionService, headers, payload);
|
||||||
log.debug("********** submitAndHandleJob() Job Info: " + jobInfo);
|
log.debug("submitAndHandleJob() Job Info: " + jobInfo);
|
||||||
String statementId = String.valueOf(jobInfo.getInt("id"));
|
String statementId = String.valueOf(jobInfo.getInt("id"));
|
||||||
statementUrl = statementUrl + "/" + statementId;
|
statementUrl = statementUrl + "/" + statementId;
|
||||||
jobInfo = readJSONObjectFromUrl(statementUrl, livySessionService, headers);
|
jobInfo = readJSONObjectFromUrl(statementUrl, livySessionService, headers);
|
||||||
String jobState = jobInfo.getString("state");
|
String jobState = jobInfo.getString("state");
|
||||||
|
|
||||||
log.debug("********** submitAndHandleJob() New Job Info: " + jobInfo);
|
log.debug("submitAndHandleJob() New Job Info: " + jobInfo);
|
||||||
Thread.sleep(statusCheckInterval);
|
Thread.sleep(statusCheckInterval);
|
||||||
if (jobState.equalsIgnoreCase("available")) {
|
if (jobState.equalsIgnoreCase("available")) {
|
||||||
log.debug("********** submitAndHandleJob() Job status is: " + jobState + ". returning output...");
|
log.debug("submitAndHandleJob() Job status is: " + jobState + ". returning output...");
|
||||||
output = jobInfo.getJSONObject("output");
|
output = jobInfo.getJSONObject("output");
|
||||||
} else if (jobState.equalsIgnoreCase("running") || jobState.equalsIgnoreCase("waiting")) {
|
} else if (jobState.equalsIgnoreCase("running") || jobState.equalsIgnoreCase("waiting")) {
|
||||||
while (!jobState.equalsIgnoreCase("available")) {
|
while (!jobState.equalsIgnoreCase("available")) {
|
||||||
log.debug("********** submitAndHandleJob() Job status is: " + jobState + ". Waiting for job to complete...");
|
log.debug("submitAndHandleJob() Job status is: " + jobState + ". Waiting for job to complete...");
|
||||||
Thread.sleep(statusCheckInterval);
|
Thread.sleep(statusCheckInterval);
|
||||||
jobInfo = readJSONObjectFromUrl(statementUrl, livySessionService, headers);
|
jobInfo = readJSONObjectFromUrl(statementUrl, livySessionService, headers);
|
||||||
jobState = jobInfo.getString("state");
|
jobState = jobInfo.getString("state");
|
||||||
|
@ -253,7 +254,7 @@ public class ExecuteSparkInteractive extends AbstractProcessor {
|
||||||
} else if (jobState.equalsIgnoreCase("error")
|
} else if (jobState.equalsIgnoreCase("error")
|
||||||
|| jobState.equalsIgnoreCase("cancelled")
|
|| jobState.equalsIgnoreCase("cancelled")
|
||||||
|| jobState.equalsIgnoreCase("cancelling")) {
|
|| jobState.equalsIgnoreCase("cancelling")) {
|
||||||
log.debug("********** Job status is: " + jobState + ". Job did not complete due to error or has been cancelled. Check SparkUI for details.");
|
log.debug("Job status is: " + jobState + ". Job did not complete due to error or has been cancelled. Check SparkUI for details.");
|
||||||
throw new IOException(jobState);
|
throw new IOException(jobState);
|
||||||
}
|
}
|
||||||
} catch (JSONException | InterruptedException e) {
|
} catch (JSONException | InterruptedException e) {
|
||||||
|
@ -301,4 +302,4 @@ public class ExecuteSparkInteractive extends AbstractProcessor {
|
||||||
String jsonText = IOUtils.toString(rd);
|
String jsonText = IOUtils.toString(rd);
|
||||||
return new JSONObject(jsonText);
|
return new JSONObject(jsonText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue