Skip to content

Commit d1d32b4

Browse files
committed
Use an nginx server for remote jars
1 parent e24ecda commit d1d32b4

File tree

8 files changed

+69
-6
lines changed

8 files changed

+69
-6
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
.idea/
22
spark/
3+
spark
34
integration-test/target/
45
*.class
56
*.log

e2e/runner.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,28 +90,39 @@ git checkout -B $BRANCH origin/$BRANCH
9090
TAG=$(git rev-parse HEAD | cut -c -6)
9191
echo "Spark distribution built at SHA $TAG"
9292

93+
FILE_SERVER_IMAGE="$IMAGE_REPO/spark-examples-file-server:$TAG"
94+
FILE_SERVER_BUILD_DIR="$TEST_ROOT/integration-test/docker-file-server"
95+
rm -rf $FILE_SERVER_BUILD_DIR/jars
96+
mkdir -p $FILE_SERVER_BUILD_DIR/jars
97+
cp $SPARK_REPO_ROOT/dist/examples/jars/spark-examples*.jar $FILE_SERVER_BUILD_DIR/jars/.
9398
cd $SPARK_REPO_ROOT/dist
9499

95100
if [[ $DEPLOY_MODE == cloud ]] ;
96101
then
102+
docker build -t $FILE_SERVER_IMAGE "$TEST_ROOT/integration-test/docker-file-server"
97103
./sbin/build-push-docker-images.sh -r $IMAGE_REPO -t $TAG build
98104
if [[ $IMAGE_REPO == gcr.io* ]] ;
99105
then
100106
gcloud docker -- push $IMAGE_REPO/spark-driver:$TAG && \
101107
gcloud docker -- push $IMAGE_REPO/spark-executor:$TAG && \
102108
gcloud docker -- push $IMAGE_REPO/spark-init:$TAG
109+
gcloud docker -- push $FILE_SERVER_IMAGE
103110
else
104111
./sbin/build-push-docker-images.sh -r $IMAGE_REPO -t $TAG push
112+
docker push $FILE_SERVER_IMAGE
105113
fi
106114
else
107115
# -m option for minikube.
116+
eval $(minikube docker-env)
117+
docker build -t $FILE_SERVER_IMAGE "$TEST_ROOT/integration-test/docker-file-server"
108118
./sbin/build-push-docker-images.sh -m -r $IMAGE_REPO -t $TAG build
109119
fi
110120

