0%

关于Spark环境变量问题

记录一次因为spark内置环境问题引发的惨案

问题:Spark在spark-env.sh中的环境变量不生效

错误日志

  • Terminal
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@ceshi3 sbin]# ./start-slaves.sh 
    - /usr/local/spark-1.6.0-bin-hadoop2.6/conf/spark-env.sh: line 9: export: `/usr/local/spark-1.6.0-bin-hadoop2.6/lib/spark-assembly-1.6.0-hadoop2.6.0.jar': not a valid identifier
    - ceshi3: /usr/local/spark-1.6.0-bin-hadoop2.6/conf/spark-env.sh: line 9: export: `/usr/local/spark-1.6.0-bin-hadoop2.6/lib/spark-assembly-1.6.0-hadoop2.6.0.jar': not a valid identifier
    - ceshi3: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-ceshi3.out
    - ceshi3: failed to launch org.apache.spark.deploy.worker.Worker:
    - ceshi3: /usr/local/spark-1.6.0-bin-hadoop2.6/bin/spark-class: line 87: /usr/local/spark-1.6.0-bin-hadoop2.6/bin/java: 没有那个文件或目录
    - ceshi3: /usr/local/spark-1.6.0-bin-hadoop2.6/bin/spark-class: line 87: exec: /usr/local/spark-1.6.0-bin-hadoop2.6/bin/java: cannot execute: 没有那个文件或目录
    - ceshi3: full log in /usr/local/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-ceshi3.out

    发现启动worker的时候会出现错误:
    1
    2
    - ceshi3:   /usr/local/spark-1.6.0-bin-hadoop2.6/bin/spark-class: line 87: /usr/local/spark-1.6.0-bin-hadoop2.6/bin/java: 没有那个文件或目录
    - ceshi3: /usr/local/spark-1.6.0-bin-hadoop2.6/bin/spark-class: line 87: exec: /usr/local/spark-1.6.0-bin-hadoop2.6/bin/java: cannot execute: 没有那个文件或目录

这个bin/java明明是$ JAVA_HOME 的,为什么会变为 $SPARK_HOME 呢

既然启动报错,而且报的是 $JAVA_HOME,那就要看几个东西:一个是正常的系统变量配置,再一个就是在要启动的服务里是否使用了这个配置变量,再确认下自己的配置是否已经有了。

查看 spark 关于环境变量的配置文件

1
2
3
4
5
6
7
8
9
10
11
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=dk31:2181,dk32:2181,dk34:2181 -Dspark.deploy.zookeeper.dir=/spark"
export JAVA_HOME=${JAVA_HOME}
export HADOOP_HOME=/usr/local/hadoop-2.6.0
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export SCALA_HOME=/usr/local/scala-2.10.4
export SPARK_WORKER_MEMORY=4g
export SPARK_EXECUTOR_MEMORY=2g
export SPARK_DRIVER_MEMORY=1g
export SPARK_WORKER_CORES=4
export SPARK_CLASSPATH=/usr/local/spark-1.6.0-bin-hadoop2.6/lib/mysql-connector-java.jar
export SPARK_CLASSPATH=$SPARK_CLASSPATH:$CLASSPATH

发现 $JAVA_HOME 变量是取的系统变量·,但是系统变量为什么取不到?

查了下:在脚本中使用export, 只在脚本中有效,退出这个脚本,设置的变量就没有了。
由于spark-class使用了 spark-env.sh 在使用的时候 已经取不到该值,所以无效了。
但是想不通为什么会变成 $SPARK_HOME 的变量