博客
2022/10/15
Apache Hop 网页版与 Cloud Dataflow
Hop 是一个用于 Apache Beam 管道的无代码可视化开发环境,可以运行任何 Beam 运行器(例如 Dataflow、Flink 或 Spark)中的作业。 在之前的文章中,我们介绍了 Apache Hop 的桌面版本。Hop 还拥有一个 Web 环境,Hop Web,可以从容器中运行,因此您无需在计算机上安装任何东西即可使用它。
在本详细教程中,您将通过网络浏览器访问 Hop,并指向在 Google Cloud 上的虚拟机中运行的容器。该容器将在 Dataflow 中启动作业并报告这些作业的结果。由于我们不希望任何人都能访问您的 Hop 实例,因此我们将对其进行保护,以便只有您才能访问该虚拟机。下图说明了设置
我们将展示如何执行前面描述的部署,创建一个 Web 和可视化开发环境,仅使用 Web 浏览器即可构建 Beam 管道。完成后,您将拥有一个安全的 Web 环境,可以使用它使用 Web 浏览器创建管道并使用 Google Cloud Dataflow 启动它们。
运行此示例需要什么?
我们使用 Google Cloud,因此您首先需要一个 Google Cloud 项目。如果需要,您可以在 https://cloud.google.com/free 注册 Google Cloud 免费试用。
拥有项目后,您可以在 Web 浏览器中使用 Cloud Shell,无需额外设置。在 Cloud Shell 中,Google Cloud SDK 会自动为您的项目和凭据配置。这是我们在此处使用的选项。或者,您可以在本地计算机上配置 Google Cloud SDK。有关说明,请参阅 https://cloud.google.com/sdk/docs/install。
要打开 Cloud Shell,请转到 [Google Cloud 控制台] (http://console.cloud.google.com),确保已选择您的项目,然后单击 Cloud Shell 按钮 。Cloud Shell 将打开,您可以使用它运行本文中显示的命令。
我们将在后续步骤中使用的命令在 Github 中的 Gist 中可用,以防您更喜欢运行该脚本而不是从本教程中复制命令。
权限和帐户
当我们运行 Dataflow 管道时,可以使用我们的个人 Google Cloud 凭据来运行作业。但 Hop web 将在虚拟机中运行,而在 Google Cloud 中,虚拟机使用服务帐户作为凭据运行。因此,我们需要确保我们有一个服务帐户,该帐户有权运行 Dataflow 作业。
默认情况下,虚拟机使用名为 Compute Engine 默认服务帐户 的服务帐户。为了简单起见,我们将使用此帐户。不过,我们需要添加一些权限才能使用该服务帐户运行 Dataflow 作业。
首先,让我们确保已启用所有必需的 Google Cloud API。 单击此链接以启用 Dataflow、BigQuery 和 Pub/Sub,我们将在本工作流程中使用它们。该链接将带您到 Google Cloud 控制台中的项目,您可以在其中启用 API。
现在让我们为 VM 帐户授予权限。首先,找到服务帐户的 ID。打开 Cloud Shell,然后运行以下命令。
gcloud iam service-accounts list | grep compute
输出类似于以下内容,其中 <PROJECT_NUMBER>
被您的项目编号替换
EMAIL: <PROJECT_NUMBER>-compute@developer.gserviceaccount.com
复制该服务帐户 ID,因为我们将在下一步中使用它。运行以下命令将 Dataflow 管理员角色 授予服务帐户。该角色是运行作业所必需的
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member="serviceAccount:<SERVICE_ACCOUNT_ID>" --role="roles/dataflow.admin"
其中 <SERVICE_ACCOUNT_ID>
是您之前检索到的 ID。如果您在 Cloud Shell 中运行这些命令,则环境变量 GOOGLE_CLOUD_PROJECT
已设置为您的项目 ID。如果您从其他任何位置运行它,请使用项目的 ID 设置 $GOOGLE_CLOUD_PROJECT
变量。
现在,您的 Dataflow “用户” 是该服务帐户。如果您的作业正在访问 BigQuery、Cloud Storage、Pub/Sub 等中的数据,则还需要为这些服务授予服务帐户的角色。
磁盘和虚拟机
让我们在 Compute Engine 中创建一个虚拟机 (VM) 来运行 Apache Hop 的 Docker 容器。
在 Compute Engine 中,可以在 VM 中直接运行容器。在 Google Cloud 中运行容器还有其他选项,但 VM 可能最简单、最直接。完整详细信息请参阅 Google Cloud 文档的 在 VM 和 MIG 上部署容器 页面。
在本教程中,我们始终将在区域 europe-west1-b
中工作,因此您将在许多命令中看到该区域。但是,您可以选择任何 Google Cloud 区域;请记住使用您区域的值,而不是 europe-west1-b
。始终对所有资源(例如磁盘和 VM)使用相同的区域。为了最大程度地减少使用 Hop web 时出现的延迟,请选择地理位置靠近您的位置的区域。现在让我们定义区域并使用此变量进行其余命令
ZONE=europe-west1-b
容器具有短暂存储:当您重新启动容器时,容器的磁盘将恢复到其原始状态。因此,如果我们重新启动 Hop web 容器,我们将丢失所有宝贵的管道。为了避免这种情况,我们将创建一个持久磁盘,用于存储我们使用 Hop web 进行的所有工作。运行以下命令以创建磁盘
gcloud compute disks create my-hop-disk \
--type=pd-balanced \
--size=10GB \
--zone=$ZONE
由于有了此磁盘,我们能够停止虚拟机,并仍然保持 Hop web 中的所有个人文件完整无缺。
现在让我们创建 VM。对于 VM,我们需要选择网络(在默认情况下为 default
),这样 VM 就不会有公共 IP 地址。出于安全原因,这一点很重要,但由于身份感知代理的存在,这不会阻止我们从 Web 浏览器使用 VM。稍后会详细介绍;现在让我们创建 VM
gcloud compute instances create-with-container my-hop-vm \
--zone=$ZONE \
--network-interface=subnet=default,no-address \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--tags=http-server,https-server,ssh \
--container-image=apache/hop-web:2.0.1 \
--container-restart-policy=on-failure \
--container-mount-disk=mode=rw,mount-path=/root,name=my-hop-disk,partition=0 \
--disk=boot=no,device-name=my-hop-disk,mode=rw,name=my-hop-disk
您可能想知道那些额外的选项是什么。它们是 VM 与 Hop web 正确配合所必需的。例如,scopes
选项允许 VM 使用 Dataflow,而 tags
选项让您的浏览器通过网络防火墙访问 Hop web 地址。
Apache Hop 在端口 8080 上侦听 HTTP 连接,因此,如果您在项目中添加了其他自定义防火墙规则,请确保您没有阻止端口 8080 上的 TCP 流量。
等等,我们创建了一台只有私有 IP 的机器。我们如何从计算机上的 Web 浏览器访问 Hop web?我们是否需要一个公共 IP 地址才能做到这一点?
Google Cloud 具有一个名为身份感知代理 (IAP) 的功能,可用于使用授权层包装服务,允许连接到只有内部 IP 的资源。
我们可以使用 IAP 包装 Apache Hop web 服务器。使用以下命令,我们创建了一个在本地端口 8080 上侦听的隧道,该隧道连接到 VM 上的端口 8080
gcloud compute start-iap-tunnel my-hop-vm 8080 --local-host-port=localhost:8080 --zone=$ZONE
要保持隧道打开,请让该命令继续运行。如果该命令在创建 VM 后立即失败,请等待几秒钟,然后重试;容器可能仍在启动。
现在,我们有一个可以使用 Web 浏览器连接的隧道。如果您在本地计算机上运行这些命令,而不是在 Cloud Shell 中运行,请将浏览器指向 localhost:8080
。Hop UI 应该加载。
如果您在 Cloud Shell 中运行这些命令,我们应该将浏览器指向哪里?Cloud Shell 附带一个实用程序,可以用于此类情况。在 Cloud Shell 中,找到 Web 预览 按钮
如果预览没有使用端口 8080,请单击 更改端口,然后切换到端口 8080。单击 在端口上预览 时,Cloud Shell 会在您的浏览器中打开一个新标签,该标签指向隧道地址。
身份感知代理 将要求您使用 Google 帐户进行身份验证。
之后,Apache Hop web 界面将加载
该 URL 使用您的 Google 帐户进行身份验证,与您用于 Google Cloud 的帐户相同(即您在 Google Cloud SDK 中经过身份验证的帐户)。因此,即使其他人获得了该 URL 地址,他们也无法访问您的 Apache Hop 实例。
您现在已准备好使用 Web 浏览器中的 Apache Hop!
您可以尝试使用 Hop web 复制 之前文章中 给出的示例,或者尝试从 Hop 附带的示例中启动任何其他项目
我应该将我的内容存储在哪里?
容器文件系统中的目录是短暂的。您如何确保将管道和 JAR 存储在持久位置?
主目录容器为 /root
,它是容器中唯一的 持久 目录(由于我们之前创建的磁盘)。无论出于何种原因重新启动 VM 时,该目录中包含的任何文件都将保留。但其余目录将重置为其原始状态。因此,请确保将管道、为 Dataflow 生成的胖 JAR 等内容保存在 /root
目录或其子目录中。
在 Hop 文件对话框中,当您单击主目录图标时,您将被重定向到 /root
目录,因此使用它来存储所有内容非常简单。在图片中的示例中,我们单击了 主目录 按钮并将 JAR 存储在该持久目录中
关闭虚拟机
如果您想在不使用虚拟机时节省一些资金,请停止 VM,并在需要时重新启动它。/root 目录的内容在停止虚拟机时会保存。
要停止虚拟机,请运行以下命令(或在控制台中,在 Compute Engine 虚拟机页面上,单击 **停止**)
gcloud compute instances stop my-hop-vm --zone=$ZONE
要重新启动它,请运行以下命令
gcloud compute instances start my-hop-vm --zone=$ZONE
请记住,您需要运行身份感知代理才能访问 Hop 网页,因此在启动虚拟机后,请不要忘记运行命令以启动身份感知代理(如果它在启动后立即失败,请等待几秒钟,然后再次运行它)
gcloud compute start-iap-tunnel my-hop-vm 8080 --local-host-port=localhost:8080 --zone=$ZONE
摘要
这篇文章表明,运行 Hop 所需的只是网页浏览器。当然,还需要一个 Google Cloud 项目。
我们将容器部署到 Google Cloud 中的虚拟机上,因此您可以从任何地方访问 Hop,并且我们创建了一个持久磁盘,以便您可以为您的管道提供永久存储。现在,您可以使用您的网页浏览器创建管道并运行 Dataflow 作业,而无需在您的计算机上本地安装任何内容:Java、Docker 或 Google Cloud SDK;什么也不需要,只需要您喜欢的网页浏览器。
如果您按照本文中的说明操作,请转到文章 使用 Google Cloud Dataflow 运行 Apache Hop 可视化管道,从您的网页浏览器运行 Dataflow 管道!