

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

# 使用 EMR Studio 中的magic命令增強核心
<a name="emr-studio-magics"></a>

## 概觀
<a name="overview-magics"></a>

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 命令](#accessing-all-magic-commands)。

## 考量和限制
<a name="considerations-limitations-magics"></a>
+ 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 命令
<a name="accessing-all-magic-commands"></a>

使用以下命令，列出可用的 magic 命令：
+ `%lsmagic` 列出所有目前可用的 magic 函數。
+ `%%help` 列出 Sparkmagic 套件提供的目前可用的 Spark 相關 magic 函數。

## 使用 `%%configure` 設定 Spark
<a name="using-configure-sparkmagic"></a>

其中一個最有用的 Sparkmagic 命令是 `%%configure` 命令，它會設定工作階段建立參數。使用 `conf` 設定，可設定 [Apache Spark 組態文件](https://spark.apache.org/docs/latest/configuration.html)中提到的任何 Spark 組態。

**Example 將外部 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"
    }
}
```

**Example ：設定 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`
<a name="using-sh-sparkmagic"></a>

`%%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 使用者和作業活動](emr-managed-notebooks-spark-monitor.md)。

## 使用 `%%display` 來可視化 Spark 資料框架
<a name="using-display-sparkmagic"></a>

可以使用 `%%display` magic 來可視化 Spark 資料框架。若要使用此 magic，請執行以下命令。

```
%%display df
```

選擇檢視資料表格式的結果，如下圖顯示。

![使用 %%display magic 的輸出，以資料表格式顯示結果。](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/magic-display-table.png)


也可以選擇使用五種類型的圖表將資料可視化。您的選項包括圓餅圖、散佈圖、折線圖、區域圖和長條圖。

![使用 %%display magic 的輸出，以圖表格式顯示結果。](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/magic-display-chart.png)


## 使用 EMR Notebooks magics
<a name="emr-magics"></a>

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 物件的筆記本輸出中產生暫時下載連結 

### 先決條件
<a name="emr-magics-prereqs"></a>

安裝 EMR Notebooks magics 之前，請先完成以下任務：
+ 確保 [叢集 EC2 執行個體的服務角色 (EC2 執行個體設定檔)](emr-iam-role-for-ec2.md) 擁有 Amazon S3 的讀取權限。具有 `AmazonElasticMapReduceforEC2Role` 受管政策的 `EMR_EC2_DefaultRole` 符合此要求。如果您使用自訂角色或政策，請確定它具有必要的 S3 許可。
**注意**  
EMR Notebooks magics 以筆記本使用者身分在叢集上執行，並使用 EC2 執行個體設定檔與 Amazon S3 互動。當您在 EMR 叢集上掛載工作區目錄時，所有具有附接至該叢集之許可的工作區和 EMR 筆記本都可以存取掛載的目錄。  
依預設，目錄會以唯讀方式掛載。雖然 `s3fs-fuse` 和 `goofys` 允許讀寫掛載，但強烈建議您不要修改掛載參數，以便以讀寫模式掛載目錄。如果您允許寫入存取，則對目錄所做的任何變更都會寫入 S3 儲存貯體。為避免意外刪除或覆寫，可以為 S3 儲存貯體啟用版本控制。若要進一步了解，請參閱[在 S3 儲存貯體中使用版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。
+ 在叢集上執行下列其中一個指令碼，以安裝 EMR Notebooks magics 的相依性。若要執行指令碼，當您已經擁有執行中的叢集時，可以 [使用自訂引導操作](emr-plan-bootstrap.md#bootstrapCustom) 或遵循[在 Amazon EMR 叢集上執行命令和指令碼](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-commandrunner.html)中的指示。

  可以選擇要安裝的相依性。[s3fs-fuse](https://github.com/s3fs-fuse/s3fs-fuse) 和 [goofys](https://github.com/kahing/goofys) 都是 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](https://github.com/s3fs-fuse/s3fs-fuse/blob/master/COMPILATION.md) 指示安裝 `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
<a name="emr-magics-install"></a>

**注意**  
使用 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. 在筆記本中，執行下列命令來安裝 [https://pypi.org/project/emr-notebooks-magics/](https://pypi.org/project/emr-notebooks-magics/) 套件。

   ```
   %pip install boto3 --upgrade
   %pip install botocore --upgrade
   %pip install emr-notebooks-magics --upgrade
   ```

1. 重新啟動核心以載入 EMR Notebooks magics。

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

   ```
   %mount_workspace_dir?
   ```

### 使用 `%mount_workspace_dir` 掛載工作區目錄
<a name="emr-magics-mount-workspace"></a>

`%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 物件
<a name="emr-magics-generate-s3-download-url"></a>

`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`，在無頭模式下執行筆記本
<a name="headless-execution"></a>

使用 `%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 共用執行個體角色時，角色需要以下額外許可：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:StartNotebookExecution",
        "elasticmapreduce:DescribeNotebookExecution",
        "ec2:DescribeInstances"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowELASTICMAPREDUCEStartnotebookexecution"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/EMR_Notebooks_DefaultRole"
      ],
      "Sid": "AllowIAMPassrole"
    }
  ]
}
```

------

**注意**  
要使用 `%execute_notebook` magic，請安裝 `emr-notebooks-magics` 套件版本 0.2.3 或更高版本。