Apache spark 将Jupyter笔记本连接到Spark

Apache spark 将Jupyter笔记本连接到Spark,apache-spark,pyspark,ipython-notebook,jupyter,ssh-tunnel,Apache Spark,Pyspark,Ipython Notebook,Jupyter,Ssh Tunnel,我有一台安装了Hadoop和Spark的机器。下面是我目前的环境 蟒蛇3.6 spark1.5.2 Hadoop 2.7.1.2.3.6.0-3796 我试图通过构建ipython内核将jupyter笔记本连接到spark 写入2个新文件 /root/.ipython/profile\u pyspark/ipython\u notebook\u config.py c = get_config() c.NotebookApp.port = 80 /root/.ipython/profile_p

我有一台安装了Hadoop和Spark的机器。下面是我目前的环境

蟒蛇3.6

spark1.5.2

Hadoop 2.7.1.2.3.6.0-3796

我试图通过构建ipython内核将jupyter笔记本连接到spark

写入2个新文件

  • /root/.ipython/profile\u pyspark/ipython\u notebook\u config.py

  • c = get_config()
    c.NotebookApp.port = 80
    
  • /root/.ipython/profile_pyspark/startup/00-pyspark-setup.py

  • import os
    import sys
    os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
    os.environ["SPARK_HOME"] = "/usr/hdp/current/spark-client"
    os.environ["PYLIB"] = os.environ["SPARK_HOME"] + "/python/lib"
    spark_home = os.environ.get('SPARK_HOME', None)
    sys.path.insert(0, os.environ["PYLIB"] +"/py4j-0.8.2.1-src.zip")
    sys.path.insert(0, os.environ["PYLIB"] +"/pyspark.zip")
    exec(open(os.path.join(spark_home, 'python/pyspark/shell.py')).read())
    
  • /root/anaconda3/share/jupyter/kernels/pyspark/kernel.json

  • {
        "display_name": "PySpark (Spark 2.0.0)",
        "language": "python",
        "argv": [
            "/root/anaconda3/bin/python3",
            "-m",
            "ipykernel",
            "--profile=pyspark"
        ],
        "env": {
            "CAPTURE_STANDARD_OUT": "true",
            "CAPTURE_STANDARD_ERR": "true",
            "SEND_EMPTY_OUTPUT": "false",
            "PYSPARK_PYTHON" : "/root/anaconda3/bin/python3",
            "SPARK_HOME": "/usr/hdp/current/spark-client/"
        }
    }
    
    kernel.json

    {
        "display_name": "PySpark (Spark 2.0.0)",
        "language": "python",
        "argv": [
            "/root/anaconda3/bin/python3",
            "-m",
            "ipykernel",
            "--profile=pyspark"
        ],
        "env": {
            "CAPTURE_STANDARD_OUT": "true",
            "CAPTURE_STANDARD_ERR": "true",
            "SEND_EMPTY_OUTPUT": "false",
            "PYSPARK_PYTHON" : "/root/anaconda3/bin/python3",
            "SPARK_HOME": "/usr/hdp/current/spark-client/"
        }
    }
    
    00-pyspark-setup.py

    import os
    import sys
    os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
    os.environ["SPARK_HOME"] = "/usr/hdp/current/spark-client"
    os.environ["PYLIB"] = os.environ["SPARK_HOME"] + "/python/lib"
    spark_home = os.environ.get('SPARK_HOME', None)
    sys.path.insert(0, os.environ["PYLIB"] +"/py4j-0.8.2.1-src.zip")
    sys.path.insert(0, os.environ["PYLIB"] +"/pyspark.zip")
    exec(open(os.path.join(spark_home, 'python/pyspark/shell.py')).read())
    
    ipython_笔记本_config.py

    c = get_config()
    c.NotebookApp.port = 80
    
    然后,当我运行以下命令时

    jupyter notebook --profile=pyspark
    
    笔记本运行良好。然后,我将内核更改为“PySpark(Spark 2.0.0)”,它假设使用“sc”Spark上下文。但是,当我键入“sc”时,它不会显示任何内容

    所以,由于sc不能初始化,如果我想运行以下程序,它失败了

    nums = sc.parallelize(xrange(1000000))
    

    有谁能帮我配置jupyter笔记本与Spark对话吗?

    仅供参考,python 3.6在Spark 2.1.1版之前不受支持。见JIRA

    你的问题有很多问题

    1) 在上面Punskr的答案之上-Spark 1.5;Python 3支持是在年引入的

    2) 即使切换到Python2或,您仍然需要导入Pyspark的相关模块,并在笔记本中手动初始化
    sc
    变量

    3) 您似乎还使用了Jupyter的旧版本,因为配置文件功能在Jupyter>=4中不可用


    要在Jupyter>=4中“自动”初始化
    sc
    ,请参阅我的答案。

    您可以进行一些环境更改,使pyspark拥有默认的ipython或Jupyter笔记本电脑

    ~/.bashrc

    export PYSPARK_PYTHON=python3 ## for python3
    export PYSPARK_DRIVER_PYTHON=ipython
    export PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser --port=7000"
    
    见:

    接下来,运行
    source~/.bashrc

    export PYSPARK_PYTHON=python3 ## for python3
    export PYSPARK_DRIVER_PYTHON=ipython
    export PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser --port=7000"
    
    然后,当您启动
    pyspark
    (或使用纱线)时,它将打开一个服务器供您连接

    在具有ssh功能的本地终端上,运行

    ssh -N -f -L localhost:8000:localhost:7000 <username>@<host>
    
    如果用户需要使用
    spark submit
    ,可能会导致问题。如果您想同时使用笔记本电脑和
    spark submit
    ,解决方法是创建两个新的环境变量。下面是一个您可以创建的示例

    export PYSPARK_PYTHON=python3 ## for python3
    export ipyspark='PYSPARK_DRIVER_PYTHON=ipython pyspark'
    export pynb='PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser --port=7000"'
    

    其中,
    ipyspark
    pynb
    是bash终端上的新命令。

    这里似乎发生了很多事情。试着更多地关注你的问题。我建议将Spark 2.0的问题转移到另一个问题。将
    PYSPARK\u DRIVER\u PYTHON
    设置为
    ipython
    jupyter
    是一个非常糟糕的做法,这可能会在下游造成严重的问题(例如);推荐的方法是。是的,如果需要使用
    spark submit
    ,这是一个常见的问题。在我以前的工作中,我们以交互方式使用它,因此很少使用
    spark submit
    。但是,围绕这个问题的解决方案是创建一个新变量,
    ipyspark=PYSPARK\u DRIVER\u PYTHON=ipython-PYSPARK
    。我将解释这是对答案的更新。