使用魔术命令增强内核 - Amazon EMR

使用魔术命令增强内核

EMR Studio 和 EMR Notebooks 支持魔术命令,这些命令是 IPython 内核为帮助运行和分析数据而提供的增强功能。IPython 是用 Python 构建的交互式 shell 环境。

Amazon EMR 还支持 Sparkmagic,该软件包为 Spark 相关内核(PySpark、SparkR 和 Scala 内核)提供特定的魔术命令,并使用集群上的 Livy 提交 Spark 任务。

只要您的 EMR Notebooks 中有 Python 内核,就可以使用魔术命令。同样,任何与 Spark 相关的内核都支持 Sparkmagic 命令。

魔术命令也称作 magics,有两个种类:

  • 行魔术命令 (Line Magic) — 这类魔法命令用单个 % 前缀表示,并在一行代码上运行

  • 单元格魔术命令 (Cell Magic) — 这类魔法命令用双 %% 前缀表示,并在多行代码上运行

魔术命令的完整列表可在 IPython 网站查到。要了解有关 Sparkmagic 命令的详细信息,请参阅 GitHub 网站的 Sparkmagic

注意事项和限制

Amazon EMR on EKS 集群不支持 EMR Studio 的 Sparkmagic 命令。这是因为与托管式终端节点一起使用的 Spark 内核内置于 Kubernetes,而不受 Sparkmagic 和 Livy 的支持。作为暂时的解决方法,您可以将 Spark 配置直接设置到 SparkContext 对象,如以下示例所示。

spark.conf.set("spark.driver.maxResultSize", '6g')

AWS出于安全考虑,不允许使用以下魔术命令:

  • %alias

  • %alias_magic

  • %automagic

  • %macro

  • 使用 %configure 修改 proxy_user

  • 使用 %env%set_env 修改 KERNEL_USERNAME

列出魔术命令和 Sparkmagic 命令

使用以下命令列出可用的魔术命令:

  • %lsmagic 列出当前可用的所有魔术函数

  • %%help 列出 Sparkmagic 软件包提供的当前可用的 Spark 相关魔术函数

使用 %%configure 配置 Spark

Sparkmagic 最有用的命令之一是 %%configure 命令,该命令配置会话创建参数。使用conf 设置,您可以配置 Spark 的配置文档提及的任何 Spark 配置。

例 将外部 JAR 文件从 Maven 存储库或 Amazon S3 添加到 EMR Notebooks

您可以使用以下方法将外部 JAR 文件依赖项添加到 Sparkmagic 支持的任何 Spark 相关内核中。

%%configure -f {"conf": { "spark.jars.packages": "com.jsuereth:scala-arm_2.11:2.0,ml.combust.bundle:bundle-ml_2.11:0.13.0,com.databricks:dbutils-api_2.11:0.0.3", "spark.jars": "s3://DOC-EXAMPLE-BUCKET/my-jar.jar" } }

例 : 配置 Hudi

您可以使用笔记本编辑器来配置 EMR Notebook 以使用 Hudi。

%%configure { "conf": { "spark.jars": "hdfs://apps/hudi/lib/hudi-spark-bundle.jar,hdfs:///apps/hudi/lib/spark-spark-avro.jar", "spark.serializer": "org.apache.spark.serializer.KryoSerializer", "spark.sql.hive.convertMetastoreParquet":"false" } }

使用 %%sh 运行 Spark 提交

在附加集群的实例上,%%sh 魔术在子进程运行 shell 命令。通常,您需要使用其中一个 Spark 相关的内核在附加的集群上运行 Spark 应用程序。但是,如果您想使用 Python 内核提交 Spark 应用程序,可以使用以下魔术,以此将存储桶名称替换为小写的存储桶名称。

%%sh spark-submit --master yarn --deploy-mode cluster s3://DOC-EXAMPLE-BUCKET/test.py

在此示例中,集群需要访问 s3://DOC-EXAMPLE-BUCKET/test.py 的位置,否则该命令将失败。

您可以凭借 %%sh 魔术使用任何 Linux 命令。如果您要运行任何 Spark 或 YARN 命令,请使用以下选项之一创建 emr-notebook Hadoop 用户,并授予用户运行这些命令的权限。

  • 您可以通过运行以下命令显式创建新用户。

    hadoop fs -mkdir /user/emr-notebook hadoop fs -chown emr-notebook /user/emr-notebook
  • 您可以在 Livy 中启用用户模拟功能,从而自动创建用户。参阅 启用用户模拟以监控 Spark 用户和任务活动 了解更多信息。

使用 %%display 可视化 Spark 数据框

%%display 魔术可以让您快速可视化数据框。要使用此魔术,请运行以下命令。

%%display df

您可以选择以表格格式查看结果,如下图所示。


              使用 %%display 魔术的输出,以表格格式显示结果。

您也可以选择使用五种类型的图表来可视化数据。您的选项包括饼图、散点图、折线图、面积图和条形图。


              使用 %%display 魔术的输出,以图标格式显示结果。

使用 EMR Notebooks 魔术命令

