zoukankan      html  css  js  c++  java
  • 解决pyspark-linux-windowsIDE JAVA_HOME not set

    os.environ

    赋值


    ssh://root@192.168.2.51:22/usr/bin/python -u /home/data/tmp_test/trunk/personas/tmp_spark_mongo_relset_javahome.py
    JAVA_HOME is not set
    Traceback (most recent call last):
      File "/home/data/tmp_test/trunk/personas/tmp_spark_mongo_relset_javahome.py", line 16, in <module>
        .appName("PythonPi")
      File "/root/.local/lib/python3.6/site-packages/pyspark/sql/session.py", line 169, in getOrCreate
        sc = SparkContext.getOrCreate(sparkConf)
      File "/root/.local/lib/python3.6/site-packages/pyspark/context.py", line 334, in getOrCreate
        SparkContext(conf=conf or SparkConf())
      File "/root/.local/lib/python3.6/site-packages/pyspark/context.py", line 115, in __init__
        SparkContext._ensure_initialized(self, gateway=gateway, conf=conf)
      File "/root/.local/lib/python3.6/site-packages/pyspark/context.py", line 283, in _ensure_initialized
        SparkContext._gateway = gateway or launch_gateway(conf)
      File "/root/.local/lib/python3.6/site-packages/pyspark/java_gateway.py", line 95, in launch_gateway
        raise Exception("Java gateway process exited before sending the driver its port number")
    Exception: Java gateway process exited before sending the driver its port number
    

      



    查源码


    #
    # Licensed to the Apache Software Foundation (ASF) under one or more
    # contributor license agreements.  See the NOTICE file distributed with
    # this work for additional information regarding copyright ownership.
    # The ASF licenses this file to You under the Apache License, Version 2.0
    # (the "License"); you may not use this file except in compliance with
    # the License.  You may obtain a copy of the License at
    #
    #    http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #
    
    import atexit
    import os
    import sys
    import select
    import signal
    import shlex
    import socket
    import platform
    from subprocess import Popen, PIPE
    
    if sys.version >= '3':
        xrange = range
    
    from py4j.java_gateway import java_import, JavaGateway, GatewayClient
    from pyspark.find_spark_home import _find_spark_home
    from pyspark.serializers import read_int
    
    
    def launch_gateway(conf=None):
        """
        launch jvm gateway
        :param conf: spark configuration passed to spark-submit
        :return:
        """
        if "PYSPARK_GATEWAY_PORT" in os.environ:
            gateway_port = int(os.environ["PYSPARK_GATEWAY_PORT"])
        else:
            SPARK_HOME = _find_spark_home()
            # Launch the Py4j gateway using Spark's run command so that we pick up the
            # proper classpath and settings from spark-env.sh
            on_windows = platform.system() == "Windows"
            script = "./bin/spark-submit.cmd" if on_windows else "./bin/spark-submit"
            command = [os.path.join(SPARK_HOME, script)]
            if conf:
                for k, v in conf.getAll():
                    command += ['--conf', '%s=%s' % (k, v)]
            submit_args = os.environ.get("PYSPARK_SUBMIT_ARGS", "pyspark-shell")
            if os.environ.get("SPARK_TESTING"):
                submit_args = ' '.join([
                    "--conf spark.ui.enabled=false",
                    submit_args
                ])
            command = command + shlex.split(submit_args)
    
            # Start a socket that will be used by PythonGatewayServer to communicate its port to us
            callback_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            callback_socket.bind(('127.0.0.1', 0))
            callback_socket.listen(1)
            callback_host, callback_port = callback_socket.getsockname()
            env = dict(os.environ)
            env['_PYSPARK_DRIVER_CALLBACK_HOST'] = callback_host
            env['_PYSPARK_DRIVER_CALLBACK_PORT'] = str(callback_port)
    
            # Launch the Java gateway.
            # We open a pipe to stdin so that the Java gateway can die when the pipe is broken
            if not on_windows:
                # Don't send ctrl-c / SIGINT to the Java gateway:
                def preexec_func():
                    signal.signal(signal.SIGINT, signal.SIG_IGN)
                proc = Popen(command, stdin=PIPE, preexec_fn=preexec_func, env=env)
            else:
                # preexec_fn not supported on Windows
                proc = Popen(command, stdin=PIPE, env=env)
    
            gateway_port = None
            # We use select() here in order to avoid blocking indefinitely if the subprocess dies
            # before connecting
            while gateway_port is None and proc.poll() is None:
                timeout = 1  # (seconds)
                readable, _, _ = select.select([callback_socket], [], [], timeout)
                if callback_socket in readable:
                    gateway_connection = callback_socket.accept()[0]
                    # Determine which ephemeral port the server started on:
                    gateway_port = read_int(gateway_connection.makefile(mode="rb"))
                    gateway_connection.close()
                    callback_socket.close()
            if gateway_port is None:
                raise Exception("Java gateway process exited before sending the driver its port number")
    
            # In Windows, ensure the Java child processes do not linger after Python has exited.
            # In UNIX-based systems, the child process can kill itself on broken pipe (i.e. when
            # the parent process' stdin sends an EOF). In Windows, however, this is not possible
            # because java.lang.Process reads directly from the parent process' stdin, contending
            # with any opportunity to read an EOF from the parent. Note that this is only best
            # effort and will not take effect if the python process is violently terminated.
            if on_windows:
                # In Windows, the child process here is "spark-submit.cmd", not the JVM itself
                # (because the UNIX "exec" command is not available). This means we cannot simply
                # call proc.kill(), which kills only the "spark-submit.cmd" process but not the
                # JVMs. Instead, we use "taskkill" with the tree-kill option "/t" to terminate all
                # child processes in the tree (http://technet.microsoft.com/en-us/library/bb491009.aspx)
                def killChild():
                    Popen(["cmd", "/c", "taskkill", "/f", "/t", "/pid", str(proc.pid)])
                atexit.register(killChild)
    
        # Connect to the gateway
        gateway = JavaGateway(GatewayClient(port=gateway_port), auto_convert=True)
    
        # Import the classes used by PySpark
        java_import(gateway.jvm, "org.apache.spark.SparkConf")
        java_import(gateway.jvm, "org.apache.spark.api.java.*")
        java_import(gateway.jvm, "org.apache.spark.api.python.*")
        java_import(gateway.jvm, "org.apache.spark.ml.python.*")
        java_import(gateway.jvm, "org.apache.spark.mllib.api.python.*")
        # TODO(davies): move into sql
        java_import(gateway.jvm, "org.apache.spark.sql.*")
        java_import(gateway.jvm, "org.apache.spark.sql.hive.*")
        java_import(gateway.jvm, "scala.Tuple2")
    
        return gateway



  • 相关阅读:
    C/C++程序员应聘常见面试题剖析(经典)
    连续几个数组在内存中的存储地址
    虚析构函数
    c++中的函数模版和类模版
    C++多态性(续)
    malloc和new的区别和联系
    深入浅出多线程系列之四:简单的同步 lock
    Silverlight_Rest_WCF系列之六:跨线程
    深入浅出多线程系列之五:一些同步构造(下篇)
    深入浅出多线程系列之五:一些同步构造(上篇)
  • 原文地址:https://www.cnblogs.com/rsapaper/p/7888937.html
Copyright © 2011-2022 走看看