使用Jupyter Notebook 加速PySpark开发

2018年02月06日 15724点热度 3人点赞 0条评论

keywords:

docker jupyernotebook pyspark


PS: 看起来因为代码高亮插件的影响, 自动高亮的代码的格式有点问题...
后面会来解决这个问题


目前我们系统的整体架构大概是: Spark Standalone Cluster + NFS FileServer. 自然, 这些都是基于Linux系统.

Windows在开发PySpark程序的时候, 大部分情况都没有什么问题. 但是有两种情况就比较蛋疼了:

  • 读取NFS文件

    Windows底下, 一旦涉及到NFS的文件路径, 就歇菜了: 因为NFS的文件路径都是比如 /mnt/nfs/xxx 这种, 而Windows上面完全无法实现.

  • 消耗性能

    虽然作为client, 理论上不需要太强悍的性能, 但是有的事情并不合适Spark. 这个时候, 能有一个强力的client, 就美滋滋了!

关于NFS的解决方案, 一种很简单的解决方案就是起一个虚拟机. 我这边选择的方案:

基于Docker的JupyerNotebook 作为pyspark的开发工具.

PS: 笔者在这里就不对比两种方案的优劣了. 各位看官可以根据自己的需求进行选取.

安装Docker

这个网上已经很多教程了.

在这里推荐一个: 安装· Docker —— 从入门到实践 - yeasy - GitBook

基础环境

  • 基础镜像

    因为我们主力是python语言, 有时候还需要做一些AI/ML Task.

    我选取的是TensorFlow的镜像: Pull的命令: docker pull tensorflow/tensorflow

  • mount NFS

    首先安装nfs-common. 以ubuntu为例: apt install -y nfs-common

    mount命令:

    sudo mount -t nfs remote_server:remote_dir /mnt/nfs3

  • 启动docker:

    [code lang=bash]
    # 注意: 一定要加上 --net=host --pid=host -e TINI_SUBREAPER=true
    sudo docker run --name spark-learn -d\
    --net=host --pid=host -e TINI_SUBREAPER=true\
    -p 8888:8888 -v /notebooks:/notebooks\
    -v /mnt/nfs3:/mnt/nfs3\
    tensorflow/tensorflow
    [/code]

    否则在后面运行spark脚本之后, 会遇到很诡异的提示"资源不足"

配置环境

这个时候, 已经可以直接打开notebook写python了. 所以,有的操作我就放python代码了.

  • 修改APT源 (使用163)

    [code lang=bash]
    # ipython notebook之中表示执行命令
    !cp /etc/apt/sources.list /etc/apt/sources.list.bak

    import os
    source = '''
    deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse
    '''

    with open('/etc/apt/sources.list', 'w') as f :
    f.write(source)

    !apt update
    [/code]

  • 安装JDK

    直接APT安装openjdk 不要太方便啊, 比手动安装oracle-jdk 方便多了. 而且目前看来, spark对他的兼容性也是得到保证的.

    !apt-get install openjdk-8-jre -y

  • 安装Maven

    有时候, pyspark需要依赖其他的包的时候, 需要使用maven下载.
    使用APT安装还是最方便的 :
    apt-get install maven -y

  • 修改pip源 + 安装pyspark

    因为pyspark比较大, 网络不好的同学建议修改pip源.

    修改pip源, 推荐我的小工具: https://github.com/RangerWolf/pip-ex

    使用很简单:

    [code lang=python]
    mkdir_p(pip_config_dir)
    change("tsinghua") # 我的网络发现清华的镜像比阿里云还要快!
    [/code]

    之后pip安装飞起来了! 安装pyspark就一句话: pip install pyspark

其他说明:

  • 实时查看Spark运行日志

    Spark的运行log并不会直接在notebook上面显示. 需要使用docker logs命令才能看到.

    如果我们需要在命令自动显示最新的log, 而不需要我们每次手动输入, 可以使用下面的命令:

    docker logs -f --tail 100 spark-learn

  • 网络速度监控

    第一次运行Spark程序的时候, 我发现一个很简单的命令也没有执行弯成. 以为是网络IO太久了.

    想看看是不是网络卡, 我发现下面这个神器:

    [code lang=bash]
    # 安装
    sudo apt-get install speedometer

    # 运行
    speedometer -rx eth0 -tx eth0

    # docker环境下, 可以多试几个
    # 可以使用ifconfig 查看
    speedometer -rx docker0 -tx docker0
    speedometer -rx eno0 -tx eno0
    [/code]

在命令行就直接显示出这种图片, 真是太牛了!

原文地址: FlyML.NET

RangerWolf

保持饥渴的专注,追求最佳的品质

文章评论