教程:设置本地 Apache Zeppelin 笔记本来测试和调试 ETL 脚本
在本教程中,您会将本地计算机上的 Apache Zeppelin 笔记本连接到开发终端节点,以便您可以先以交互方式运行、调试和测试 Amazon Glue ETL(提取、转换和加载)脚本,然后再部署它们。本教程使用 SSH 端口转发将本地计算机连接到 Amazon Glue 开发终端节点。有关更多信息,请参阅 Wikipedia 中的端口转发
本教程假定您已执行中概述的步骤进行操作 教程的先决条件。
安装 Apache Zeppelin 笔记本
-
请确保您已在本地计算机上安装 Java 开发工具包 1.7(请参阅 Java 主页
)。 如果您是在 Microsoft Windows 上运行,请确保
JAVA_HOME
环境变量指向正确的 Java 目录。在不更新此变量的情况下更新 Java 是可能的,而且如果它指向的文件夹不再存在,则 Zeppelin 无法启动。 -
从 Zeppelin 下载页面
将 Apache Zeppelin 的版本 (具有所有解释器) 下载到您的本地计算机上。根据以下兼容性表选择要下载的文件,然后按照下载说明进行下载。 Amazon 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 服务器已启动)。
-
通过导航到
http://localhost:8080
,在您的浏览器中打开 Zeppelin。 -
在浏览器中的 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
)转发到由 Amazon Glue (169.254.76.1:9007
) 定义的远程目标。
打开一个能让您访问 SSH 安全外壳协议的终端窗口。在 Microsoft Windows 上,您可以使用 Git for Windows
运行以下 SSH 命令,按如下所示进行修改:
将
替换为包含与您用于创建开发终端节点的公有密钥对应的私有密钥的private-key-file-path
.pem
文件的路径。如果您正在转发
9007
以外的端口,请将9007
替换为您实际在本地使用的端口号。地址169.254.76.1:9007
是远程端口,您无法更改。将
替换为您的开发终端节点的公有 DNS 地址。要查找此地址,请导航到您在 Amazon Glue 控制台中的开发终端节点,选择所需名称,复制在 Endpoint details (端点详细信息) 页面中列出的 Public address (公有地址)。dev-endpoint-public-dns
ssh -i
private-key-file-path
-NTL9007
: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
是解释器。
在笔记本中键入以下脚本片段并运行它。它使用人员在 Amazon Glue Data Catalog 中的元数据以从您的示例数据创建 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 (拒绝连接) 错误,则您可能正在使用过期的开发终端节点。尝试创建新的开发终端节点并重新连接。
-
如果您的网络连接超时或由于任何原因停止工作,则您可能需要采取以下步骤进行还原:
在 Zeppelin 中,在页面右上角的下拉菜单中,选择 Interpreters (解释器)。在解释器页面上,搜索
spark
。选择 edit (编辑),然后清除 Connect to existing process (连接现有进程) 复选框。在页面底部选择 Save (保存)。如前所述启动 SSH 端口转发。
在 Zeppelin 中,重新启用
spark
解释器的 Connect to existing process (连接现有进程) 设置,然后再次保存。
像这样重置解释器应该会恢复网络连接。另一种实现方法是在 Interpreters (解释器) 页面上为 Spark 解释器选择 restart (重新启动)。然后,等待最多 30 秒,以确保远程解释器已重新启动。
确保您的开发终端节点有权访问远程 Zeppelin 解释器。如果没有正确的网络权限,您可能会遇到错误,例如
open failed: connect failed: Connection refused
。