Amazon EMR 提供了以下 EMR Notebooks 魔术命令,您可以将其与 Python3 和基于 Spark 的内核配合使用:

  • %mount_workspace_dir – 将 Workspace 目录挂载到集群,以便您可以从 Workspace 中的其他文件导入和运行代码

    注意

    使用 %mount_workspace_dir 时,只有 Python 3 内核可以访问本地文件系统。Spark 执行器将无法使用此内核访问挂载的目录。

  • %umount_workspace_dir - 从集群中卸载 Workspace 目录

  • %generate_s3_download_url - 在笔记本输出中为 Amazon S3 对象生成临时下载链接

先决条件

在安装 EMR Notebooks 魔术命令之前,请完成以下任务:

  • 确保您的 集群 EC2 实例(EC2 实例配置文件)的服务角色 拥有 Amazon S3 的读取访问权限。使用 AmazonElasticMapReduceforEC2Role 托管策略的 EMR_EC2_DefaultRole 满足此要求。如果您使用自定义角色或策略,请确保它拥有必要的 S3 权限。

    注意

    EMR Notebooks 魔术命令作为笔记本用户在集群上运行,并使用 EC2 实例配置文件与 Amazon S3 进行交互。在 EMR 集群上挂载 Workspace 目录时,拥有附加到该集群权限的所有 Workspace 和 EMR Notebooks 都可以访问已挂载的目录。

    预设情况下,目录将以只读方式挂载。虽然 s3fs-fusegoofys 允许读-写挂载,但我们强烈建议您不要将挂载参数修改为以读-写模式挂载目录。如果您允许写入权限,则对目录所做的任何更改都将写入 S3 存储桶。为避免意外删除或覆盖,您可以为 S3 存储桶启用版本控制。要了解更多信息,请参阅在 S3 存储桶中使用版本控制

  • 在集群上运行以下脚本之一,以安装 EMR Notebooks 魔术命令的依赖项。要运行脚本,您可以 使用自定义引导操作,或当您已经有正在运行的集群时,按照在 Amazon EMR 集群上运行命令和脚本中的说明进行操作。

    您可以选择要安装哪个依赖项。s3fs-fusegoofys 都是 FUSE(用户空间中的文件系统)工具,这些工具允许您将 Amazon S3 存储桶作为本地文件系统挂载到集群上。s3fs 工具可提供类似于 POSIX 的体验。当您更喜欢性能而不是符合 POSIX 标准的文件系统时,goofys 工具是不错的选择。

    #!/bin/sh # Install the s3fs dependency for EMR Notebooks magics sudo amazon-linux-extras install epel -y sudo yum install s3fs-fuse -y

    或者

    #!/bin/sh # Install the goofys dependency for EMR Notebooks magics sudo wget https://github.com/kahing/goofys/releases/latest/download/goofys -P /usr/bin/ sudo chmod ugo+x /usr/bin/goofys

安装 EMR Notebooks 魔术命令

完成以下步骤以安装 EMR Notebooks 魔术命令。

  1. 在您的笔记本中,运行下面的命令以安装 emr-notebooks-magics 程序包。

    %pip install emr-notebooks-magics
  2. 重启您的内核以加载 EMR Notebooks 魔术命令。

  3. 使用下面的命令验证安装,该命令应该显示用于 %mount_workspace_dir 的输出帮助文本。

    %mount_workspace_dir?

使用 %mount_workspace_dir 挂载 Workspace 目录

%mount_workspace_dir 魔术命令使您能将 Workspace 目录挂载到 EMR 集群上,以便您能导入和运行存储在目录中的其他文件、模块或程序包。

下面的示例将整个 Workspace 目录挂载到集群上,并指定可选的 <--fuse-type> 参数,以使用 goofys 挂载目录。

%mount_workspace_dir . <--fuse-type goofys>

要验证您的 Workspace 目录是否已挂载,请使用下面的示例,借助 ls 命令来显示当前的工作目录。输出结果应该显示 Workspace 中的所有文件。

%%sh ls

在 Workspace 中完成更改后,可以使用下面的命令卸载 Workspace 目录。

注意

即使 Workspace 已停止或已分离,您的 Workspace 目录仍会保持挂载到集群上。您必须显式卸载 Workspace 目录。

%umount_workspace_dir

使用 %generate_s3_download_url 下载 Amazon S3 对象

generate_s3_download_url 命令可为存储在 Amazon S3 中的对象创建预签名 URL。您可以使用该预签名 URL 将对象下载到本地计算机。例如,您可以运行 generate_s3_download_url 下载代码写入 Amazon S3 的 SQL 查询的结果。

预设情况下,预签名 URL 的有效期为 60 分钟。您可以通过指定 --expires-in 标志的秒数来更改过期时间。例如,--expires-in 1800 创建一个有效期为 30 分钟的 URL。

下面的示例通过指定完整的 Amazon S3 路径来为对象生成下载链接:s3://EXAMPLE-DOC-BUCKET/path/to/my/object

%generate_s3_download_url s3://EXAMPLE-DOC-BUCKET/path/to/my/object

要了解有关使用 generate_s3_download_url 的更多信息,请运行下面的命令以显示帮助文本。

%generate_s3_download_url?