111121
cd $TEST_ROOT/integration-test
112122
$SPARK_REPO_ROOT/build/mvn clean -Ddownload.plugin.skip=true integration-test \
113123
-Dspark-distro-tgz=$SPARK_REPO_ROOT/*.tgz \
114124
-DextraScalaTestArgs="-Dspark.kubernetes.test.master=k8s://$MASTER \
125+
-Dspark.docker.test.fileServerImage=$FILE_SERVER_IMAGE \
115126
-Dspark.docker.test.driverImage=$IMAGE_REPO/spark-driver:$TAG \
116127
-Dspark.docker.test.executorImage=$IMAGE_REPO/spark-executor:$TAG \
117128
-Dspark.docker.test.initContainerImage=$IMAGE_REPO/spark-init:$TAG" || :
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
jars
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
FROM nginx:alpine
2+
3+
COPY jars /opt/spark/jars
4+
COPY nginx.conf /etc/nginx/nginx.conf
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
user nginx;
2+
worker_processes 1;
3+
4+
error_log /var/log/nginx/error.log warn;
5+
pid /var/run/nginx.pid;
6+
7+
events {
8+
worker_connections 1024;
9+
}
10+
11+
http {
12+
server {
13+
root /opt/spark/jars;
14+
location /ping {
15+
return 200 'pong';
16+
add_header Content-Type text/plain;
17+
}
18+
}
19+
include /etc/nginx/mime.types;
20+
default_type application/octet-stream;
21+
22+
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
23+
'$status $body_bytes_sent "$http_referer" '
24+
'"$http_user_agent" "$http_x_forwarded_for"';
25+
26+
access_log /var/log/nginx/access.log main;
27+
28+
sendfile on;
29+
#tcp_nopush on;
30+
31+
keepalive_timeout 65;
32+
33+
#gzip on;
34+
}

integration-test/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@
135135
<executable>/bin/sh</executable>
136136
<arguments>
137137
<argument>-c</argument>
138-
<argument>rm -rf spark-distro; mkdir spark-distro-tmp; cd spark-distro-tmp; tar xfz ${spark-distro-tgz}; mv * ../spark-distro; cd ..; rm -rf spark-distro-tmp</argument>
138+
<argument>rm -rf spark-distro; mkdir spark-distro-tmp; cd spark-distro-tmp; tar xfz ${spark-distro-tgz}; mv * ../spark-distro; cd ..; rm -rf spark-distro-tmp; rm -rf docker-file-server/jars; mkdir -p docker-file-server/jars; cp spark-distro/examples/jars/spark-examples*.jar docker-file-server/jars/.</argument>
139139
</arguments>
140140
</configuration>
141141
</execution>

integration-test/src/test/scala/org/apache/spark/deploy/k8s/integrationtest/KubernetesSuite.scala

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
package org.apache.spark.deploy.k8s.integrationtest
1818

1919
import java.io.File
20+
import java.net.URI
2021
import java.nio.file.Paths
2122
import java.util.UUID
2223
import java.util.regex.Pattern
2324

2425
import scala.collection.JavaConverters._
25-
2626
import com.google.common.io.PatternFilenameFilter
2727
import io.fabric8.kubernetes.api.model.{Container, Pod}
2828
import org.scalatest.{BeforeAndAfter, BeforeAndAfterAll, FunSuite}
@@ -39,6 +39,7 @@ private[spark] class KubernetesSuite extends FunSuite with BeforeAndAfterAll wit
3939
private val APP_LOCATOR_LABEL = UUID.randomUUID().toString.replaceAll("-", "")
4040
private var kubernetesTestComponents: KubernetesTestComponents = _
4141
private var sparkAppConf: SparkAppConf = _
42+
private var remoteExamplesJarUri: URI = _
4243

4344
private val driverImage = System.getProperty(
4445
"spark.docker.test.driverImage",
@@ -50,7 +51,6 @@ private[spark] class KubernetesSuite extends FunSuite with BeforeAndAfterAll wit
5051
"spark.docker.test.initContainerImage",
5152
"spark-init:latest")
5253

53-
5454
override def beforeAll(): Unit = {
5555
testBackend.initialize()
5656
kubernetesTestComponents = new KubernetesTestComponents(testBackend.getKubernetesClient)
@@ -67,6 +67,8 @@ private[spark] class KubernetesSuite extends FunSuite with BeforeAndAfterAll wit
6767
.set("spark.kubernetes.driver.label.spark-app-locator", APP_LOCATOR_LABEL)
6868
.set("spark.kubernetes.executor.label.spark-app-locator", APP_LOCATOR_LABEL)
6969
kubernetesTestComponents.createNamespace()
70+
remoteExamplesJarUri = SparkExamplesFileServerRunner
71+
.launchServerAndGetUriForExamplesJar(kubernetesTestComponents)
7072
}
7173

7274
after {
@@ -97,6 +99,11 @@ private[spark] class KubernetesSuite extends FunSuite with BeforeAndAfterAll wit
9799
runSparkPiAndVerifyCompletion(appArgs = Array("5"))
98100
}
99101

102+
test("Run SparkPi using the remote example jar.") {
103+
sparkAppConf.set("spark.kubernetes.initContainer.image", initContainerImage)
104+
runSparkPiAndVerifyCompletion(appResource = remoteExamplesJarUri.toString)
105+
}
106+
100107
test("Run SparkPi with custom driver pod name, labels, annotations, and environment variables.") {
101108
sparkAppConf
102109
.set("spark.kubernetes.driver.pod.name", "spark-integration-spark-pi")
@@ -163,8 +170,8 @@ private[spark] class KubernetesSuite extends FunSuite with BeforeAndAfterAll wit
163170

164171
createTestSecret()
165172

166-
runSparkPageRankAndVerifyCompletion(
167-
appArgs = Array(CONTAINER_LOCAL_DOWNLOADED_PAGE_RANK_DATA_FILE),
173+
runSparkPiAndVerifyCompletion(
174+
appResource = remoteExamplesJarUri.toString,
168175
driverPodChecker = (driverPod: Pod) => {
169176
doBasicDriverPodCheck(driverPod)
170177
checkTestSecret(driverPod, withInitContainer = true)
@@ -188,7 +195,6 @@ private[spark] class KubernetesSuite extends FunSuite with BeforeAndAfterAll wit
188195
driverPodChecker,
189196
executorPodChecker)
190197
}
191-
192198
private def runSparkPageRankAndVerifyCompletion(
193199
appResource: String = CONTAINER_LOCAL_SPARK_DISTRO_EXAMPLES_JAR,
194200
driverPodChecker: Pod => Unit = doBasicDriverPodCheck,

integration-test/src/test/scala/org/apache/spark/deploy/k8s/integrationtest/docker/SparkDockerImageBuilder.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ private[spark] class SparkDockerImageBuilder
4343
private val dockerHost = dockerEnv.getOrElse("DOCKER_HOST",
4444
throw new IllegalStateException("DOCKER_HOST env not found."))
4545

46+
private val FILE_SERVER_BUILD_PATH = Paths.get("docker-file-server")
47+
4648
private val originalDockerUri = URI.create(dockerHost)
4749
private val httpsDockerUri = new URIBuilder()
4850
.setHost(originalDockerUri.getHost)
@@ -68,6 +70,10 @@ private[spark] class SparkDockerImageBuilder
6870
buildImage("spark-driver", DRIVER_DOCKER_FILE)
6971
buildImage("spark-executor", EXECUTOR_DOCKER_FILE)
7072
buildImage("spark-init", INIT_CONTAINER_DOCKER_FILE)
73+
dockerClient.build(
74+
FILE_SERVER_BUILD_PATH,
75+
"spark-examples-file-server",
76+
new LoggingBuildHandler())
7177
}
7278

7379
private def buildImage(

0 commit comments

Comments
 (0)