教程: 设置本地ApacheZeppelin笔记本以测试和调试ETL脚本 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程: 设置本地ApacheZeppelin笔记本以测试和调试ETL脚本

在本教程中,您会将本地计算机上的 Apache Zeppelin 笔记本连接到开发终端节点,以便您可以先以交互方式运行、调试和测试 AWS Glue ETL(提取、转换和加载)脚本,然后再部署它们。本教程使用 SSH 端口转发将本地计算机连接到 AWS Glue 开发终端节点。有关更多信息,请参阅 Wikipedia 中的端口转发

本教程假定您已执行教程的先决条件中概述的步骤。

安装 Apache Zeppelin Notebook

  1. 请确保您已在本地计算机上安装 Java 开发工具包 1.7(请参阅 Java 主页)。

    如果您是在 Microsoft Windows 上运行,请确保 JAVA_HOME 环境变量指向正确的 Java 目录。在不更新此变量的情况下更新 Java 是可能的,而且如果它指向的文件夹不再存在,则 Zeppelin 无法启动。

  2. Zeppelin 下载页面将 Apache Zeppelin 的版本 (具有所有解释器) 下载到您的本地计算机上。根据以下兼容性表选择要下载的文件,然后按照下载说明进行下载。

    Glue 版本 Zeppelin 版本 要下载的文件
    0.9 0.7.3 zeppelin-0.7.3-bin-all.tgz
    1.0及更高版本 0.8.1 zeppelin-0.8.1-bin-all.tgz

    以适合您的操作系统的方式启动 Zeppelin。在使用 Zeppelin 时,请让启动 notebook 服务器的终端窗口一直打开。当服务器成功启动后,您可以在控制台中看到一行内容,其结尾是“Done, zeppelin server started”(完成,zeppelin 服务器已启动)。

  3. 通过导航到 http://localhost:8080,在您的浏览器中打开 Zeppelin。

  4. 在浏览器中的 Zeppelin 内,在页面右上角的 anonymous 中打开下拉菜单,然后选择 Interpreter。在解释器页面上,搜索 spark,然后在右侧选择 edit。进行以下更改:

    • 选中 Connect to existing process 复选框,然后将 Host 设置为 localhost,将 Port 设置为 9007 (或您正在用于端口转发的任何其他端口)。

    • Properties 中,将 master 设置为 yarn-client

    • 如果存在 spark.executor.memory 属性,请通过在 action 列中选择 x 删除它。

    • 如果存在 spark.driver.memory 属性,请通过在 action 列中选择 x 删除它。

    在页面底部选择 Save,然后选择 OK 以确认要更新解释器并重新启动它。使用浏览器的后退按钮以返回到 Zeppelin 起始页。

启动SSH端口转发以连接到您的 DevEndpoint

接下来,使用 SSH 本地端口转发将本地端口(此处为 9007)转发到由 AWS Glue (169.254.76.1:9007) 定义的远程目标。

打开一个能让您访问 SSH 安全外壳协议的终端窗口。在 Microsoft Windows 上,您可以使用 Git for Windows 提供的 BASH 外壳,或者安装 Cygwin

运行以下 SSH 命令,按如下所示进行修改:

  • private-key-file-path 替换为包含与您用于创建开发终端节点的公有密钥对应的私有密钥的 .pem 文件的路径。

  • 如果您正在转发 9007 以外的端口,请将 9007 替换为您实际在本地使用的端口号。地址 169.254.76.1:9007 是远程端口,您无法更改。

  • dev-endpoint-public-dns 替换为您的开发终端节点的公有 DNS 地址。要查找此地址,请导航到您在 AWS Glue 控制台中的开发终端节点,选择所需名称,复制在 Endpoint details 页面中列出的 Public address

ssh -i private-key-file-path -NTL 9007:169.254.76.1:9007 glue@dev-endpoint-public-dns

您可能会看到类似如下的警告消息:

The authenticity of host 'ec2-xx-xxx-xxx-xx.us-west-2.compute.amazonaws.com (xx.xxx.xxx.xx)' can't be established. ECDSA key fingerprint is SHA256:4e97875Brt+1wKzRko+JflSnp21X7aTP3BcFnHYLEts. Are you sure you want to continue connecting (yes/no)?

键入 yes,在使用 Zeppelin 笔记本时保持终端窗口打开。

在 Notebook 段落中运行简单脚本片段

在 Zeppelin 启动页面上,选择 Create new note。命名新的注释 Legislators,确认 spark 是解释器。

在笔记本中键入以下脚本片段并运行它。它在 AWS Glue 数据目录 以创建一个 DynamicFrame 从您的样本数据。然后,它会打印出该数据的项目计数和架构。

%pyspark import sys from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.transforms import * # Create a Glue context glueContext = GlueContext(SparkContext.getOrCreate()) # Create a DynamicFrame using the 'persons_json' table persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json") # Print out information about this data print "Count: ", persons_DyF.count() persons_DyF.printSchema()

脚本的输出如下所示:

Count: 1961 root |-- family_name: string |-- name: string |-- links: array | |-- element: struct | | |-- note: string | | |-- url: string |-- gender: string |-- image: string |-- identifiers: array | |-- element: struct | | |-- scheme: string | | |-- identifier: string |-- other_names: array | |-- element: struct | | |-- note: string | | |-- name: string | | |-- lang: string |-- sort_name: string |-- images: array | |-- element: struct | | |-- url: string |-- given_name: string |-- birth_date: string |-- id: string |-- contact_details: array | |-- element: struct | | |-- type: string | | |-- value: string |-- death_date: string

对您的本地 Notebook 连接进行问题排查

  • 如果您遇到 connection refused 错误,则您可能正在使用过期的开发终端节点。尝试创建新的开发终端节点并重新连接。

  • 如果您的连接超时或由于任何原因停止工作,则您可能需要采取以下步骤来还原它:

    1. 在 Zeppelin 中,在页面右上角的下拉菜单中,选择 Interpreters (解释器)。在口译员页面上,搜索 spark。选择 编辑,并清除 连接到现有流程 复选框。在页面底部选择 Save

    2. 如前所述启动 SSH 端口转发。

    3. 在 Zeppelin 中,重新启用 spark 解释器的 Connect to existing process 设置,然后再次保存。

    像这样重置解释器应该会恢复连接。实现这一目标的另一个方法是选择 重新启动 Spark解释器的 口译员 第页。然后,等待最多 30 秒,以确保远程解释器已重新启动。

  • 确保您的开发终端节点有权访问远程 Zeppelin 解释器。如果没有适当的网络权限,您可能会遇到错误,例如 open failed: connect failed: Connection refused.