2017-06-23 3 views
0

Regardez l'image de https://spark.apache.org/docs/latest/cluster-overview.html.comment soumettre l'application d'étincelle de kubernetes

enter image description here

Le groupe d'allumage en cours d'exécution en dehors Kubernetes. Mais je vais exécuter le programme pilote à l'intérieur des kubernetes. Le problème est de savoir comment laisser le cluster spark savoir si le programme du pilote est.

Mon Kubernetes fichier YAML:

kind: List 
apiVersion: v1 
items: 
- kind: Deployment 
    apiVersion: extensions/v1beta1 
    metadata: 
    name: counter-uat 
    spec: 
    replicas: 1 
    selector: 
     matchLabels: 
     name: spark-driver 
    template: 
     metadata: 
     labels: 
      name: spark-driver 
     spec: 
     containers: 
      - name: counter-uat 
      image: counter:0.1.0 
      command: ["/opt/spark/bin/spark-submit", "--class", "Counter", "--master", "spark://spark.uat:7077", "/usr/src/counter.jar"] 
- kind: Service 
    apiVersion: v1 
    metadata: 
    name: spark-driver 
    labels: 
     name: spark-driver 
    spec: 
    type: NodePort 
    ports: 
    - name: port 
     port: 4040 
     targetPort: 4040 
    selector: 
     name: spark-driver 

L'erreur est:

Caused by: java.io.IOException: Failed to connect to /172.17.0.8:44117 
    at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:228) 
    at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:179) 
    at org.apache.spark.rpc.netty.NettyRpcEnv.createClient(NettyRpcEnv.scala:197) 
    at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:191) 
    at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:187) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: io.netty.channel.AbstractChannel$AnnotatedNoRouteToHostException: Host is unreachable: /172.17.0.8:44117 

Le groupe d'étincelle tente d'atteindre le programme pilote qui IP est 172.17.0.8. 172.17.0.8 peut être une adresse IP interne à l'intérieur de kubernetes.

Comment réparer le problème? Comment réparer mon fichier yaml? Merci

MISE À JOUR

J'ai ajouté les deux paramètres suivants: "--conf", "spark.driver.bindAddress = 192.168.42.8", "--conf", « spark.driver.host = 0.0.0.0 ".

Mais à partir du journal, essayant toujours d'atteindre 172.17.0.8, qui est le pod interne de kubernetes ip.

MISE À JOUR

kind: List 
apiVersion: v1 
items: 
- kind: Deployment 
    apiVersion: extensions/v1beta1 
    metadata: 
    name: counter-uat 
    spec: 
    replicas: 1 
    selector: 
     matchLabels: 
     name: counter-driver 
    template: 
     metadata: 
     labels: 
      name: counter-driver 
     spec: 
     containers: 
      - name: counter-uat 
      image: counter:0.1.0 
      command: ["/opt/spark/bin/spark-submit", "--class", "Counter", "--master", "spark://spark.uat:7077", "--conf", "spark.driver.bindAddress=192.168.42.8","/usr/src/counter.jar"] 

kind: Service 
apiVersion: v1 
metadata: 
    name: counter-driver 
    labels: 
    name: counter-driver 
spec: 
    type: NodePort 
    ports: 
    - name: driverport 
    port: 42761 
    targetPort: 42761 
    nodePort: 30002 
    selector: 
    name: counter-driver 

Une autre erreur:

2017-06-23T20:00:07.487656154Z Exception in thread "main" java.net.BindException: Cannot assign requested address: Service 'sparkDriver' failed after 16 retries (starting from 31319)! Consider explicitly setting the appropriate port for the service 'sparkDriver' (for example spark.ui.port for SparkUI) to an available port or increasing spark.port.maxRetries. 

Répondre

0

Essayez le réglage spark.driver.host ou spark.driver.bindAddress-"spark.uat" ou "spark-driver.uat" ou l'hôte du pilote réel dans Spark lui-même. C'est un problème commun avec ce type de projets distribués où le maître indique au client où se connecter. Si vous ne spécifiez pas spark.driver.host, il essaie de trouver lui-même l'hôte approprié et utilise simplement l'adresse IP qu'il voit. Mais dans ce cas, l'IP qu'il voit est une adresse IP interne de Kubernetes et pourrait ne pas fonctionner correctement pour le client.

Vous pouvez également essayer de définir la variable d'environnement SPARK_PUBLIC_DNS. Il a en fait une description plus prometteuse de:

Hostname your Spark program will advertise to other machines.

+0

'spark.driver.bindAddress' est utilisé pour avertir le cluster d'étincelles où se trouve le pilote d'application? – BAE

+0

En fait 'spark.driver.host' semble plus prometteur. Vous voulez toujours qu'il se lie sur '0.0.0.0', mais se présente comme le nom d'hôte. – kichik

+0

s'il vous plaît jeter un oeil à ma mise à jour – BAE