Skip to content
This repository was archived by the owner on Jan 9, 2020. It is now read-only.

[SPARK-18278] Minimal support for submitting to Kubernetes. #1

Closed
wants to merge 80 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
d36d223
[SPARK-18278] Minimal support for submitting to Kubernetes.
mccheah Dec 6, 2016
d379a3a
Fix style
mccheah Dec 6, 2016
8ce7f78
Make naming more consistent
mccheah Dec 7, 2016
c9d0039
Fix building assembly with Kubernetes.
mccheah Dec 9, 2016
08f4421
Service account support, use constants from fabric8 library.
mccheah Dec 10, 2016
2683894
Some small changes
mccheah Jan 7, 2017
6ffa5b2
Use k8s:// formatted URL instead of separate setting.
mccheah Jan 9, 2017
8d217c5
Merge remote-tracking branch 'apache/master' into k8s-support-alterna…
mccheah Jan 9, 2017
7de958b
Reindent comment to conforn to JavaDoc style
foxish Jan 9, 2017
0d89026
Move kubernetes under resource-managers folder.
mccheah Jan 9, 2017
4b158bb
Merge remote-tracking branch 'apache-spark-on-k8s/k8s-support-alterna…
mccheah Jan 9, 2017
697a35a
Use tar and gzip to compress+archive shipped jars (#2)
mccheah Jan 11, 2017
40cf4ea
Use alpine and java 8 for docker images. (#10)
mccheah Jan 12, 2017
ad9adde
Copy the Dockerfiles from docker-minimal-bundle into the distribution…
mccheah Jan 12, 2017
c155909
inherit IO (#13)
foxish Jan 12, 2017
015d2c8
Error messages when the driver container fails to start. (#11)
mccheah Jan 13, 2017
6a939e2
Fix linter error to make CI happy (#18)
foxish Jan 13, 2017
5c6650d
Documentation for the current state of the world (#16)
mccheah Jan 13, 2017
6d8c763
Development workflow documentation for the current state of the world…
mccheah Jan 13, 2017
98b5edc
Added service name as prefix to executor pods (#14)
foxish Jan 13, 2017
4c24d9b
Add kubernetes profile to travis CI yml file (#21)
kimoonkim Jan 14, 2017
2a093a8
Improved the example commands in running-on-k8s document. (#25)
lins05 Jan 17, 2017
486bdbe
Fix spacing for command highlighting (#31)
foxish Jan 18, 2017
fd84fca
Support custom labels on the driver pod. (#27)
mccheah Jan 19, 2017
93f4cdc
Make pod name unique using the submission timestamp (#32)
foxish Jan 19, 2017
46cda32
A number of small tweaks to the MVP. (#23)
mccheah Jan 24, 2017
45b6ec3
Correct hadoop profile: hadoop2.7 -> hadoop-2.7 (#41)
ash211 Jan 25, 2017
c480574
Support setting the driver pod launching timeout. (#36)
lins05 Jan 25, 2017
7237d39
Sanitize kubernetesAppId for use in secret, service, and pod names (#45)
ash211 Jan 25, 2017
2f0eb4b
Support spark.driver.extraJavaOptions (#48)
kimoonkim Jan 26, 2017
4df2fae
Use "extraScalaTestArgs" to pass extra options to scalatest. (#52)
lins05 Jan 26, 2017
37b6014
Use OpenJDK8's official Alpine image. (#51)
mccheah Jan 26, 2017
bc0be32
Remove unused driver extra classpath upload code (#54)
mccheah Jan 26, 2017
422dceb
Fix k8s integration tests (#44)
lins05 Jan 27, 2017
c3428f7
Added GC to components (#56)
foxish Jan 27, 2017
ccb2e2f
Create README to better describe project purpose (#50)
ash211 Jan 28, 2017
4a2a002
Access the Driver Launcher Server over NodePort for app launch + subm…
mccheah Jan 30, 2017
a4abee3
Extract constants and config into separate file. Launch => Submit. (#65)
mccheah Jan 31, 2017
0c3ff11
Retry the submit-application request to multiple nodes (#69)
mccheah Feb 2, 2017
42819f7
Allow adding arbitrary files (#71)
mccheah Feb 2, 2017
43c918c
Fix NPE around unschedulable pod specs (#79)
ash211 Feb 2, 2017
5ffbac2
Introduce blocking submit to kubernetes by default (#53)
ash211 Feb 3, 2017
a175f7a
Do not wait for pod finishing in integration tests. (#84)
lins05 Feb 3, 2017
69c8270
Check for user jars/files existence before creating the driver pod. (…
lins05 Feb 8, 2017
b1466e6
Use readiness probe instead of client-side ping. (#75)
mccheah Feb 9, 2017
868f830
Note integration tests require Java 8 (#99)
ash211 Feb 10, 2017
42b72c5
Bumping up kubernetes-client version to fix GKE and local proxy (#105)
foxish Feb 10, 2017
6e26102
Truncate k8s hostnames to be no longer than 63 characters (#102)
ash211 Feb 11, 2017
d297df9
Fixed loading the executors page through the kubectl proxy. (#95)
lins05 Feb 13, 2017
f374892
Filter nodes to only try and send files to external IPs (#106)
foxish Feb 13, 2017
d47c4d7
Parse results of minikube status more rigorously (#97)
ash211 Feb 13, 2017
8b31beb
Adding legacyHostIP to the list of IPs we look at (#114)
foxish Feb 14, 2017
806b3b1
Add -DskipTests to dev docs (#115)
ash211 Feb 15, 2017
84f147b
Shutdown the thread scheduler in LoggingPodStatusWatcher on receiving…
varunkatta Feb 16, 2017
9d250a2
Trigger scalatest plugin in the integration-test phase (#93)
kimoonkim Feb 16, 2017
4df5821
Fix issue with DNS resolution (#118)
foxish Feb 16, 2017
51df502
Change the API contract for uploading local files (#107)
mccheah Feb 16, 2017
25a209b
Optionally expose the driver UI port as NodePort (#131)
kimoonkim Feb 22, 2017
a4bc800
Set the REST service's exit code to the exit code of its driver subpr…
ash211 Feb 23, 2017
913a60e
Pass the actual iterable from the option to get files (#139)
mccheah Feb 23, 2017
452f8f1
Use a separate class to track components that need to be cleaned up (…
mccheah Feb 23, 2017
0a22b35
Enable unit tests in Travis CI build (#132)
kimoonkim Feb 23, 2017
622bfdb
Change driver pod's restart policy from OnFailure to Never (#145)
ash211 Feb 23, 2017
1f8fca0
Extract SSL configuration handling to a separate class (#123)
mccheah Feb 24, 2017
fb9a26e
Exclude known flaky tests (#156)
kimoonkim Feb 24, 2017
d81c084
Richer logging and better error handling in driver pod watch (#154)
foxish Feb 24, 2017
82275ae
Document blocking submit calls (#152)
ash211 Feb 25, 2017
21fb9b7
Allow custom annotations on the driver pod. (#163)
mccheah Mar 2, 2017
4f12335
Update client version & minikube version (#142)
foxish Mar 2, 2017
f0a40b8
Allow customizing external URI provision + External URI can be set vi…
mccheah Mar 3, 2017
8336465
Remove okhttp from top-level pom (#166)
foxish Mar 3, 2017
f6823f3
Allow setting memory on the driver submission server. (#161)
mccheah Mar 3, 2017
6556451
Add a section for prerequisites (#171)
foxish Mar 4, 2017
4e72392
Add instructions to find master URL (#169)
foxish Mar 4, 2017
f27885a
Propagate exceptions (#172)
mccheah Mar 6, 2017
c118f47
Logging for resource deletion (#170)
ash211 Mar 6, 2017
e5da90d
Docs improvements (#176)
foxish Mar 8, 2017
2a61438
Add Apache license to a few files (#175)
ash211 Mar 8, 2017
be109ab
Adding clarification pre-alpha (#181)
foxish Mar 8, 2017
1aba361
Allow providing an OAuth token for authenticating against k8s (#180)
mccheah Mar 13, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 17 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,22 @@
sudo: required
dist: trusty

# 2. Choose language and target JDKs for parallel builds.
# 2. Choose language, target JDK and env's for parallel builds.
language: java
jdk:
- oraclejdk7
- oraclejdk8
env: # Used by the install section below.
# Configure the unit test build for spark core and kubernetes modules,
# while excluding some flaky unit tests using a regex pattern.
- PHASE=test \
PROFILES="-Pmesos -Pyarn -Phadoop-2.7 -Pkubernetes" \
MODULES="-pl core,resource-managers/kubernetes/core -am" \
ARGS="-Dtest=none -Dsuffixes='^org\.apache\.spark\.(?!SortShuffleSuite$|rdd\.LocalCheckpointSuite$|deploy\.SparkSubmitSuite$|deploy\.StandaloneDynamicAllocationSuite$).*'"
# Configure the full build.
- PHASE=install \
PROFILES="-Pmesos -Pyarn -Phadoop-2.7 -Pkubernetes -Pkinesis-asl -Phive -Phive-thriftserver" \
MODULES="" \
ARGS="-T 4 -q -DskipTests"

# 3. Setup cache directory for SBT and Maven.
cache:
Expand All @@ -41,11 +52,12 @@ cache:
notifications:
email: false

# 5. Run maven install before running lint-java.
# 5. Run maven build before running lints.
install:
- export MAVEN_SKIP_RC=1
- build/mvn -T 4 -q -DskipTests -Pmesos -Pyarn -Phadoop-2.3 -Pkinesis-asl -Phive -Phive-thriftserver install
- build/mvn ${PHASE} ${PROFILES} ${MODULES} ${ARGS}

# 6. Run lint-java.
# 6. Run lints.
script:
- dev/lint-java
- dev/lint-scala
38 changes: 38 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,41 @@
# Apache Spark On Kubernetes

This repository, located at https://github.com/apache-spark-on-k8s/spark, contains a fork of Apache Spark that enables running Spark jobs natively on a Kubernetes cluster.

## What is this?

This is a collaboratively maintained project working on [SPARK-18278](https://issues.apache.org/jira/browse/SPARK-18278). The goal is to bring native support for Spark to use Kubernetes as a cluster manager, in a fully supported way on par with the Spark Standalone, Mesos, and Apache YARN cluster managers.

## Getting Started

- [Usage guide](docs/running-on-kubernetes.md) shows how to run the code
- [Development docs](resource-managers/kubernetes/README.md) shows how to get set up for development
- Code is primarily located in the [resource-managers/kubernetes](resource-managers/kubernetes) folder

## Why does this fork exist?

Adding native integration for a new cluster manager is a large undertaking. If poorly executed, it could introduce bugs into Spark when run on other cluster managers, cause release blockers slowing down the overall Spark project, or require hotfixes which divert attention away from development towards managing additional releases. Any work this deep inside Spark needs to be done carefully to minimize the risk of those negative externalities.

At the same time, an increasing number of people from various companies and organizations desire to work together to natively run Spark on Kubernetes. The group needs a code repository, communication forum, issue tracking, and continuous integration, all in order to work together effectively on an open source product.

We've been asked by an Apache Spark Committer to work outside of the Apache infrastructure for a short period of time to allow this feature to be hardened and improved without creating risk for Apache Spark. The aim is to rapidly bring it to the point where it can be brought into the mainline Apache Spark repository for continued development within the Apache umbrella. If all goes well, this should be a short-lived fork rather than a long-lived one.

## Who are we?

This is a collaborative effort by several folks from different companies who are interested in seeing this feature be successful. Companies active in this project include (alphabetically):

- Google
- Haiwen
- Hyperpilot
- Intel
- Palantir
- Pepperdata
- Red Hat

--------------------

(original README below)

# Apache Spark

Spark is a fast and general cluster computing system for Big Data. It provides
Expand Down
10 changes: 10 additions & 0 deletions assembly/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,16 @@
</dependency>
</dependencies>
</profile>
<profile>
<id>kubernetes</id>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-kubernetes_${scala.binary.version}</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</profile>
<profile>
<id>hive</id>
<dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,28 @@ $(document).ajaxStart(function () {
$.blockUI({message: '<h3>Loading Executors Page...</h3>'});
});

function findKubernetesServiceBaseURI() {
var k8sProxyPattern = '/api/v1/proxy/namespaces/';
var k8sProxyPatternPos = document.baseURI.indexOf(k8sProxyPattern);
if (k8sProxyPatternPos > 0) {
// Spark is running in a kubernetes cluster, and the web ui is served
// through the kubectl proxy.
var remaining = document.baseURI.substr(k8sProxyPatternPos + k8sProxyPattern.length);
var urlSlashesCount = remaining.split('/').length - 3;
var words = document.baseURI.split('/');
var baseURI = words.slice(0, words.length - urlSlashesCount).join('/');
return baseURI;
}

return null;
}

function createTemplateURI(appId) {
var kubernetesBaseURI = findKubernetesServiceBaseURI();
if (kubernetesBaseURI) {
return kubernetesBaseURI + '/static/executorspage-template.html';
}

var words = document.baseURI.split('/');
var ind = words.indexOf("proxy");
if (ind > 0) {
Expand All @@ -70,6 +91,14 @@ function createTemplateURI(appId) {
}

function getStandAloneppId(cb) {
var kubernetesBaseURI = findKubernetesServiceBaseURI();
if (kubernetesBaseURI) {
var appIdAndPort = kubernetesBaseURI.split('/').slice(-1)[0];
var appId = appIdAndPort.split(':')[0];
cb(appId);
return;
}

var words = document.baseURI.split('/');
var ind = words.indexOf("proxy");
if (ind > 0) {
Expand All @@ -95,6 +124,11 @@ function getStandAloneppId(cb) {
}

function createRESTEndPoint(appId) {
var kubernetesBaseURI = findKubernetesServiceBaseURI();
if (kubernetesBaseURI) {
return kubernetesBaseURI + "/api/v1/applications/" + appId + "/allexecutors";
}

var words = document.baseURI.split('/');
var ind = words.indexOf("proxy");
if (ind > 0) {
Expand Down
31 changes: 25 additions & 6 deletions core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ object SparkSubmit extends CommandLineUtils {
private val STANDALONE = 2
private val MESOS = 4
private val LOCAL = 8
private val ALL_CLUSTER_MGRS = YARN | STANDALONE | MESOS | LOCAL
private val KUBERNETES = 16
private val ALL_CLUSTER_MGRS = YARN | STANDALONE | MESOS | KUBERNETES | LOCAL

// Deploy modes
private val CLIENT = 1
Expand Down Expand Up @@ -229,9 +230,10 @@ object SparkSubmit extends CommandLineUtils {
YARN
case m if m.startsWith("spark") => STANDALONE
case m if m.startsWith("mesos") => MESOS
case m if m.startsWith("k8s") => KUBERNETES
case m if m.startsWith("local") => LOCAL
case _ =>
printErrorAndExit("Master must either be yarn or start with spark, mesos, local")
printErrorAndExit("Master must either be yarn or start with spark, mesos, k8s, or local")
-1
}

Expand Down Expand Up @@ -274,6 +276,7 @@ object SparkSubmit extends CommandLineUtils {
}
val isYarnCluster = clusterManager == YARN && deployMode == CLUSTER
val isMesosCluster = clusterManager == MESOS && deployMode == CLUSTER
val isKubernetesCluster = clusterManager == KUBERNETES && deployMode == CLUSTER

// Resolve maven dependencies if there are any and add classpath to jars. Add them to py-files
// too for packages that include Python code
Expand Down Expand Up @@ -320,6 +323,10 @@ object SparkSubmit extends CommandLineUtils {

// The following modes are not supported or applicable
(clusterManager, deployMode) match {
case (KUBERNETES, CLIENT) =>
printErrorAndExit("Client mode is currently not supported for Kubernetes.")
case (KUBERNETES, CLUSTER) if args.isPython || args.isR =>
printErrorAndExit("Kubernetes does not currently support python or R applications.")
case (STANDALONE, CLUSTER) if args.isPython =>
printErrorAndExit("Cluster deploy mode is currently not supported for python " +
"applications on standalone clusters.")
Expand Down Expand Up @@ -453,17 +460,21 @@ object SparkSubmit extends CommandLineUtils {
OptionAssigner(args.principal, YARN, ALL_DEPLOY_MODES, sysProp = "spark.yarn.principal"),
OptionAssigner(args.keytab, YARN, ALL_DEPLOY_MODES, sysProp = "spark.yarn.keytab"),

// Other options
OptionAssigner(args.kubernetesNamespace, KUBERNETES, ALL_DEPLOY_MODES,
sysProp = "spark.kubernetes.namespace"),

// Other options
OptionAssigner(args.executorCores, STANDALONE | YARN, ALL_DEPLOY_MODES,
sysProp = "spark.executor.cores"),
OptionAssigner(args.executorMemory, STANDALONE | MESOS | YARN, ALL_DEPLOY_MODES,
sysProp = "spark.executor.memory"),
OptionAssigner(args.totalExecutorCores, STANDALONE | MESOS, ALL_DEPLOY_MODES,
sysProp = "spark.cores.max"),
OptionAssigner(args.files, LOCAL | STANDALONE | MESOS, ALL_DEPLOY_MODES,
OptionAssigner(args.files, LOCAL | STANDALONE | MESOS | KUBERNETES, ALL_DEPLOY_MODES,
sysProp = "spark.files"),
OptionAssigner(args.jars, LOCAL, CLIENT, sysProp = "spark.jars"),
OptionAssigner(args.jars, STANDALONE | MESOS, ALL_DEPLOY_MODES, sysProp = "spark.jars"),
OptionAssigner(args.jars, STANDALONE | MESOS | KUBERNETES, ALL_DEPLOY_MODES,
sysProp = "spark.jars"),
OptionAssigner(args.driverMemory, STANDALONE | MESOS | YARN, CLUSTER,
sysProp = "spark.driver.memory"),
OptionAssigner(args.driverCores, STANDALONE | MESOS | YARN, CLUSTER,
Expand Down Expand Up @@ -496,8 +507,9 @@ object SparkSubmit extends CommandLineUtils {

// Add the application jar automatically so the user doesn't have to call sc.addJar
// For YARN cluster mode, the jar is already distributed on each node as "app.jar"
// In Kubernetes cluster mode, the jar will be uploaded by the client separately.
// For python and R files, the primary resource is already distributed as a regular file
if (!isYarnCluster && !args.isPython && !args.isR) {
if (!isYarnCluster && !isKubernetesCluster && !args.isPython && !args.isR) {
var jars = sysProps.get("spark.jars").map(x => x.split(",").toSeq).getOrElse(Seq.empty)
if (isUserJar(args.primaryResource)) {
jars = jars ++ Seq(args.primaryResource)
Expand Down Expand Up @@ -596,6 +608,13 @@ object SparkSubmit extends CommandLineUtils {
}
}

if (isKubernetesCluster) {
childMainClass = "org.apache.spark.deploy.kubernetes.Client"
childArgs += args.primaryResource
childArgs += args.mainClass
childArgs ++= args.childArgs
}

// Load any properties specified through --conf and the default properties file
for ((k, v) <- args.sparkProperties) {
sysProps.getOrElseUpdate(k, v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ private[deploy] class SparkSubmitArguments(args: Seq[String], env: Map[String, S
var principal: String = null
var keytab: String = null

// Kubernetes only
var kubernetesNamespace: String = null

// Standalone cluster mode only
var supervise: Boolean = false
var driverCores: String = null
Expand Down Expand Up @@ -186,6 +189,9 @@ private[deploy] class SparkSubmitArguments(args: Seq[String], env: Map[String, S
.getOrElse(sparkProperties.get("spark.executor.instances").orNull)
keytab = Option(keytab).orElse(sparkProperties.get("spark.yarn.keytab")).orNull
principal = Option(principal).orElse(sparkProperties.get("spark.yarn.principal")).orNull
kubernetesNamespace = Option(kubernetesNamespace)
.orElse(sparkProperties.get("spark.kubernetes.namespace"))
.orNull

// Try to set main class from JAR if no --class argument is given
if (mainClass == null && !isPython && !isR && primaryResource != null) {
Expand Down Expand Up @@ -424,6 +430,9 @@ private[deploy] class SparkSubmitArguments(args: Seq[String], env: Map[String, S
case KEYTAB =>
keytab = value

case KUBERNETES_NAMESPACE =>
kubernetesNamespace = value

case HELP =>
printUsageAndExit(0)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ package org.apache.spark.deploy.rest

import javax.servlet.http.{HttpServlet, HttpServletRequest, HttpServletResponse}

import scala.io.Source

import com.fasterxml.jackson.core.JsonProcessingException
import org.eclipse.jetty.server.{HttpConnectionFactory, Server, ServerConnector}
import org.eclipse.jetty.http.HttpVersion
import org.eclipse.jetty.server.{HttpConfiguration, HttpConnectionFactory, Server, ServerConnector, SslConnectionFactory}
import org.eclipse.jetty.servlet.{ServletContextHandler, ServletHolder}
import org.eclipse.jetty.util.thread.{QueuedThreadPool, ScheduledExecutorScheduler}
import org.json4s._
import org.json4s.jackson.JsonMethods._
import scala.io.Source

import org.apache.spark.{SPARK_VERSION => sparkVersion, SparkConf}
import org.apache.spark.{SPARK_VERSION => sparkVersion, SparkConf, SSLOptions}
import org.apache.spark.internal.Logging
import org.apache.spark.util.Utils

Expand All @@ -50,7 +50,8 @@ import org.apache.spark.util.Utils
private[spark] abstract class RestSubmissionServer(
val host: String,
val requestedPort: Int,
val masterConf: SparkConf) extends Logging {
val masterConf: SparkConf,
val sslOptions: SSLOptions = SSLOptions()) extends Logging {
protected val submitRequestServlet: SubmitRequestServlet
protected val killRequestServlet: KillRequestServlet
protected val statusRequestServlet: StatusRequestServlet
Expand Down Expand Up @@ -79,19 +80,32 @@ private[spark] abstract class RestSubmissionServer(
* Return a 2-tuple of the started server and the bound port.
*/
private def doStart(startPort: Int): (Server, Int) = {
// TODO consider using JettyUtils#startServer to do this instead
val threadPool = new QueuedThreadPool
threadPool.setDaemon(true)
val server = new Server(threadPool)

val resolvedConnectionFactories = sslOptions
.createJettySslContextFactory()
.map(sslFactory => {
val sslConnectionFactory = new SslConnectionFactory(
sslFactory, HttpVersion.HTTP_1_1.asString())
val rawHttpConfiguration = new HttpConfiguration()
rawHttpConfiguration.setSecureScheme("https")
rawHttpConfiguration.setSecurePort(startPort)
val rawHttpConnectionFactory = new HttpConnectionFactory(rawHttpConfiguration)
Array(sslConnectionFactory, rawHttpConnectionFactory)
}).getOrElse(Array(new HttpConnectionFactory()))

val connector = new ServerConnector(
server,
null,
// Call this full constructor to set this, which forces daemon threads:
new ScheduledExecutorScheduler("RestSubmissionServer-JettyScheduler", true),
null,
-1,
-1,
new HttpConnectionFactory())
server,
null,
// Call this full constructor to set this, which forces daemon threads:
new ScheduledExecutorScheduler("RestSubmissionServer-JettyScheduler", true),
null,
-1,
-1,
resolvedConnectionFactories: _*)
connector.setHost(host)
connector.setPort(startPort)
server.addConnector(connector)
Expand Down
1 change: 1 addition & 0 deletions dev/.rat-excludes
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,4 @@ org.apache.spark.scheduler.ExternalClusterManager
org.apache.spark.deploy.yarn.security.ServiceCredentialProvider
spark-warehouse
structured-streaming/*
org.apache.spark.deploy.rest.kubernetes.DriverServiceManager
7 changes: 7 additions & 0 deletions dev/make-distribution.sh
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,13 @@ echo "Build flags: $@" >> "$DISTDIR/RELEASE"
# Copy jars
cp "$SPARK_HOME"/assembly/target/scala*/jars/* "$DISTDIR/jars/"

# Copy docker files
mkdir -p "$DISTDIR/dockerfiles/driver"
mkdir -p "$DISTDIR/dockerfiles/executor"
DOCKERFILES_SRC="$SPARK_HOME/resource-managers/kubernetes/docker-minimal-bundle/src/main/docker"
cp "$DOCKERFILES_SRC/driver/Dockerfile" "$DISTDIR/dockerfiles/driver/Dockerfile"
cp "$DOCKERFILES_SRC/executor/Dockerfile" "$DISTDIR/dockerfiles/executor/Dockerfile"

# Only create the yarn directory if the yarn artifacts were build.
if [ -f "$SPARK_HOME"/common/network-yarn/target/scala*/spark-*-yarn-shuffle.jar ]; then
mkdir "$DISTDIR"/yarn
Expand Down
2 changes: 2 additions & 0 deletions dev/scalastyle
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ ERRORS=$(echo -e "q\n" \
-Pyarn \
-Phive \
-Phive-thriftserver \
-Pkubernetes \
-Pkubernetes-integration-tests \
scalastyle test:scalastyle \
| awk '{if($1~/error/)print}' \
)
Expand Down
1 change: 1 addition & 0 deletions docs/_layouts/global.html
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
<li><a href="spark-standalone.html">Spark Standalone</a></li>
<li><a href="running-on-mesos.html">Mesos</a></li>
<li><a href="running-on-yarn.html">YARN</a></li>
<li><a href="running-on-kubernetes.html">Kubernetes</a></li>
</ul>
</li>

Expand Down
1 change: 1 addition & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ options for deployment:
* [Mesos](running-on-mesos.html): deploy a private cluster using
[Apache Mesos](http://mesos.apache.org)
* [YARN](running-on-yarn.html): deploy Spark on top of Hadoop NextGen (YARN)
* [Kubernetes](running-on-kubernetes.html): deploy Spark on top of Kubernetes

**Other Documents:**

Expand Down
Loading