为了支持Spark REPL功能,阿里云数据湖分析团队推出了连接Jupyter Lab和DLA Spark的方案,帮助用户将本地Jupyter Lab和阿里云DLA Spark连接在一起,从而可以利用DLA的弹性资源进行交互测试和计算。

注意事项

  • DLA Spark当前支持python3,Scala 2.11的Jupyter可交互作业。
  • 新版Jupyter Lab对Python的最低版本要求是Python 3.6。

操作步骤

  1. 安装DLA Livy Proxy。
    1. 安装Aliyun OpenAPI SDK
      说明 Aliyun OpenAPI SDK的最低版本要求是2.0.4
    2. 使用以下命令安装Aliyun DLA Livy Proxy
      pip install aliyun-dla-livy-proxy-0.0.3.zip
      说明 您需要使用root用户安装Aliyun DLA Livy Proxy,非root用户进行安装可能无法注册命令到可执行目录中。Aliyun DLA Livy Proxy安装完成后,您可以在命令行中找到dlaproxy命令。
    3. 启动DLA Livy Proxy。
      DLA Livy Proxy用于将阿里云DLA的接口翻译为SparkMagic需要的Apache Livy语义接口,从而在本地建立HTTP PROXY监听与转发,端口默认是5000
      # 查看dlaproxy命令使用方式。
      $dlaproxy -h
      usage: dlaproxy [-h] --vcname VCNAME -i AK -k SECRET --region REGION [--host HOST] [--port PORT] [--loglevel LOGLEVEL]
      
      Proxy AliYun DLA as Livy
      
      optional arguments:
        -h, --help            show this help message and exit
        --vcname VCNAME       Virtual Cluster Name
        -i AK, --access-key-id AK
                              Aliyun Access Key Id
        -k SECRET, --access-key-secret SECRET
                              Aliyun Access Key Secret
        --region REGION       Aliyun Region Id
        --host HOST           Proxy Host Ip
        --port PORT           Proxy Host Port
        --loglevel LOGLEVEL   python standard log level
        
      # 直接启动dla livy proxy。
      dlaproxy --vcname <vcname> -i akid -k aksec --region <regionid>

      上述代码中出现的输入参数说明如下:

      参数名称 参数说明
      --vcname DLA Spark虚拟集群名称。
      说明 您可以在DLA 控制台->虚拟集群管理->集群名称/实例ID->详情中查看虚拟集群名称。
      -i RAM用户的AccessKey ID。
      说明 如果您已经创建了AccessKey,可以在RAM控制台上查看相关信息。关于如何查看以及创建AccessKey,请参见为RAM用户创建访问密钥
      -k RAM用户的AccessKey Secret。
      说明 如果您已经创建了AccessKey,可以在RAM控制台上查看相关信息。关于如何查看以及创建AccessKey,请参见为RAM用户创建访问密钥
      --region DLA所在地域对应的Region ID,详细信息请参见地域和可用区
      --host 服务绑定的Host,默认为127.0.0.1, 仅代理本地请求。可以修改为0.0.0.0或者其它地址监听公网/内网的请求并代理,建议使用默认值。
      --port 监听端口, 默认为5000, 可以修改为其它端口,建议使用默认值。
      --loglevel 日志级别, 默认为INFO,可以修改为ERROR、 WARNING、 INFO或DEBUG,建议使用默认值。
  2. 安装Jupyter Lab。
    1. 可选:安装venv
      说明 推荐将整套环境安装到Virtual Environment环境中,这样后续的安装不会破坏主账号下的公共python环境。
    2. 使用以下命令安装Jupyter lab
      pip install jupyterlab #安装Jupyter Lab。
      jupyter lab  #验证一下是否安装成功, 成功安装的话, 可以看到启动日志。
    3. 安装Sparkmagic。具体安装方法请参考sparkmagic安装方法
      说明 上述安装参考文档中的可选步骤都必须要执行。
    安装成功后,需要手动创建配置文件~/.sparkmagic/config.json,并将url的配置指向本地开启的代理。示例如下:
    {
      "kernel_python_credentials" : {
        "username": "",
        "password": "",
        "url": "http://127.0.0.1:5000",
        "auth": "None"
      },
    
      "kernel_scala_credentials" : {
        "username": "",
        "password": "",
        "url": " http://127.0.0.1:5000",
        "auth": "None"
      },
      "kernel_r_credentials": {
        "username": "",
        "password": "",
        "url": "http://localhost:5000"
      },
    
      "logging_config": {
        "version": 1,
        "formatters": {
          "magicsFormatter": { 
            "format": "%(asctime)s\t%(levelname)s\t%(message)s",
            "datefmt": ""
          }
        },
        "handlers": {
          "magicsHandler": { 
            "class": "hdijupyterutils.filehandler.MagicsFileHandler",
            "formatter": "magicsFormatter",
            "home_path": "~/.sparkmagic"
          }
        },
        "loggers": {
          "magicsLogger": { 
            "handlers": ["magicsHandler"],
            "level": "DEBUG",
            "propagate": 0
          }
        }
      },
    
      "wait_for_idle_timeout_seconds": 15,
      "livy_session_startup_timeout_seconds": 600,
    
      "fatal_error_suggestion": "The code failed because of a fatal error:\n\t{}.\n\nSome things to try:\na) Make sure Spark has enough available resources for Jupyter to create a Spark context.\nb) Contact your Jupyter administrator to make sure the Spark magics library is configured correctly.\nc) Restart the kernel.",
    
      "ignore_ssl_errors": false,
    
      "session_configs": {
        "conf": {
          "spark.dla.connectors": "oss"
        }
      },
    
      "use_auto_viz": true,
      "coerce_dataframe": true,
      "max_results_sql": 2500,
      "pyspark_dataframe_encoding": "utf-8",
      
      "heartbeat_refresh_seconds": 30,
      "livy_server_heartbeat_timeout_seconds": 0,
      "heartbeat_retry_seconds": 10,
    
      "server_extension_default_kernel_name": "pysparkkernel",
      "custom_headers": {},
      
      "retry_policy": "configurable",
      "retry_seconds_to_sleep_list": [0.2, 0.5, 1, 3, 5],
      "configurable_retry_policy_max_retries": 8
    }
    说明 示例中的session_configs就是提交到DLA Spark的conf部分,如果需要加载JAR包,连接DLA的元数据服务请参考作业配置指南
    DLA Livy Proxy启动后监听的默认地址为127.0.0.1:5000,如果在启动DLA Livy Proxy时修改了默认的Host和Port, 则需要修改上述配置文件中的url部分。示例:启动时指定地址 --host 192.168.1.3 --port 8080, 则应当将上述配置文件中的urlhttp://192.168.1.3:8080,修改后如下所示:
    { 
      "kernel_python_credentials" : {
        "username": "",
        "password": "",
        "url": "http://192.168.1.3:8080",
        "auth": "None"
      },
      "kernel_scala_credentials" : {
        "username": "",
        "password": "",
        "url": "http://192.168.1.3:8080",
        "auth": "None"
      },
      "kernel_r_credentials": {
        "username": "",
        "password": "",
        "url": "http://192.168.1.3:8080"
      },
     "logging_config": {
        "version": 1,
        "formatters": {
          "magicsFormatter": { 
            "format": "%(asctime)s\t%(levelname)s\t%(message)s",
            "datefmt": ""
          }
        },
        "handlers": {
          "magicsHandler": { 
            "class": "hdijupyterutils.filehandler.MagicsFileHandler",
            "formatter": "magicsFormatter",
            "home_path": "~/.sparkmagic"
          }
        },
        "loggers": {
          "magicsLogger": { 
            "handlers": ["magicsHandler"],
            "level": "DEBUG",
            "propagate": 0
          }
        }
      },
    
      "wait_for_idle_timeout_seconds": 15,
      "livy_session_startup_timeout_seconds": 600,
    
      "fatal_error_suggestion": "The code failed because of a fatal error:\n\t{}.\n\nSome things to try:\na) Make sure Spark has enough available resources for Jupyter to create a Spark context.\nb) Contact your Jupyter administrator to make sure the Spark magics library is configured correctly.\nc) Restart the kernel.",
    
      "ignore_ssl_errors": false,
    
      "session_configs": {
        "conf": {
          "spark.dla.connectors": "oss"
        }
      },
    
      "use_auto_viz": true,
      "coerce_dataframe": true,
      "max_results_sql": 2500,
      "pyspark_dataframe_encoding": "utf-8",
      
      "heartbeat_refresh_seconds": 30,
      "livy_server_heartbeat_timeout_seconds": 0,
      "heartbeat_retry_seconds": 10,
    
      "server_extension_default_kernel_name": "pysparkkernel",
      "custom_headers": {},
      
      "retry_policy": "configurable",
      "retry_seconds_to_sleep_list": [0.2, 0.5, 1, 3, 5],
      "configurable_retry_policy_max_retries": 8
    }
  3. 运行Jupyter Lab。
    # 重新启动Jupyter Lab。
    jupyter lab
    
    # 启动DLA Livy Proxy。
    dlaproxy --vcname vcname -i akid -k aksec --region <regionid>
    Jupyter Lab启动日志中会打印Jupyter Lab的本地地址。如下图所示:日志打印
    当系统出现提示Aliyun DLA Proxy is ready,表明DLA Livy Proxy启动成功。DLA Livy Proxy启动成功后,您就可以正常使用Jupyter Lab了。Jupyter Lab的使用文档,请参考jupyterlab官方地址
    运行Jupyter Lab任务,DLA中会自动创建DLA Spark作业,您可以登录Data Lake Analytics控制台,在Serverless Spark > 作业管理菜单进行查看和管理。如下图所示,名称以notebook_为开头的Spark作业即为Jupyter交互式作业。作业管理
    当Jupyter Lab运行起来后,您仍然可以动态的修改配置,修改方式是使用magic语句来覆盖旧的配置项。执行后,Jupyter Lab会根据新的配置项重启作业。
    %%configure -f
    { 
        "conf": {
          "spark.sql.hive.metastore.version": "dla",
          "spark.dla.connectors": "oss"
        }
    }

常见问题处理

  • 问题现象:Jupyter Lab启动失败,出现如下报错,如何处理?
    • [C 09:53:15.840 LabApp] Bad config encountered during initialization:
    • [C 09:53:15.840 LabApp] Could not decode '\xe6\x9c\xaa\xe5\x91\xbd\xe5\x90\x8d' for unicode trait 'untitled_notebook' of a LargeFileManager instance.

    解决方法:LANG=zn jupyter lab。

  • 问题现象:出现报错$ jupyter nbextension enable --py --sys-prefix widgetsnbextension Enabling notebook extension jupyter-js-widgets/extension... - Validating: problems found: - require? X jupyter-js-widgets/extension,如何处理?

    解决方法:jupyter nbextension install --py widgetsnbextension --userjupyter nbextension enable widgetsnbextension --user --py

  • 问题现象:出现报错ValueError: Please install nodejs >=12.0.0 before continuing. nodejs may be installed using conda or directly from the nodejs website.,如何处理?

    解决方法:conda install nodejs。关于安装Conda请参考Conda官方文档

  • 问题现象:安装Sparkmagic时报错失败,如下图所示,如何处理?报错截图

    解决方法:安装Rust。