云原生数据湖分析 DLA Jupyter交互式作业开发

By | 2021年4月23日

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

注意事项

  • DLA Spark当前支持python3,scala2.11的Jupyter可交互作业。
  • 新版Jupyter Lab对Python的最低版本要求是Python3.6,故而Jupyter Lab当前不支持Python2版本。

操作步骤

  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.1.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>

  2. 安装Jupyter Lab。
    1. 可选:安装venv
      说明 推荐将整套环境安装到Virtual Environment环境中,这样后续的安装不会破坏主账号下的公共python环境。

    2. 使用以下命令安装Jupyter lab
      pip install jupyterlab #安装jupyterlab。
      jupyter lab  #验证一下是否安装成功, 成功安装的话, 可以看到启动日志。

    3. 安装spark magic。具体安装方法请参考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.sql.hive.metastore.version": "dla",
          "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的元数据服务请参考
    作业配置指南

  3. 运行Jupyter Lab。
    # 重新启动Jupyter Lab。
    jupyter lab
    
    # 启动DLA Livy Proxy。
    dlaproxy --vcname vcname -i akid -k aksec --region <regionid>

    Jupyter Lab启动日志中会打印jupyterlab的本地地址。如下图所示:
    日志打印
    当系统出现提示
    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语句来覆盖旧的配置项。执行后,jupyterlab会根据新的配置项重启作业。

    %%configure -f
    { 
         "jars": "oss://test/test.jar",
        "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。

请关注公众号获取更多资料

发表评论

电子邮件地址不会被公开。 必填项已用*标注