This is an automated email from the ASF dual-hosted git repository.

joewitt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new fcaaa566e8 NIFI-12793 Removed deprecated nifi-spark-bundle This closes 
#8409
fcaaa566e8 is described below

commit fcaaa566e89ea52250e02fb0af1446aec27cc75d
Author: exceptionfactory <exceptionfact...@apache.org>
AuthorDate: Wed Feb 14 14:59:14 2024 -0600

    NIFI-12793 Removed deprecated nifi-spark-bundle
    This closes #8409
    
    Signed-off-by: Joseph Witt <joew...@apache.org>
---
 nifi-code-coverage/pom.xml                         |  15 -
 .../nifi-livy-controller-service-api-nar/pom.xml   |  39 --
 .../src/main/resources/META-INF/LICENSE            | 257 ---------
 .../src/main/resources/META-INF/NOTICE             |  63 ---
 .../nifi-livy-controller-service-api/pom.xml       |  40 --
 .../controller/api/livy/LivySessionService.java    |  33 --
 .../livy/exception/SessionManagerException.java    |  27 -
 .../nifi-livy-controller-service/pom.xml           |  85 ---
 .../controller/livy/LivySessionController.java     | 572 ---------------------
 .../org.apache.nifi.controller.ControllerService   |  16 -
 .../nifi-spark-bundle/nifi-livy-nar/pom.xml        |  48 --
 .../src/main/resources/META-INF/LICENSE            | 257 ---------
 .../src/main/resources/META-INF/NOTICE             |  89 ----
 .../nifi-spark-bundle/nifi-livy-processors/pom.xml |  89 ----
 .../processors/livy/ExecuteSparkInteractive.java   | 316 ------------
 .../services/org.apache.nifi.processor.Processor   |  16 -
 .../livy/TestExecuteSparkInteractive.java          | 115 -----
 nifi-nar-bundles/nifi-spark-bundle/pom.xml         |  82 ---
 nifi-nar-bundles/pom.xml                           |   1 -
 19 files changed, 2160 deletions(-)

