使用以下方法增强内核 magic EMR Studio 中的命令 - Amazon EMR

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

使用以下方法增强内核 magic EMR Studio 中的命令

概览

EMR Studio 和 EMR Notebooks 支持 magic 命令。Magic 命令,或 magics,是 IPython 内核为帮助您运行和分析数据而提供的增强功能。 IPython是一个使用 Python 构建的交互式外壳环境。

亚马逊 EMR 还支持 Sparkmagic,一个包为与 Spark 相关的内核(、PySpark SparkR 和 Scala 内核)提供特定的 magic 命令并使用集群上的 Livy 提交 Spark 作业。

您可以使用 … magic 只要你的 EMR 笔记本中有 Python 内核,就可以使用命令。同样,任何与 Spark 相关的内核都支持 Sparkmagic 命令。

Magic 命令,也称为 magics,有两个品种:

  • 线 magics — 这些 magic 命令由单个%前缀表示并对一行代码进行操作

  • 细胞 magics — 这些 magic 命令由双%%前缀表示并对多行代码进行操作

全部可用 magics,请参阅列表 magic 以及 Sparkmagic 命令

注意事项和限制

  • EMR Serverless 不支持使用 %%sh 来运行 spark-submit,它不支持 EMR Notebooks magic。

  • EKS 集群上的 Amazon EMR 不支持 Sparkmagic EMR Studio 的命令。这是因为你与托管端点一起使用的 Spark 内核内置在 Kubernetes 中,但不受支持 Sparkmagic 还有 Livy。您可以将 Spark 配置直接设置到 SparkContext 对象中作为解决方法,如以下示例所示。

    spark.conf.set("spark.driver.maxResultSize", '6g')
  • 以下 magic 以下各方禁止命令和操作 AWS:

    • %alias

    • %alias_magic

    • %automagic

    • %macro

    • 使用 %configure 修改 proxy_user

    • 使用 %env%set_env 修改 KERNEL_USERNAME

列表 magic 以及 Sparkmagic 命令

使用以下命令列出可用的 magic 命令:

  • %lsmagic列出所有当前可用的 magic 函数。

  • %%help列出当前可用的 Spark 相关信息 magic 提供的函数 Sparkmagic 包裹。

使用 %%configure 来配置 Spark

最有用的之一 Sparkmagic %%configurecommands 是用于配置会话创建参数的命令。借助 conf 设置,您可以配置 Apache Spark 配置文档 中提及的任何 Spark 配置。

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

您可以使用以下方法向支持的任何与 Spark 相关的内核添加外部 JAR 文件依赖关系 Sparkmagic.

%%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://amzn-s3-demo-bucket/my-jar.jar" } }
例 : 配置 Hudi

您可以使用 Notebook 编辑器来配置 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-submit

这些区域有:%%shmagic 在所连接集群的实例上的子进程中运行 shell 命令。通常,您需要使用其中一个 Spark 相关的内核在附加的集群上运行 Spark 应用程序。但是,如果你想使用 Python 内核提交 Spark 应用程序,你可以使用以下方法 magic,将存储桶名称替换为小写的存储桶名称。

%%sh spark-submit --master yarn --deploy-mode cluster s3://amzn-s3-demo-bucket/test.py

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

你可以将任何 Linux 命令与 %%sh magic。 如果要运行任何 Spark 或 YARN 命令,请使用以下选项之一创建 emr-notebook Hadoop 用户并授予该用户运行命令的权限:

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

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

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

你可以使用 %%display magic 来可视化 Spark 数据框。要使用这个 magic,运行以下命令。

%%display df

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

使用 %%display 的输出 magic 它以表格格式显示结果。

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

使用 %%display 的输出 magic 它以图表格式显示结果。

使用 EMR 笔记本电脑 magics

亚马逊 EMR 提供以下 EMR 笔记本电脑 magic所以你可以与基于 Python3 和基于 Spark 的内核一起使用:

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

    注意

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

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

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

先决条件

在安装 EMR Notebooks 之前 magics,完成以下任务:

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

    注意

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

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

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

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

    Amazon EMR 7.x 系列使用 Amazon Linux 2023,该版本不支持 EPEL 存储库。如果你运行的是亚马逊 EMR 7.x,请按照 s3fs-fuse GitHub 的说明进行安装。s3fs-fuse如果使用 5.x 或 6.x 系列,请使用以下命令安装 s3fs-fuse

    #!/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 笔记本电脑 magics

注意

在亚马逊 EMR 版本 6.0 到 6.9.0 以及 5.0 到 5.36.0 版本中,只有包版本 0.2.0 及更高版本支持 emr-notebooks-magics %mount_workspace_dir magic.

完成以下步骤安装 EMR Notebooks magic。

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

    %pip install boto3 --upgrade %pip install botocore --upgrade %pip install emr-notebooks-magics --upgrade
  2. 重启内核以加载 EMR Notebooks magic。

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

    %mount_workspace_dir?

使用 %mount_workspace_dir 挂载 Workspace 目录

这些区域有:%mount_workspace_dirmagic 允许您将 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?

使用 %execute_notebook 在无头模式下运行 Notebook

%execute_notebook magic,你可以在无头模式下运行另一台笔记本电脑,并查看你运行的每个单元的输出。该 magic 需要对 Amazon EMR 和亚马逊共享的实例角色拥有额外的权限。 EC2 有关如何授予额外权限的更多信息,请运行命令 %execute_notebook?

如果有长时间运行的任务,系统可能会因为不活动而进入睡眠状态,也可能暂时失去互联网连接。这可能会中断浏览器与 Jupyter 服务器之间的连接。如果出现这种情况,您可能会丢失自己运行的单元格和 Jupyter 服务器发送的单元格的输出内容。

如果你在无头模式下运行笔记本电脑 %execute_notebook magic,EMR Notebooks 会捕获已运行的单元的输出,即使本地网络出现中断也是如此。EMR Notebooks 将输出以增量方式保存在与您运行的 Notebook 同名的新 Notebook 中。然后,EMR Notebooks 将 Notebook 放入 Workspace 内的新文件夹。无头运行发生在同一个集群上并使用 EMR_Notebook_DefaultRole 服务角色,但其他参数可能会更改默认值。

要在无头模式下运行 Notebook,请使用以下命令:

%execute_notebook <relative-file-path>

要为无头运行指定集群 ID 和服务角色,请使用以下命令:

%execute_notebook <notebook_name>.ipynb --cluster-id <emr-cluster-id> --service-role <emr-notebook-service-role>

当 Amazon EMR 和 Amazon EC2 共享实例角色时,该角色需要以下额外权限:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "elasticmapreduce:StartNotebookExecution", "elasticmapreduce:DescribeNotebookExecution", "ec2:DescribeInstances" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::<AccoundId>:role/EMR_Notebooks_DefaultRole" } ] }
注意

使用 %execute_notebook magic,安装emr-notebooks-magics软件包,版本 0.2.3 或更高版本。