Apache Spark
Apache Spark is a high-performance engine for large-scale computing tasks, such as data processing, machine learning and real-time data streaming. It includes APIs for Java, Python, Scala and R.
TL;DR;
helm install my-spark sconeapps/spark
Introduction
This chart bootstraps a spark deployment on a Kubernetes cluster using the Helm package manager.
Prerequisites
- Kubernetes 1.12+
 - Helm 2.12+ or Helm 3.0-beta3+
 
Before you begin
This Chart is a modified version of bitnami/spark using Scone and Intel SGX. Further information og the original chart can be found here.
Attestation
This chart does not submit any sessions to a CAS, so you have to do it beforehand, from a trusted computer. If you need to pass remote attestation information to your container, such as SCONE_CONFIG_ID and SCONE_CAS_ADDR, use the master.extraEnvVars and worker.extraEnvVars parameter on values.yaml.
Installing the Chart
To install the chart with the release name my-spark:
export GH_TOKEN=...
helm repo add sconeapps https://${GH_TOKEN}@raw.githubusercontent.com/scontain/sconeapps/master/
helm install my-spark sconeapps/spark
These commands deploy Spark on the Kubernetes cluster in the default configuration. The Parameters section lists the parameters that can be configured during installation.
Tip: List all releases using
helm list
Uninstalling the Chart
To uninstall/delete the my-spark statefulset:
$ helm delete my-spark
The command removes all the Kubernetes components associated with the chart and deletes the release. Use the option --purge to delete all persistent volumes too.
Parameters
The following tables lists the configurable parameters of the spark chart and their default values.
| Parameter | Description | Default | 
|---|---|---|
global.imageRegistry | 
Global Docker image registry | nil | 
global.imagePullSecrets | 
Global Docker registry secret names as an array | [] (does not add image pull secrets to deployed pods) | 
image.registry | 
spark image registry | docker.io | 
image.repository | 
spark Image name | lucasmc/pyspark | 
image.tag | 
spark Image tag | {TAG_NAME} | 
image.pullPolicy | 
spark image pull policy | IfNotPresent | 
image.pullSecrets | 
Specify docker-registry secret names as an array | [] (does not add image pull secrets to deployed pods) | 
nameOverride | 
String to partially override spark.fullname template with a string (will prepend the release name) | nil | 
fullnameOverride | 
String to fully override spark.fullname template with a string | nil | 
master.debug | 
Specify if debug values should be set on the master | false | 
master.webPort | 
Specify the port where the web interface will listen on the master | 8080 | 
master.clusterPort | 
Specify the port where the master listens to communicate with workers | 7077 | 
master.daemonMemoryLimit | 
Set the memory limit for the master daemon | No default | 
master.configOptions | 
Optional configuration if the form -Dx=y | 
No default | 
master.securityContext.enabled | 
Enable security context | true | 
master.securityContext.fsGroup | 
Group ID for the container | 0 | 
master.securityContext.runAsUser | 
User ID for the container | 0 | 
master.podAnnotations | 
Annotations for pods in StatefulSet | {} (The value is evaluated as a template) | 
master.nodeSelector | 
Node affinity policy | {} (The value is evaluated as a template) | 
master.tolerations | 
Tolerations for pod assignment | [] (The value is evaluated as a template) | 
master.affinity | 
Affinity for pod assignment | {} (The value is evaluated as a template) | 
master.resources | 
CPU/Memory resource requests/limits | {} | 
master.extraEnvVars | 
Extra environment variables to pass to the master container | {} | 
master.extraVolumes | 
Array of extra volumes to be added to the Spark master deployment (evaluated as template). Requires setting master.extraVolumeMounts | 
nil | 
master.extraVolumeMounts | 
Array of extra volume mounts to be added to the Spark master deployment (evaluated as template). Normally used with master.extraVolumes. | 
nil | 
master.useSGXDevPlugin | 
Use SGX Device Plugin to access SGX resources. | scone | 
master.sgxEpcMem | 
Required to Azure SGX Device Plugin. Protected EPC memory in MiB | nil | 
master.livenessProbe.enabled | 
Turn on and off liveness probe | true | 
master.livenessProbe.initialDelaySeconds | 
Delay before liveness probe is initiated | 10 | 
master.livenessProbe.periodSeconds | 
How often to perform the probe | 10 | 
master.livenessProbe.timeoutSeconds | 
When the probe times out | 5 | 
master.livenessProbe.failureThreshold | 
Minimum consecutive failures for the probe to be considered failed after having succeeded. | 2 | 
master.livenessProbe.successThreshold | 
Minimum consecutive successes for the probe to be considered successful after having failed | 1 | 
master.readinessProbe.enabled | 
Turn on and off readiness probe | true | 
master.readinessProbe.initialDelaySeconds | 
Delay before liveness probe is initiated | 5 | 
master.readinessProbe.periodSeconds | 
How often to perform the probe | 10 | 
master.readinessProbe.timeoutSeconds | 
When the probe times out | 5 | 
master.readinessProbe.failureThreshold | 
Minimum consecutive failures for the probe to be considered failed after having succeeded. | 6 | 
master.readinessProbe.successThreshold | 
Minimum consecutive successes for the probe to be considered successful after having failed | 1 | 
worker.debug | 
Specify if debug values should be set on workers | false | 
worker.webPort | 
Specify the port where the web interface will listen on the worker | 8080 | 
worker.clusterPort | 
Specify the port where the worker listens to communicate with the master | 7077 | 
worker.daemonMemoryLimit | 
Set the memory limit for the worker daemon | No default | 
worker.memoryLimit | 
Set the maximum memory the worker is allowed to use | No default | 
worker.coreLimit | 
Se the maximum number of cores that the worker can use | No default | 
worker.dir | 
Set a custom working directory for the application | No default | 
worker.javaOptions | 
Set options for the JVM in the form -Dx=y | 
No default | 
worker.configOptions | 
Set extra options to configure the worker in the form -Dx=y | 
No default | 
worker.replicaCount | 
Set the number of workers | 2 | 
worker.autoscaling.enabled | 
Enable autoscaling depending on CPU | false | 
worker.autoscaling.CpuTargetPercentage | 
k8s hpa cpu targetPercentage | 50 | 
worker.autoscaling.replicasMax | 
Maximum number of workers when using autoscaling | 5 | 
worker.securityContext.enabled | 
Enable security context | true | 
worker.securityContext.fsGroup | 
Group ID for the container | 1001 | 
worker.securityContext.runAsUser | 
User ID for the container | 1001 | 
worker.podAnnotations | 
Annotations for pods in StatefulSet | {} | 
worker.nodeSelector | 
Node labels for pod assignment. Used as a template from the values. | {} | 
worker.tolerations | 
Toleration labels for pod assignment | [] | 
worker.affinity | 
Affinity and AntiAffinity rules for pod assignment | {} | 
worker.resources | 
CPU/Memory resource requests/limits | Memory: 256Mi, CPU: 250m | 
worker.livenessProbe.enabled | 
Turn on and off liveness probe | true | 
worker.livenessProbe.initialDelaySeconds | 
Delay before liveness probe is initiated | 10 | 
worker.livenessProbe.periodSeconds | 
How often to perform the probe | 10 | 
worker.livenessProbe.timeoutSeconds | 
When the probe times out | 5 | 
worker.livenessProbe.failureThreshold | 
Minimum consecutive failures for the probe to be considered failed after having succeeded. | 2 | 
worker.livenessProbe.successThreshold | 
Minimum consecutive successes for the probe to be considered successful after having failed | 1 | 
worker.readinessProbe.enabled | 
Turn on and off readiness probe | true | 
worker.readinessProbe.initialDelaySeconds | 
Delay before liveness probe is initiated | 5 | 
worker.readinessProbe.periodSeconds | 
How often to perform the probe | 10 | 
worker.readinessProbe.timeoutSeconds | 
When the probe times out | 5 | 
worker.readinessProbe.failureThreshold | 
Minimum consecutive failures for the probe to be considered failed after having succeeded. | 6 | 
worker.readinessProbe.successThreshold | 
Minimum consecutive successes for the probe to be considered successful after having failed | 1 | 
worker.extraEnvVars | 
Extra environment variables to pass to the worker container | {} | 
worker.extraVolumes | 
Array of extra volumes to be added to the Spark worker deployment (evaluated as template). Requires setting worker.extraVolumeMounts | 
nil | 
worker.extraVolumeMounts | 
Array of extra volume mounts to be added to the Spark worker deployment (evaluated as template). Normally used with worker.extraVolumes. | 
nil | 
worker.useSGXDevPlugin | 
Use SGX Device Plugin to access SGX resources. | scone | 
worker.sgxEpcMem | 
Required to Azure SGX Device Plugin. Protected EPC memory in MiB | nil | 
security.passwordsSecretName | 
Secret to use when using security configuration to set custom passwords | No default | 
security.rpc.authenticationEnabled | 
Enable the RPC authentication | false | 
security.rpc.encryptionEnabled | 
Enable the encryption for RPC | false | 
security.storageEncryptionEnabled | 
Enable the encryption of the storage | false | 
security.ssl.enabled | 
Enable the SSL configuration | false | 
security.ssl.needClientAuth | 
Enable the client authentication | false | 
security.ssl.protocol | 
Set the SSL protocol | TLSv1.2 | 
security.certificatesSecretName | 
Set the name of the secret that contains the certificates | No default | 
service.type | 
Kubernetes Service type | ClusterIP | 
service.webPort | 
Spark client port | 80 | 
service.clusterPort | 
Spark cluster port | 7077 | 
service.nodePort | 
Port to bind to for NodePort service type (client port) | nil | 
service.nodePorts.cluster | 
Kubernetes cluster node port | "" | 
service.nodePorts.web | 
Kubernetes web node port | "" | 
service.annotations | 
Annotations for spark service | {} | 
service.loadBalancerIP | 
loadBalancerIP if spark service type is LoadBalancer | 
nil | 
ingress.enabled | 
Enable the use of the ingress controller to access the web UI | false | 
ingress.certManager | 
Add annotations for cert-manager | false | 
ingress.annotations | 
Ingress annotations | {} | 
ingress.hosts[0].name | 
Hostname to your Spark installation | spark.local | 
ingress.hosts[0].path | 
Path within the url structure | / | 
ingress.hosts[0].tls | 
Utilize TLS backend in ingress | false | 
ingress.hosts[0].tlsHosts | 
Array of TLS hosts for ingress record (defaults to ingress.hosts[0].name if nil) | 
nil | 
ingress.hosts[0].tlsSecret | 
TLS Secret (certificates) | spark.local-tls | 
Specify each parameter using the --set key=value[,key=value] argument to helm install. For example,
helm install my-spark \
  --set master.webPort=8081 sconeapps/spark
The above command sets the spark master web port to 8081.
Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
$ helm install my-spark -f values.yaml sconeapps/spark
One can use the default values.yaml in the SconeApps repo
Configuration and installation details
Rolling VS Immutable tags
It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image.
Submit an application
To submit an application to the cluster use the spark-submit script. You can obtain the script here. For example, to deploy one of the example applications:
$ ./bin/spark-submit   --class org.apache.spark.examples.SparkPi   --master spark://<master-IP>:<master-cluster-port>   --deploy-mode cluster  ./examples/jars/spark-examples_2.11-2.4.3.jar   1000
Where the master IP and port must be changed by you master IP address and port.
Be aware that currently is not possible to submit an application to a standalone cluster if RPC authentication is configured. More info about the issue here.