diff --git a/nifi-code-coverage/pom.xml b/nifi-code-coverage/pom.xml
index 5dad4ff268..ec929c0331 100644
--- a/nifi-code-coverage/pom.xml
+++ b/nifi-code-coverage/pom.xml
@@ -1469,21 +1469,6 @@
             <artifactId>nifi-solr-processors</artifactId>
             <version>2.0.0-SNAPSHOT</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-livy-controller-service</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-livy-controller-service-api</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-livy-processors</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
             <artifactId>nifi-splunk-processors</artifactId>
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api-nar/pom.xml
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api-nar/pom.xml
deleted file mode 100644
index ca5dbcc2e6..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api-nar/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd";>
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-spark-bundle</artifactId>
-        <version>2.0.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>nifi-livy-controller-service-api-nar</artifactId>
-    <packaging>nar</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-standard-services-api-nar</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-livy-controller-service-api</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api-nar/src/main/resources/META-INF/LICENSE
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api-nar/src/main/resources/META-INF/LICENSE
deleted file mode 100644
index d86d9641f1..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api-nar/src/main/resources/META-INF/LICENSE
+++ /dev/null
@@ -1,257 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed 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.
-
-APACHE NIFI SUBCOMPONENTS:
-
-The Apache NiFi project contains subcomponents with separate copyright
-notices and license terms. Your use of the source code for the these
-subcomponents is subject to the terms and conditions of the following
-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.
\ No newline at end of file
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api-nar/src/main/resources/META-INF/NOTICE
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api-nar/src/main/resources/META-INF/NOTICE
deleted file mode 100644
index b2d000fe3a..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api-nar/src/main/resources/META-INF/NOTICE
+++ /dev/null
@@ -1,63 +0,0 @@
-nifi-livy-controller-service-api-nar
-Copyright 2014-2024 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-******************
-Apache Software License v2
-******************
-
-The following binary components are provided under the Apache Software License 
v2
-
-  (ASLv2) Apache Commons Lang
-    The following NOTICE information applies:
-      Apache Commons Lang
-      Copyright 2001-2015 The Apache Software Foundation
-
-      This product includes software from the Spring Framework,
-      under the Apache License 2.0 (see: StringUtils.containsWhitespace())
-
-  (ASLv2) Apache Commons Codec
-    The following NOTICE information applies:
-      Apache Commons Codec
-      Copyright 2002-2014 The Apache Software Foundation
-
-      src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java
-      contains test data from http://aspell.net/test/orig/batch0.tab.
-      Copyright (C) 2002 Kevin Atkinson (kev...@gnu.org)
-
-      
===============================================================================
-
-      The content of package org.apache.commons.codec.language.bm has been 
translated
-      from the original php source code available at 
http://stevemorse.org/phoneticinfo.htm
-      with permission from the original authors.
-      Original source copyright:
-      Copyright (c) 2008 Alexander Beider & Stephen P. Morse.
-
-  (ASLv2) Apache Commons IO
-    The following NOTICE information applies:
-      Apache Commons IO
-      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.salora...@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.
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api/pom.xml 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api/pom.xml
deleted file mode 100644
index 1ed17dcbb0..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd";>
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-spark-bundle</artifactId>
-        <version>2.0.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>nifi-livy-controller-service-api</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jcl-over-slf4j</artifactId>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api/src/main/java/org/apache/nifi/controller/api/livy/LivySessionService.java
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api/src/main/java/org/apache/nifi/controller/api/livy/LivySessionService.java
deleted file mode 100644
index f75170f18b..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api/src/main/java/org/apache/nifi/controller/api/livy/LivySessionService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.nifi.controller.api.livy;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.apache.http.client.HttpClient;
-import org.apache.nifi.controller.ControllerService;
-import org.apache.nifi.controller.api.livy.exception.SessionManagerException;
-
-public interface LivySessionService extends ControllerService {
-    String APPLICATION_JSON = "application/json";
-    String USER = "nifi";
-
-    Map<String, String> getSession() throws SessionManagerException;
-
-    HttpClient getConnection() throws IOException, SessionManagerException;
-}
\ No newline at end of file
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api/src/main/java/org/apache/nifi/controller/api/livy/exception/SessionManagerException.java
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api/src/main/java/org/apache/nifi/controller/api/livy/exception/SessionManagerException.java
deleted file mode 100644
index 77b63f0d2b..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service-api/src/main/java/org/apache/nifi/controller/api/livy/exception/SessionManagerException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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.nifi.controller.api.livy.exception;
-
-public class SessionManagerException extends Exception {
-
-    private static final long serialVersionUID = 1L;
-
-    public SessionManagerException(final Throwable t) {
-        super(t);
-    }
-
-}
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service/pom.xml 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service/pom.xml
deleted file mode 100644
index 1960a05e73..0000000000
--- a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service/pom.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd";>
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-spark-bundle</artifactId>
-        <version>2.0.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>nifi-livy-controller-service</artifactId>
-    <packaging>jar</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-ssl-context-service-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-livy-controller-service-api</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.jettison</groupId>
-            <artifactId>jettison</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-kerberos-credentials-service-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-hadoop-utils</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.hadoop</groupId>
-            <artifactId>hadoop-auth</artifactId>
-            <version>${hadoop.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-log4j12</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>log4j</groupId>
-                    <artifactId>log4j</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-reload4j</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>commons-logging</groupId>
-                    <artifactId>commons-logging</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-    </dependencies>
-</project>
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service/src/main/java/org/apache/nifi/controller/livy/LivySessionController.java
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service/src/main/java/org/apache/nifi/controller/livy/LivySessionController.java
deleted file mode 100644
index e83112a536..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service/src/main/java/org/apache/nifi/controller/livy/LivySessionController.java
+++ /dev/null
@@ -1,572 +0,0 @@
-/*
- * 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.nifi.controller.livy;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.auth.AuthSchemeProvider;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.config.AuthSchemes;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.config.Lookup;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.nifi.annotation.documentation.CapabilityDescription;
-import org.apache.nifi.annotation.documentation.Tags;
-import org.apache.nifi.annotation.lifecycle.OnDisabled;
-import org.apache.nifi.annotation.lifecycle.OnEnabled;
-import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.components.resource.ResourceCardinality;
-import org.apache.nifi.components.resource.ResourceType;
-import org.apache.nifi.controller.AbstractControllerService;
-import org.apache.nifi.controller.ConfigurationContext;
-import org.apache.nifi.controller.ControllerServiceInitializationContext;
-import org.apache.nifi.controller.api.livy.LivySessionService;
-import org.apache.nifi.controller.api.livy.exception.SessionManagerException;
-import org.apache.nifi.expression.ExpressionLanguageScope;
-import org.apache.nifi.hadoop.KerberosKeytabCredentials;
-import org.apache.nifi.hadoop.KerberosKeytabSPNegoAuthSchemeProvider;
-import org.apache.nifi.kerberos.KerberosCredentialsService;
-import org.apache.nifi.logging.ComponentLog;
-import org.apache.nifi.processor.util.StandardValidators;
-import org.apache.nifi.ssl.SSLContextService;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
-
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManagerFactory;
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.ConnectException;
-import java.net.SocketTimeoutException;
-import java.nio.charset.StandardCharsets;
-import java.security.KeyManagementException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-@Tags({"Livy", "REST", "Spark", "http"})
-@CapabilityDescription("Manages pool of Spark sessions over HTTP")
-public class LivySessionController extends AbstractControllerService 
implements LivySessionService {
-
-    public static final PropertyDescriptor LIVY_HOST = new 
PropertyDescriptor.Builder()
-            .name("livy-cs-livy-host")
-            .displayName("Livy Host")
-            .description("The hostname (or IP address) of the Livy server.")
-            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-            .required(true)
-            .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-            .build();
-
-    public static final PropertyDescriptor LIVY_PORT = new 
PropertyDescriptor.Builder()
-            .name("livy-cs-livy-port")
-            .displayName("Livy Port")
-            .description("The port number for the Livy server.")
-            .required(true)
-            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-            .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-            .defaultValue("8998")
-            .build();
-
-    public static final PropertyDescriptor SESSION_POOL_SIZE = new 
PropertyDescriptor.Builder()
-            .name("livy-cs-session-pool-size")
-            .displayName("Session Pool Size")
-            .description("Number of sessions to keep open")
-            .required(true)
-            .defaultValue("2")
-            .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR)
-            .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-            .build();
-
-    public static final PropertyDescriptor SESSION_TYPE = new 
PropertyDescriptor.Builder()
-            .name("livy-cs-session-kind")
-            .displayName("Session Type")
-            .description("The type of Spark session to start (spark, pyspark, 
pyspark3, sparkr, e.g.)")
-            .required(true)
-            .allowableValues("spark", "pyspark", "pyspark3", "sparkr")
-            .defaultValue("spark")
-            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-            .build();
-
-    public static final PropertyDescriptor SESSION_MGR_STATUS_INTERVAL = new 
PropertyDescriptor.Builder()
-            .name("livy-cs-session-manager-status-interval")
-            .displayName("Session Manager Status Interval")
-            .description("The amount of time to wait between requesting 
session information updates.")
-            .required(true)
-            .defaultValue("2 sec")
-            .addValidator(StandardValidators.TIME_PERIOD_VALIDATOR)
-            .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-            .build();
-
-    public static final PropertyDescriptor JARS = new 
PropertyDescriptor.Builder()
-            .name("livy-cs-session-jars")
-            .displayName("Session JARs")
-            .description("JARs to be used in the Spark session.")
-            .required(false)
-            .identifiesExternalResource(ResourceCardinality.MULTIPLE, 
ResourceType.FILE)
-            .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-            .build();
-
-    public static final PropertyDescriptor FILES = new 
PropertyDescriptor.Builder()
-            .name("livy-cs-session-files")
-            .displayName("Session Files")
-            .description("Files to be used in the Spark session.")
-            .required(false)
-            .identifiesExternalResource(ResourceCardinality.MULTIPLE, 
ResourceType.FILE)
-            .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
-            .build();
-
-    public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new 
PropertyDescriptor.Builder()
-            .name("SSL Context Service")
-            .description("The SSL Context Service used to provide client 
certificate information for TLS/SSL (https) connections.")
-            .required(false)
-            .identifiesControllerService(SSLContextService.class)
-            .build();
-
-    public static final PropertyDescriptor CONNECT_TIMEOUT = new 
PropertyDescriptor.Builder()
-            .name("Connection Timeout")
-            .description("Max wait time for connection to remote service.")
-            .required(true)
-            .defaultValue("5 secs")
-            .addValidator(StandardValidators.TIME_PERIOD_VALIDATOR)
-            .build();
-
-    static final PropertyDescriptor KERBEROS_CREDENTIALS_SERVICE = new 
PropertyDescriptor.Builder()
-        .name("kerberos-credentials-service")
-        .displayName("Kerberos Credentials Service")
-        .description("Specifies the Kerberos Credentials Controller Service 
that should be used for authenticating with Kerberos")
-        .identifiesControllerService(KerberosCredentialsService.class)
-        .required(false)
-        .build();
-
-    private volatile String livyUrl;
-    private volatile int sessionPoolSize;
-    private volatile String controllerKind;
-    private volatile String jars;
-    private volatile String files;
-    private final Map<Integer, JSONObject> sessions = new 
ConcurrentHashMap<>();
-    private volatile SSLContextService sslContextService;
-    private volatile SSLContext sslContext;
-    private volatile int connectTimeout;
-    private volatile Thread livySessionManagerThread = null;
-    private volatile boolean enabled = true;
-    private volatile KerberosCredentialsService credentialsService;
-    private volatile SessionManagerException sessionManagerException;
-
-    private List<PropertyDescriptor> properties;
-
-    @Override
-    protected void init(ControllerServiceInitializationContext config) {
-        final List<PropertyDescriptor> props = new ArrayList<>();
-        props.add(LIVY_HOST);
-        props.add(LIVY_PORT);
-        props.add(SESSION_POOL_SIZE);
-        props.add(SESSION_TYPE);
-        props.add(SESSION_MGR_STATUS_INTERVAL);
-        props.add(SSL_CONTEXT_SERVICE);
-        props.add(CONNECT_TIMEOUT);
-        props.add(JARS);
-        props.add(FILES);
-        props.add(KERBEROS_CREDENTIALS_SERVICE);
-
-        properties = Collections.unmodifiableList(props);
-    }
-
-    @Override
-    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
-        return properties;
-    }
-
-    @OnEnabled
-    public void onEnabled(final ConfigurationContext context) {
-        final String livyHost = 
context.getProperty(LIVY_HOST).evaluateAttributeExpressions().getValue();
-        final String livyPort = 
context.getProperty(LIVY_PORT).evaluateAttributeExpressions().getValue();
-        final String sessionPoolSize = 
context.getProperty(SESSION_POOL_SIZE).evaluateAttributeExpressions().getValue();
-        final String sessionKind = 
context.getProperty(SESSION_TYPE).getValue();
-        final long sessionManagerStatusInterval = 
context.getProperty(SESSION_MGR_STATUS_INTERVAL).evaluateAttributeExpressions().asTimePeriod(TimeUnit.MILLISECONDS);
-        final String jars = 
context.getProperty(JARS).evaluateAttributeExpressions().getValue();
-        final String files = 
context.getProperty(FILES).evaluateAttributeExpressions().getValue();
-        sslContextService = 
context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
-        sslContext = sslContextService == null ? null : 
sslContextService.createContext();
-        connectTimeout = 
Math.toIntExact(context.getProperty(CONNECT_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS));
-        credentialsService = 
context.getProperty(KERBEROS_CREDENTIALS_SERVICE).asControllerService(KerberosCredentialsService.class);
-
-        this.livyUrl = "http" + (sslContextService != null ? "s" : "") + "://" 
+ livyHost + ":" + livyPort;
-        this.controllerKind = sessionKind;
-        this.jars = jars;
-        this.files = files;
-        this.sessionPoolSize = Integer.valueOf(sessionPoolSize);
-        this.enabled = true;
-
-        livySessionManagerThread = new Thread(() -> {
-            while (enabled) {
-                try {
-                    manageSessions();
-                    sessionManagerException = null;
-                } catch (Exception e) {
-                    getLogger().error("Livy Session Manager Thread run into an 
error, but continues to run", e);
-                    sessionManagerException = new SessionManagerException(e);
-                }
-                try {
-                    Thread.sleep(sessionManagerStatusInterval);
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                    enabled = false;
-                }
-            }
-        });
-        livySessionManagerThread.setName("Livy-Session-Manager-" + 
controllerKind);
-        livySessionManagerThread.start();
-    }
-
-    @OnDisabled
-    public void shutdown() {
-        ComponentLog log = getLogger();
-        try {
-            enabled = false;
-            livySessionManagerThread.interrupt();
-            livySessionManagerThread.join();
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            log.error("Livy Session Manager Thread interrupted");
-        }
-    }
-
-    @Override
-    public Map<String, String> getSession() throws SessionManagerException {
-        checkSessionManagerException();
-
-        Map<String, String> sessionMap = new HashMap<>();
-        try {
-            final Map<Integer, JSONObject> sessionsCopy = sessions;
-            for (int sessionId : sessionsCopy.keySet()) {
-                JSONObject currentSession = sessions.get(sessionId);
-                String state = currentSession.getString("state");
-                String sessionKind = currentSession.getString("kind");
-                if (state.equalsIgnoreCase("idle") && 
sessionKind.equalsIgnoreCase(controllerKind)) {
-                    sessionMap.put("sessionId", String.valueOf(sessionId));
-                    sessionMap.put("livyUrl", livyUrl);
-                    break;
-                }
-            }
-        } catch (JSONException e) {
-            getLogger().error("Unexpected data found when looking for JSON 
object with 'state' and 'kind' fields", e);
-        }
-        return sessionMap;
-    }
-
-    @Override
-    public HttpClient getConnection() throws IOException, 
SessionManagerException {
-        checkSessionManagerException();
-
-        return openConnection();
-    }
-
-    private HttpClient openConnection() throws IOException {
-        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
-
-        if (sslContextService != null) {
-            try {
-                SSLContext sslContext = getSslSocketFactory(sslContextService);
-                httpClientBuilder.setSSLContext(sslContext);
-            } catch (KeyStoreException | CertificateException | 
NoSuchAlgorithmException | UnrecoverableKeyException | KeyManagementException 
e) {
-                throw new IOException(e);
-            }
-        }
-
-        if (credentialsService != null) {
-            CredentialsProvider credentialsProvider = new 
BasicCredentialsProvider();
-            credentialsProvider.setCredentials(new AuthScope(null, -1, null),
-                new 
KerberosKeytabCredentials(credentialsService.getPrincipal(), 
credentialsService.getKeytab()));
-            
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
-            Lookup<AuthSchemeProvider> authSchemeRegistry = 
RegistryBuilder.<AuthSchemeProvider> create()
-                .register(AuthSchemes.SPNEGO, new 
KerberosKeytabSPNegoAuthSchemeProvider()).build();
-            httpClientBuilder.setDefaultAuthSchemeRegistry(authSchemeRegistry);
-        }
-
-        RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
-        requestConfigBuilder.setConnectTimeout(connectTimeout);
-        requestConfigBuilder.setConnectionRequestTimeout(connectTimeout);
-        requestConfigBuilder.setSocketTimeout(connectTimeout);
-        
httpClientBuilder.setDefaultRequestConfig(requestConfigBuilder.build());
-
-        return httpClientBuilder.build();
-    }
-
-    private void manageSessions() throws InterruptedException, IOException {
-        int idleSessions = 0;
-        JSONObject newSessionInfo;
-        Map<Integer, JSONObject> sessionsInfo;
-        ComponentLog log = getLogger();
-
-        try {
-            sessionsInfo = listSessions();
-            if (sessions.isEmpty()) {
-                log.debug("manageSessions() the active session list is empty, 
populating from acquired list...");
-                sessions.putAll(sessionsInfo);
-            }
-            for (Integer sessionId : new ArrayList<>(sessions.keySet())) {
-                JSONObject currentSession = sessions.get(sessionId);
-                log.debug("manageSessions() Updating current session: " + 
currentSession);
-                if (sessionsInfo.containsKey(sessionId)) {
-                    String state = currentSession.getString("state");
-                    String sessionKind = currentSession.getString("kind");
-                    log.debug("manageSessions() controller kind: {}, session 
kind: {}, session state: {}",
-                            new Object[]{controllerKind, sessionKind, state});
-                    if (state.equalsIgnoreCase("idle") && 
sessionKind.equalsIgnoreCase(controllerKind)) {
-                        // Keep track of how many sessions are in an idle 
state and thus available
-                        idleSessions++;
-                        sessions.put(sessionId, sessionsInfo.get(sessionId));
-                        // Remove session from session list source of truth 
snapshot since it has been dealt with
-                        sessionsInfo.remove(sessionId);
-                    } else if ((state.equalsIgnoreCase("busy") || 
state.equalsIgnoreCase("starting")) && 
sessionKind.equalsIgnoreCase(controllerKind)) {
-                        // Update status of existing sessions
-                        sessions.put(sessionId, sessionsInfo.get(sessionId));
-                        // Remove session from session list source of truth 
snapshot since it has been dealt with
-                        sessionsInfo.remove(sessionId);
-                    } else {
-                        // Prune sessions of kind != controllerKind and whose 
state is:
-                        // not_started, shutting_down, error, dead, success 
(successfully stopped)
-                        sessions.remove(sessionId);
-                        //Remove session from session list source of truth 
snapshot since it has been dealt with
-                        sessionsInfo.remove(sessionId);
-                    }
-                } else {
-                    // Prune sessions that no longer exist
-                    log.debug("manageSessions() session exists in session pool 
but not in source snapshot, removing from pool...");
-                    sessions.remove(sessionId);
-                    // Remove session from session list source of truth 
snapshot since it has been dealt with
-                    sessionsInfo.remove(sessionId);
-                }
-            }
-            int numSessions = sessions.size();
-            log.debug("manageSessions() There are " + numSessions + " sessions 
in the pool");
-            // Open new sessions equal to the number requested by 
sessionPoolSize
-            if (numSessions == 0) {
-                for (int i = 0; i < sessionPoolSize; i++) {
-                    newSessionInfo = openSession();
-                    sessions.put(newSessionInfo.getInt("id"), newSessionInfo);
-                    log.debug("manageSessions() Registered new session: " + 
newSessionInfo);
-                }
-            } else {
-                // Open one new session if there are no idle sessions
-                if (idleSessions == 0) {
-                    log.debug("manageSessions() There are " + numSessions + " 
sessions in the pool but none of them are idle sessions, creating...");
-                    newSessionInfo = openSession();
-                    sessions.put(newSessionInfo.getInt("id"), newSessionInfo);
-                    log.debug("manageSessions() Registered new session: " + 
newSessionInfo);
-                }
-                // Open more sessions if number of sessions is less than 
target pool size
-                if (numSessions < sessionPoolSize) {
-                    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++) {
-                        newSessionInfo = openSession();
-                        sessions.put(newSessionInfo.getInt("id"), 
newSessionInfo);
-                        log.debug("manageSessions() Registered new session: " 
+ newSessionInfo);
-                    }
-                }
-            }
-        } catch (ConnectException | SocketTimeoutException ce) {
-            log.error("Timeout connecting to Livy service to retrieve 
sessions", ce);
-        } catch (JSONException e) {
-            throw new IOException(e);
-        }
-    }
-
-    private Map<Integer, JSONObject> listSessions() throws IOException {
-        String sessionsUrl = livyUrl + "/sessions";
-        int numSessions;
-        JSONObject sessionsInfo;
-        Map<Integer, JSONObject> sessionsMap = new HashMap<>();
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Content-Type", APPLICATION_JSON);
-        headers.put("X-Requested-By", USER);
-        try {
-            sessionsInfo = readJSONFromUrl(sessionsUrl, headers);
-            numSessions = sessionsInfo.getJSONArray("sessions").length();
-            for (int i = 0; i < numSessions; i++) {
-                int currentSessionId = 
sessionsInfo.getJSONArray("sessions").getJSONObject(i).getInt("id");
-                JSONObject currentSession = 
sessionsInfo.getJSONArray("sessions").getJSONObject(i);
-                sessionsMap.put(currentSessionId, currentSession);
-            }
-        } catch (JSONException e) {
-            throw new IOException(e);
-        }
-
-        return sessionsMap;
-    }
-
-    private JSONObject getSessionInfo(int sessionId) throws IOException {
-        String sessionUrl = livyUrl + "/sessions/" + sessionId;
-        JSONObject sessionInfo;
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Content-Type", APPLICATION_JSON);
-        headers.put("X-Requested-By", USER);
-        try {
-            sessionInfo = readJSONFromUrl(sessionUrl, headers);
-        } catch (JSONException e) {
-            throw new IOException(e);
-        }
-
-        return sessionInfo;
-    }
-
-    private JSONObject openSession() throws IOException, JSONException, 
InterruptedException {
-        ComponentLog log = getLogger();
-        JSONObject newSessionInfo;
-        final ObjectMapper mapper = new ObjectMapper();
-
-        String sessionsUrl = livyUrl + "/sessions";
-        StringBuilder payload = new StringBuilder("{\"kind\":\"" + 
controllerKind + "\"");
-        if (jars != null) {
-            List<String> jarsArray = Arrays.stream(jars.split(","))
-                    .filter(StringUtils::isNotBlank)
-                    .map(String::trim).collect(Collectors.toList());
-
-            String jarsJsonArray = mapper.writeValueAsString(jarsArray);
-            payload.append(",\"jars\":");
-            payload.append(jarsJsonArray);
-        }
-        if (files != null) {
-            List<String> filesArray = Arrays.stream(files.split(","))
-                    .filter(StringUtils::isNotBlank)
-                    .map(String::trim).collect(Collectors.toList());
-            String filesJsonArray = mapper.writeValueAsString(filesArray);
-            payload.append(",\"files\":");
-            payload.append(filesJsonArray);
-        }
-
-        payload.append("}");
-        log.debug("openSession() Session Payload: " + payload.toString());
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Content-Type", APPLICATION_JSON);
-        headers.put("X-Requested-By", USER);
-
-        newSessionInfo = readJSONObjectFromUrlPOST(sessionsUrl, headers, 
payload.toString());
-        Thread.sleep(1000);
-        while (newSessionInfo.getString("state").equalsIgnoreCase("starting")) 
{
-            log.debug("openSession() Waiting for session to start...");
-            newSessionInfo = getSessionInfo(newSessionInfo.getInt("id"));
-            log.debug("openSession() newSessionInfo: " + newSessionInfo);
-            Thread.sleep(1000);
-        }
-
-        return newSessionInfo;
-    }
-
-    private JSONObject readJSONObjectFromUrlPOST(String urlString, Map<String, 
String> headers, String payload) throws IOException, JSONException {
-        HttpClient httpClient = openConnection();
-
-        HttpPost request = new HttpPost(urlString);
-        for (Map.Entry<String, String> entry : headers.entrySet()) {
-            request.addHeader(entry.getKey(), entry.getValue());
-        }
-        HttpEntity httpEntity = new StringEntity(payload);
-        request.setEntity(httpEntity);
-        HttpResponse response = httpClient.execute(request);
-
-        if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK && 
response.getStatusLine().getStatusCode() != HttpStatus.SC_CREATED) {
-            throw new RuntimeException("Failed : HTTP error code : " + 
response.getStatusLine().getStatusCode() + " : " + 
response.getStatusLine().getReasonPhrase());
-        }
-
-        InputStream content = response.getEntity().getContent();
-        return readAllIntoJSONObject(content);
-    }
-
-    private JSONObject readJSONFromUrl(String urlString, Map<String, String> 
headers) throws IOException, JSONException {
-        HttpClient httpClient = openConnection();
-
-        HttpGet request = new HttpGet(urlString);
-        for (Map.Entry<String, String> entry : headers.entrySet()) {
-            request.addHeader(entry.getKey(), entry.getValue());
-        }
-        HttpResponse response = httpClient.execute(request);
-
-        InputStream content = response.getEntity().getContent();
-        return readAllIntoJSONObject(content);
-    }
-
-    private JSONObject readAllIntoJSONObject(InputStream content) throws 
IOException, JSONException {
-        BufferedReader rd = new BufferedReader(new InputStreamReader(content, 
StandardCharsets.UTF_8));
-        String jsonText = IOUtils.toString(rd);
-        return new JSONObject(jsonText);
-    }
-
-    private SSLContext getSslSocketFactory(SSLContextService sslService)
-            throws IOException, KeyStoreException, CertificateException, 
NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {
-        final String keystoreLocation = sslService.getKeyStoreFile();
-        final String keystorePass = sslService.getKeyStorePassword();
-        final String keystoreType = sslService.getKeyStoreType();
-
-        // prepare the keystore
-        final KeyStore keyStore = KeyStore.getInstance(keystoreType);
-
-        try (FileInputStream keyStoreStream = new 
FileInputStream(keystoreLocation)) {
-            keyStore.load(keyStoreStream, keystorePass.toCharArray());
-        }
-
-        final KeyManagerFactory keyManagerFactory = 
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
-        keyManagerFactory.init(keyStore, keystorePass.toCharArray());
-
-        // load truststore
-        final String truststoreLocation = sslService.getTrustStoreFile();
-        final String truststorePass = sslService.getTrustStorePassword();
-        final String truststoreType = sslService.getTrustStoreType();
-
-        KeyStore truststore = KeyStore.getInstance(truststoreType);
-        final TrustManagerFactory trustManagerFactory = 
TrustManagerFactory.getInstance("X509");
-        truststore.load(new FileInputStream(truststoreLocation), 
truststorePass.toCharArray());
-        trustManagerFactory.init(truststore);
-
-        sslContext.init(keyManagerFactory.getKeyManagers(), 
trustManagerFactory.getTrustManagers(), null);
-
-        return sslContext;
-    }
-
-    private void checkSessionManagerException() throws SessionManagerException 
{
-        SessionManagerException exception = sessionManagerException;
-        if (exception != null) {
-            throw sessionManagerException;
-        }
-    }
-
-}
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
deleted file mode 100644
index 8b4b0468a7..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-controller-service/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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.
-
-org.apache.nifi.controller.livy.LivySessionController
\ No newline at end of file
diff --git a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-nar/pom.xml 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-nar/pom.xml
deleted file mode 100644
index 976cf5270c..0000000000
--- a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-nar/pom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd";>
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-spark-bundle</artifactId>
-        <version>2.0.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>nifi-livy-nar</artifactId>
-    <packaging>nar</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-livy-controller-service-api-nar</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-            <type>nar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-livy-controller-service</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-livy-processors</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-ssl-context-service-api</artifactId>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-nar/src/main/resources/META-INF/LICENSE
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-nar/src/main/resources/META-INF/LICENSE
deleted file mode 100644
index d86d9641f1..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-nar/src/main/resources/META-INF/LICENSE
+++ /dev/null
@@ -1,257 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed 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.
-
-APACHE NIFI SUBCOMPONENTS:
-
-The Apache NiFi project contains subcomponents with separate copyright
-notices and license terms. Your use of the source code for the these
-subcomponents is subject to the terms and conditions of the following
-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.
\ No newline at end of file
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-nar/src/main/resources/META-INF/NOTICE
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-nar/src/main/resources/META-INF/NOTICE
deleted file mode 100644
index f16f813136..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-nar/src/main/resources/META-INF/NOTICE
+++ /dev/null
@@ -1,89 +0,0 @@
-nifi-livy-nar
-Copyright 2014-2024 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-******************
-Apache Software License v2
-******************
-
-The following binary components are provided under the Apache Software License 
v2
-
-  (ASLv2) Apache Commons Configuration
-    The following NOTICE information applies:
-      Apache Commons Configuration
-      Copyright 2001-2017 The Apache Software Foundation
-
-      This product includes software developed at
-      The Apache Software Foundation (http://www.apache.org/).
-
-  (ASLv2) Apache Commons Lang
-    The following NOTICE information applies:
-      Apache Commons Lang
-      Copyright 2001-2015 The Apache Software Foundation
-
-      This product includes software from the Spring Framework,
-      under the Apache License 2.0 (see: StringUtils.containsWhitespace())
-
-  (ASLv2) Apache Commons Codec
-    The following NOTICE information applies:
-      Apache Commons Codec
-      Copyright 2002-2014 The Apache Software Foundation
-
-      src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java
-      contains test data from http://aspell.net/test/orig/batch0.tab.
-      Copyright (C) 2002 Kevin Atkinson (kev...@gnu.org)
-
-      
===============================================================================
-
-      The content of package org.apache.commons.codec.language.bm has been 
translated
-      from the original php source code available at 
http://stevemorse.org/phoneticinfo.htm
-      with permission from the original authors.
-      Original source copyright:
-      Copyright (c) 2008 Alexander Beider & Stephen P. Morse.
-
-  (ASLv2) Apache Commons IO
-    The following NOTICE information applies:
-      Apache Commons IO
-      Copyright 2002-2016 The Apache Software Foundation
-
-  (ASLv2) Apache Commons Text
-    The following NOTICE information applies:
-      Apache Commons Text
-      Copyright 2001-2018 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.salora...@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)
diff --git a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/pom.xml 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/pom.xml
deleted file mode 100644
index 21e7a5ae17..0000000000
--- a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/pom.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd";>
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-spark-bundle</artifactId>
-        <version>2.0.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>nifi-livy-processors</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-livy-controller-service-api</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-configuration</groupId>
-            <artifactId>commons-configuration</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jcl-over-slf4j</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.jettison</groupId>
-            <artifactId>jettison</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-mock</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-ssl-context-service-api</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-ssl-context-service</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-livy-controller-service</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-kerberos-credentials-service-api</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-text</artifactId>
-        </dependency>
-    </dependencies>
-</project>
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/src/main/java/org/apache/nifi/processors/livy/ExecuteSparkInteractive.java
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/src/main/java/org/apache/nifi/processors/livy/ExecuteSparkInteractive.java
deleted file mode 100644
index 41eaac0152..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/src/main/java/org/apache/nifi/processors/livy/ExecuteSparkInteractive.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * 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.nifi.processors.livy;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.text.StringEscapeUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.nifi.annotation.behavior.InputRequirement;
-import org.apache.nifi.annotation.documentation.CapabilityDescription;
-import org.apache.nifi.annotation.documentation.Tags;
-import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.controller.api.livy.exception.SessionManagerException;
-import org.apache.nifi.flowfile.FlowFile;
-import org.apache.nifi.flowfile.attributes.CoreAttributes;
-import org.apache.nifi.logging.ComponentLog;
-import org.apache.nifi.processor.AbstractProcessor;
-import org.apache.nifi.processor.ProcessContext;
-import org.apache.nifi.processor.ProcessSession;
-import org.apache.nifi.processor.ProcessorInitializationContext;
-import org.apache.nifi.processor.Relationship;
-import org.apache.nifi.processor.exception.ProcessException;
-
-import org.apache.nifi.processor.util.StandardValidators;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
-
-import org.apache.nifi.controller.api.livy.LivySessionService;
-import org.apache.nifi.expression.ExpressionLanguageScope;
-
-@InputRequirement(InputRequirement.Requirement.INPUT_REQUIRED)
-@Tags({"spark", "livy", "http", "execute"})
-@CapabilityDescription("Execute Spark Code over a Livy-managed HTTP session to 
a live Spark context. Supports cached RDD sharing.")
-public class ExecuteSparkInteractive extends AbstractProcessor {
-
-    public static final PropertyDescriptor LIVY_CONTROLLER_SERVICE = new 
PropertyDescriptor.Builder()
-            .name("exec-spark-iactive-livy-controller-service")
-            .displayName("Livy Controller Service")
-            .description("The controller service to use for Livy-managed 
session(s).")
-            .required(true)
-            .identifiesControllerService(LivySessionService.class)
-            .build();
-
-    public static final PropertyDescriptor CODE = new 
PropertyDescriptor.Builder()
-            .name("exec-spark-iactive-code")
-            .displayName("Code")
-            .description("The code to execute in the session. This property 
can be empty, a constant value, or built from attributes "
-                    + "using Expression Language. If this property is 
specified, it will be used regardless of the content of "
-                    + "incoming flowfiles. If this property is empty, the 
content of the incoming flow file is expected "
-                    + "to contain valid code to be issued by the processor to 
the session. Note that Expression "
-                    + "Language is not evaluated for flow file contents.")
-            .required(false)
-            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
-            
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
-            .build();
-
-    /**
-     * Points to the charset name corresponding to the incoming flow file's
-     * encoding.
-     */
-    public static final PropertyDescriptor CHARSET = new 
PropertyDescriptor.Builder()
-            .name("exec-spark-iactive-charset")
-            .displayName("Character Set")
-            .description("The character set encoding for the incoming flow 
file.")
-            .required(true)
-            .defaultValue("UTF-8")
-            .addValidator(StandardValidators.CHARACTER_SET_VALIDATOR)
-            
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
-            .build();
-
-    public static final PropertyDescriptor STATUS_CHECK_INTERVAL = new 
PropertyDescriptor.Builder()
-            .name("exec-spark-iactive-status-check-interval")
-            .displayName("Status Check Interval")
-            .description("The amount of time to wait between checking the 
status of an operation.")
-            .required(true)
-            .addValidator(StandardValidators.TIME_PERIOD_VALIDATOR)
-            
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
-            .defaultValue("1 sec")
-            .build();
-
-    public static final Relationship REL_SUCCESS = new Relationship.Builder()
-            .name("success")
-            .description("FlowFiles that are successfully processed are sent 
to this relationship")
-            .build();
-
-    public static final Relationship REL_WAIT = new Relationship.Builder()
-            .name("wait")
-            .description("FlowFiles that are waiting on an available Spark 
session will be sent to this relationship")
-            .build();
-
-    public static final Relationship REL_FAILURE = new Relationship.Builder()
-            .name("failure")
-            .description("FlowFiles are routed to this relationship when they 
cannot be parsed")
-            .build();
-
-    private volatile List<PropertyDescriptor> properties;
-    private volatile Set<Relationship> relationships;
-
-    @Override
-    public void init(final ProcessorInitializationContext context) {
-        List<PropertyDescriptor> properties = new ArrayList<>();
-        properties.add(LIVY_CONTROLLER_SERVICE);
-        properties.add(CODE);
-        properties.add(CHARSET);
-        properties.add(STATUS_CHECK_INTERVAL);
-        this.properties = Collections.unmodifiableList(properties);
-
-        Set<Relationship> relationships = new HashSet<>();
-        relationships.add(REL_SUCCESS);
-        relationships.add(REL_WAIT);
-        relationships.add(REL_FAILURE);
-        this.relationships = Collections.unmodifiableSet(relationships);
-    }
-
-    @Override
-    public Set<Relationship> getRelationships() {
-        return relationships;
-    }
-
-    @Override
-    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
-        return properties;
-    }
-
-    @Override
-    public void onTrigger(ProcessContext context, final ProcessSession 
session) throws ProcessException {
-
-        FlowFile flowFile = session.get();
-        if (flowFile == null) {
-            return;
-        }
-
-        final ComponentLog log = getLogger();
-        final LivySessionService livySessionService = 
context.getProperty(LIVY_CONTROLLER_SERVICE).asControllerService(LivySessionService.class);
-        final Map<String, String> livyController;
-        try {
-            livyController = livySessionService.getSession();
-            if (livyController == null || livyController.isEmpty()) {
-                log.debug("No Spark session available (yet), routing flowfile 
to wait");
-                session.transfer(flowFile, REL_WAIT);
-                context.yield();
-                return;
-            }
-        } catch (SessionManagerException sme) {
-            log.error("Error opening spark session, routing flowfile to wait", 
sme);
-            session.transfer(flowFile, REL_WAIT);
-            context.yield();
-            return;
-        }
-        final long statusCheckInterval = 
context.getProperty(STATUS_CHECK_INTERVAL).evaluateAttributeExpressions(flowFile).asTimePeriod(TimeUnit.MILLISECONDS);
-        Charset charset = 
Charset.forName(context.getProperty(CHARSET).evaluateAttributeExpressions(flowFile).getValue());
-
-        String sessionId = livyController.get("sessionId");
-        String livyUrl = livyController.get("livyUrl");
-        String code = 
context.getProperty(CODE).evaluateAttributeExpressions(flowFile).getValue();
-        if (StringUtils.isEmpty(code)) {
-            try (InputStream inputStream = session.read(flowFile)) {
-                // If no code was provided, assume it is in the content of the 
incoming flow file
-                code = IOUtils.toString(inputStream, charset);
-            } catch (IOException ioe) {
-                log.error("Error reading input flowfile, penalizing and 
routing to failure", flowFile, ioe.getMessage(), ioe);
-                flowFile = session.penalize(flowFile);
-                session.transfer(flowFile, REL_FAILURE);
-                return;
-            }
-        }
-
-        code = StringEscapeUtils.escapeJson(code);
-        String payload = "{\"code\":\"" + code + "\"}";
-        try {
-            final JSONObject result = submitAndHandleJob(livyUrl, 
livySessionService, sessionId, payload, statusCheckInterval);
-            log.debug("ExecuteSparkInteractive Result of Job Submit: " + 
result);
-            if (result == null) {
-                session.transfer(flowFile, REL_FAILURE);
-            } else {
-                try {
-                    final JSONObject output = result.getJSONObject("data");
-                    flowFile = session.write(flowFile, out -> 
out.write(output.toString().getBytes(charset)));
-                    flowFile = session.putAttribute(flowFile, 
CoreAttributes.MIME_TYPE.key(), LivySessionService.APPLICATION_JSON);
-                    session.transfer(flowFile, REL_SUCCESS);
-                } catch (JSONException je) {
-                    // The result doesn't contain the data, just send the 
output object as the flow file content to failure (after penalizing)
-                    log.error("Spark Session returned an error, sending the 
output JSON object as the flow file content to failure (after penalizing)");
-                    flowFile = session.write(flowFile, out -> 
out.write(result.toString().getBytes(charset)));
-                    flowFile = session.putAttribute(flowFile, 
CoreAttributes.MIME_TYPE.key(), LivySessionService.APPLICATION_JSON);
-                    flowFile = session.penalize(flowFile);
-                    session.transfer(flowFile, REL_FAILURE);
-                }
-            }
-        } catch (IOException | SessionManagerException e) {
-            log.error("Failure processing flowfile {} due to {}, penalizing 
and routing to failure", flowFile, e.getMessage(), e);
-            flowFile = session.penalize(flowFile);
-            session.transfer(flowFile, REL_FAILURE);
-        }
-    }
-
-    private JSONObject submitAndHandleJob(String livyUrl, LivySessionService 
livySessionService, String sessionId, String payload, long statusCheckInterval)
-        throws IOException, SessionManagerException {
-        ComponentLog log = getLogger();
-        String statementUrl = livyUrl + "/sessions/" + sessionId + 
"/statements";
-        JSONObject output = null;
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Content-Type", LivySessionService.APPLICATION_JSON);
-        headers.put("X-Requested-By", LivySessionService.USER);
-        headers.put("Accept", "application/json");
-
-        log.debug("submitAndHandleJob() Submitting Job to Spark via: " + 
statementUrl);
-        try {
-            JSONObject jobInfo = readJSONObjectFromUrlPOST(statementUrl, 
livySessionService, headers, payload);
-            log.debug("submitAndHandleJob() Job Info: " + jobInfo);
-            String statementId = String.valueOf(jobInfo.getInt("id"));
-            statementUrl = statementUrl + "/" + statementId;
-            jobInfo = readJSONObjectFromUrl(statementUrl, livySessionService, 
headers);
-            String jobState = jobInfo.getString("state");
-
-            log.debug("submitAndHandleJob() New Job Info: " + jobInfo);
-            Thread.sleep(statusCheckInterval);
-            if (jobState.equalsIgnoreCase("available")) {
-                log.debug("submitAndHandleJob() Job status is: " + jobState + 
". returning output...");
-                output = jobInfo.getJSONObject("output");
-            } else if (jobState.equalsIgnoreCase("running") || 
jobState.equalsIgnoreCase("waiting")) {
-                while (!jobState.equalsIgnoreCase("available")) {
-                    log.debug("submitAndHandleJob() Job status is: " + 
jobState + ". Waiting for job to complete...");
-                    Thread.sleep(statusCheckInterval);
-                    jobInfo = readJSONObjectFromUrl(statementUrl, 
livySessionService, headers);
-                    jobState = jobInfo.getString("state");
-                }
-                output = jobInfo.getJSONObject("output");
-            } else if (jobState.equalsIgnoreCase("error")
-                    || jobState.equalsIgnoreCase("cancelled")
-                    || jobState.equalsIgnoreCase("cancelling")) {
-                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);
-            }
-        } catch (JSONException | InterruptedException e) {
-            throw new IOException(e);
-        }
-        return output;
-    }
-
-    private JSONObject readJSONObjectFromUrlPOST(String urlString, 
LivySessionService livySessionService, Map<String, String> headers, String 
payload)
-        throws IOException, JSONException, SessionManagerException {
-        HttpClient httpClient = livySessionService.getConnection();
-
-        HttpPost request = new HttpPost(urlString);
-        for (Map.Entry<String, String> entry : headers.entrySet()) {
-            request.addHeader(entry.getKey(), entry.getValue());
-        }
-        HttpEntity httpEntity = new StringEntity(payload);
-        request.setEntity(httpEntity);
-        HttpResponse response = httpClient.execute(request);
-
-        if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK && 
response.getStatusLine().getStatusCode() != HttpStatus.SC_CREATED) {
-            throw new RuntimeException("Failed : HTTP error code : " + 
response.getStatusLine().getStatusCode() + " : " + 
response.getStatusLine().getReasonPhrase());
-        }
-
-        InputStream content = response.getEntity().getContent();
-        return readAllIntoJSONObject(content);
-    }
-
-    private JSONObject readJSONObjectFromUrl(String urlString, 
LivySessionService livySessionService, Map<String, String> headers) throws 
IOException, JSONException, SessionManagerException {
-        HttpClient httpClient = livySessionService.getConnection();
-
-        HttpGet request = new HttpGet(urlString);
-        for (Map.Entry<String, String> entry : headers.entrySet()) {
-            request.addHeader(entry.getKey(), entry.getValue());
-        }
-        HttpResponse response = httpClient.execute(request);
-
-        InputStream content = response.getEntity().getContent();
-        return readAllIntoJSONObject(content);
-    }
-
-    private JSONObject readAllIntoJSONObject(InputStream content) throws 
IOException, JSONException {
-        BufferedReader rd = new BufferedReader(new InputStreamReader(content, 
StandardCharsets.UTF_8));
-        String jsonText = IOUtils.toString(rd);
-        return new JSONObject(jsonText);
-    }
-
-}
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/src/main/resources/META-INF/services/org.apache.nifi.processor.Processor
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/src/main/resources/META-INF/services/org.apache.nifi.processor.Processor
deleted file mode 100644
index 8de81e451d..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/src/main/resources/META-INF/services/org.apache.nifi.processor.Processor
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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.
-
-org.apache.nifi.processors.livy.ExecuteSparkInteractive
\ No newline at end of file
diff --git 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/src/test/java/org/apache/nifi/processors/livy/TestExecuteSparkInteractive.java
 
b/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/src/test/java/org/apache/nifi/processors/livy/TestExecuteSparkInteractive.java
deleted file mode 100644
index a9b1eddbf9..0000000000
--- 
a/nifi-nar-bundles/nifi-spark-bundle/nifi-livy-processors/src/test/java/org/apache/nifi/processors/livy/TestExecuteSparkInteractive.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * 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.nifi.processors.livy;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpVersion;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.message.BasicHttpResponse;
-import org.apache.nifi.controller.api.livy.LivySessionService;
-import org.apache.nifi.controller.api.livy.exception.SessionManagerException;
-import org.apache.nifi.controller.livy.LivySessionController;
-import org.apache.nifi.util.MockFlowFile;
-import org.apache.nifi.util.TestRunner;
-import org.apache.nifi.util.TestRunners;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import java.io.IOException;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import static org.mockito.ArgumentMatchers.isA;
-import static org.mockito.Mockito.when;
-
-@ExtendWith(MockitoExtension.class)
-public class TestExecuteSparkInteractive {
-    @Mock
-    private LivySessionService livySessionService;
-
-    @Mock
-    private HttpClient httpClient;
-
-    private TestRunner runner;
-
-    @BeforeEach
-    public void before() throws Exception {
-        final String identifier = LivySessionController.class.getSimpleName();
-        runner = TestRunners.newTestRunner(ExecuteSparkInteractive.class);
-
-        when(livySessionService.getIdentifier()).thenReturn(identifier);
-        runner.addControllerService(identifier, livySessionService);
-        runner.enableControllerService(livySessionService);
-        runner.setProperty(ExecuteSparkInteractive.LIVY_CONTROLLER_SERVICE, 
identifier);
-    }
-
-    @AfterEach
-    public void after() {
-        runner.shutdown();
-    }
-
-    @Test
-    public void testSparkSession() throws SessionManagerException, IOException 
{
-        testCode("print \"hello world\"");
-    }
-
-    @Test
-    public void testSparkSessionWithSpecialChars() throws 
SessionManagerException, IOException {
-        testCode("print \"/'?!<>[]{}()$&*=%;.|_-\\\"");
-    }
-
-    private void testCode(final String code) throws SessionManagerException, 
IOException {
-        runner.enqueue(code);
-        runner.run();
-        runner.assertAllFlowFilesTransferred(ExecuteSparkInteractive.REL_WAIT);
-
-        final String sessionId = "1";
-        final Map<String, String> sessions = new LinkedHashMap<>();
-        sessions.put("sessionId", sessionId);
-        when(livySessionService.getSession()).thenReturn(sessions);
-
-        when(livySessionService.getConnection()).thenReturn(httpClient);
-
-        final HttpResponse jobId = getSuccessResponse();
-        jobId.setEntity(new StringEntity("{\"id\":\"1\"}"));
-        when(httpClient.execute(isA(HttpPost.class))).thenReturn(jobId);
-
-        final HttpResponse jobState = getSuccessResponse();
-        final String dataObject = "{\"completed\":1}";
-        jobState.setEntity(new 
StringEntity(String.format("{\"state\":\"available\", 
\"output\":{\"data\":%s}}", dataObject)));
-        when(httpClient.execute(isA(HttpGet.class))).thenReturn(jobState);
-
-        runner.clearTransferState();
-        runner.enqueue(code);
-        runner.run();
-
-        
runner.assertAllFlowFilesTransferred(ExecuteSparkInteractive.REL_SUCCESS);
-        final MockFlowFile flowFile = 
runner.getFlowFilesForRelationship(ExecuteSparkInteractive.REL_SUCCESS).iterator().next();
-        flowFile.assertContentEquals(dataObject);
-    }
-
-    private HttpResponse getSuccessResponse() {
-        return new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
-    }
-}
diff --git a/nifi-nar-bundles/nifi-spark-bundle/pom.xml 
b/nifi-nar-bundles/nifi-spark-bundle/pom.xml
deleted file mode 100644
index 1c2cf7089b..0000000000
--- a/nifi-nar-bundles/nifi-spark-bundle/pom.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd";>
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-nar-bundles</artifactId>
-        <version>2.0.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>nifi-spark-bundle</artifactId>
-    <packaging>pom</packaging>
-
-    <modules>
-        <module>nifi-livy-nar</module>
-        <module>nifi-livy-controller-service-api-nar</module>
-        <module>nifi-livy-controller-service-api</module>
-        <module>nifi-livy-controller-service</module>
-        <module>nifi-livy-processors</module>
-    </modules>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.codehaus.jettison</groupId>
-                <artifactId>jettison</artifactId>
-                <version>1.5.4</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-configuration</groupId>
-                <artifactId>commons-configuration</artifactId>
-                <version>1.10</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-client</artifactId>
-                <version>1.19.4</version>
-            </dependency>
-            <dependency>
-                <groupId>io.netty</groupId>
-                <artifactId>netty</artifactId>
-                <version>${netty.3.version}</version>
-            </dependency>
-            <!-- Override nimbus-jose-jwt 9.8.1 from hadoop-auth -->
-            <dependency>
-                <groupId>com.nimbusds</groupId>
-                <artifactId>nimbus-jose-jwt</artifactId>
-                <version>9.33</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.nifi</groupId>
-            <artifactId>nifi-utils</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/nifi-nar-bundles/pom.xml b/nifi-nar-bundles/pom.xml
index 2ffa8a1392..28327d78be 100755
--- a/nifi-nar-bundles/pom.xml
+++ b/nifi-nar-bundles/pom.xml
@@ -84,7 +84,6 @@
         <module>nifi-extension-utils</module>
         <module>nifi-ranger-bundle</module>
         <module>nifi-redis-bundle</module>
-        <module>nifi-spark-bundle</module>
         <module>nifi-atlas-bundle</module>
         <module>nifi-network-bundle</module>
         <module>nifi-prometheus-bundle</module>

Reply via email to