使用 EMR Studio 中的magic命令增強核心 - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 EMR Studio 中的magic命令增強核心

概觀

EMR Studio 和 EMR Notebooks 支援 magic 命令。Magic 命令或 magics是 IPython 核心提供的增強功能,可協助您執行和分析資料。IPython 是使用 Python 建置的交互式 Shell 環境。

Amazon EMR 也支援 Sparkmagic,這是一個套件,它使用特定 magic 命令提供 Spark 相關核心 (PySpark、SparkR 和 Scala 核心),並在叢集上使用 Livy 來提交 Spark 作業。

只要您的 EMR 筆記本中有 Python 核心,就可以使用 magic 命令。同樣,任何與 Spark 相關的核心都支援 Sparkmagic 命令。

Magic 命令 (也稱為 magics) 有兩種類型:

  • 行 magics - 這些 magic 命令由單個 % 字首表示,並在單行程式碼上進行操作

  • 儲存格 magics - 這些 magic 命令由雙 %% 字首表示,並在多行程式碼上進行操作

如需所有可用的 magics,請參閱 列出 magic 和 Sparkmagic 命令

考量與限制

  • EMR Serverless 不支援 %%sh 執行 spark-submit。它不支援 EMR Notebooks magics。

  • Amazon EMR on EKS 叢集不支援 EMR Studio 的 Sparkmagic 命令。這是因為與受管端點搭配使用的 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 列出 Sparkmagic 套件提供的目前可用的 Spark 相關 magic 函數。

使用 %%configure 設定 Spark

其中一個最有用的 Sparkmagic 命令是 %%configure 命令,它會設定工作階段建立參數。使用 conf 設定,可設定 Apache 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://amzn-s3-demo-bucket/my-jar.jar" } }
範例 :設定 Hudi

可使用筆記本編輯器來設定 EMR 筆記本以使用 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

%%sh magic 會在已附接的叢集的執行個體上執行子程序中的 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 Notebooks magics

Amazon EMR 提供下列 EMR Notebooks magics,可與 Python3 和 Spark 型核心搭配使用:

  • %mount_workspace_dir - 將工作區目錄掛載到叢集,以便可以從工作區中的其他檔案中匯入和執行程式碼

    注意

    使用 %mount_workspace_dir,只有 Python 3 核心可以存取您的本機檔案系統。Spark 執行者將無法使用此核心存取掛載的目錄。

  • %umount_workspace_dir - 從叢集中卸載您的工作區目錄

  • %generate_s3_download_url - 在 Amazon S3 物件的筆記本輸出中產生暫時下載連結

先決條件

安裝 EMR Notebooks magics 之前,請先完成以下任務:

  • 確保 叢集 EC2 執行個體的服務角色 (EC2 執行個體設定檔) 擁有 Amazon S3 的讀取權限。具有 AmazonElasticMapReduceforEC2Role 受管政策的 EMR_EC2_DefaultRole 符合此要求。如果您使用自訂角色或政策,請確定它具有必要的 S3 許可。

    注意

    EMR Notebooks magics 以筆記本使用者身分在叢集上執行,並使用 EC2 執行個體設定檔與 Amazon S3 互動。當您在 EMR 叢集上掛載工作區目錄時,所有具有附接至該叢集之許可的工作區和 EMR 筆記本都可以存取掛載的目錄。

    依預設,目錄會以唯讀方式掛載。雖然 s3fs-fusegoofys 允許讀寫掛載,但強烈建議您不要修改掛載參數,以便以讀寫模式掛載目錄。如果您允許寫入存取,則對目錄所做的任何變更都會寫入 S3 儲存貯體。為避免意外刪除或覆寫,可以為 S3 儲存貯體啟用版本控制。若要進一步了解,請參閱在 S3 儲存貯體中使用版本控制

  • 在叢集上執行下列其中一個指令碼,以安裝 EMR Notebooks magics 的相依性。若要執行指令碼,當您已經擁有執行中的叢集時,可以 使用自訂引導操作 或遵循在 Amazon EMR 叢集上執行命令和指令碼中的指示。

    可以選擇要安裝的相依性。s3fs-fusegoofys 都是 FUSE (Filesystem in Userspace) 工具,可讓您將 Amazon S3 儲存貯體作為本機檔案系統掛載在叢集上。該 s3fs 工具提供類似於 POSIX 的體驗。當您偏好效能勝於 POSIX 相容檔案系統時,goofys 工具是一個很好的選擇。

    Amazon EMR 7.x 系列使用不支援 EPEL 儲存庫的 Amazon Linux 2023。如果您正在執行 Amazon 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 Notebooks magics

注意

使用 Amazon EMR 6.0 到 6.9.0 版本以及 5.0 到 5.36.0 版本,只有 emr-notebooks-magics 套件版本 0.2.0 及更高版本支援 %mount_workspace_dir magic。

完成以下步驟來安裝 EMR Notebooks magics。

  1. 在筆記本中,執行下列命令來安裝 emr-notebooks-magics 套件。

    %pip install boto3 --upgrade %pip install botocore --upgrade %pip install emr-notebooks-magics --upgrade
  2. 重新啟動核心以載入 EMR Notebooks magics。

  3. 使用以下命令驗證您的安裝,該命令應該顯示 %mount_workspace_dir 的輸出說明文字。

    %mount_workspace_dir?

使用 %mount_workspace_dir 掛載工作區目錄

%mount_workspace_dir magic 可讓您將工作區目錄掛載到 EMR 叢集,以便匯入和執行目錄中儲存的其他檔案、模組或套件。

下列範例會將整個工作區目錄掛載到叢集上,並指定選用 <--fuse-type> 引數以使用 goofys 掛載目錄。

%mount_workspace_dir . <--fuse-type goofys>

若要確認工作區目錄已裝載,請使用下列範例透過 ls 命令顯示目前的工作目錄。輸出應該會顯示工作區中的所有檔案。

%%sh ls

當您在工作區中完成變更後,可以使用下列命令卸載工作區目錄:

注意

即使工作區已停止或分離,工作區目錄仍會保持掛載至叢集。必須明確地卸載您的工作區目錄。

%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,在無頭模式下執行筆記本

使用 %execute_notebook magic,可以在無頭模式下執行另一個筆記本,並檢視您執行的每個儲存格的輸出。此 magic 需要 Amazon EMR 和 Amazon EC2 共用的執行個體角色的額外許可。如需有關如何授予其他許可的詳細資訊,請執行命令 %execute_notebook?

在長時間執行的作業中,系統可能會因為閒置而進入休眠狀態,或可能暫時失去網際網路連線。這可能會中斷瀏覽器與 Jupyter 伺服器之間的連線。在這種情況下,您可能會丟失從 Jupyter 伺服器執行和傳送的儲存格的輸出。

如果使用 %execute_notebook magic 以無頭模式執行筆記本,EMR Notebooks 會從已執行的儲存格中擷取輸出,即使本機網路發生中斷。EMR Notebooks 會以遞增方式將輸出儲存在新筆記本中,其名稱與您執行的筆記本相同。EMR Notebooks 接著會將筆記本放入工作區內的新資料夾中。無頭執行發生在相同叢集上,並使用服務角色 EMR_Notebook_DefaultRole,但其他引數可以改變預設值。

若要以無頭模式執行筆記本,請使用下列命令:

%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 或更高版本。