

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

# 從 Amazon EMR 載入資料
<a name="loading-data-from-emr"></a>

您可以使用 COPY 命令從 Amazon EMR 叢集平行載入資料，而叢集設定為以固定寬度檔案、字元分隔檔案、CSV 檔案或 JSON 格式檔案的形式，將文字檔案寫入叢集的 Hadoop 分散式檔案系統 (HDFS)。

## 從 Amazon EMR 載入資料的程序
<a name="load-from-emr-process"></a>

本節會逐步引導您完成從 Amazon EMR 叢集載入資料的程序。下列小節提供必須完成每個步驟的詳細資訊。
+ **[步驟 1：設定 IAM 許可](#load-from-emr-steps-configure-iam)**

  建立 Amazon EMR 叢集和執行 Amazon Redshift COPY 命令的使用者必須具備必要的許可。
+ **[步驟 2：建立 Amazon EMR 叢集。](#load-from-emr-steps-create-cluster)**

  設定叢集以輸出文字檔案至 Hadoop 分散式檔案系統 (HDFS)。您將需要 Amazon EMR 叢集 ID 和叢集的主要公有 DNS (主控叢集的 Amazon EC2 執行個體端點)。
+ **[步驟 3：擷取 Amazon Redshift 叢集公有金鑰和叢集節點 IP 地址](#load-from-emr-steps-retrieve-key-and-ips)**

  公有金鑰可讓 Amazon Redshift 叢集節點與主機建立 SSH 連線。您將使用每個叢集節點的 IP 地址來設定主機安全群組，以允許使用這些 IP 地址從您的 Amazon Redshift 叢集存取。
+ **[步驟 4：將 Amazon Redshift 叢集公有金鑰新增至每個 Amazon EC2 主機的授權金鑰檔案](#load-from-emr-steps-add-key-to-host)** 

  您可以將 Amazon Redshift 叢集公有金鑰新增至主機的授權金鑰檔案，以便主機識別 Amazon Redshift 叢集並接受 SSH 連線。
+ **[步驟 5：設定主機以接受所有 Amazon Redshift 叢集的 IP 地址](#load-from-emr-steps-configure-security-groups)** 

  修改 Amazon EMR 執行個體的安全群組，以新增傳入規則來接受 Amazon Redshift IP 地址。
+ **[步驟 6：執行 COPY 命令以載入資料](#load-from-emr-steps-run-copy)**

  從 Amazon Redshift 資料庫，執行 COPY 命令以將資料載入至 Amazon Redshift 資料表。

## 步驟 1：設定 IAM 許可
<a name="load-from-emr-steps-configure-iam"></a>

建立 Amazon EMR 叢集和執行 Amazon Redshift COPY 命令的使用者必須具備必要的許可。

**設定 IAM 許可**

1. 為將建立 Amazon EMR 叢集的使用者新增下列許可。

   ```
   ec2:DescribeSecurityGroups
   ec2:RevokeSecurityGroupIngress
   ec2:AuthorizeSecurityGroupIngress
   redshift:DescribeClusters
   ```

1. 為將執行 COPY 命令的 IAM 角色或使用者新增下列許可。

   ```
   elasticmapreduce:ListInstances
   ```

1. 將下列許可新增至 Amazon EMR 叢集的 IAM 角色。

   ```
   redshift:DescribeClusters
   ```

## 步驟 2：建立 Amazon EMR 叢集。
<a name="load-from-emr-steps-create-cluster"></a>

COPY 命令會從 Amazon EMR Hadoop 分散式檔案系統 (HDFS) 上的檔案載入資料。建立 Amazon EMR 叢集時，請設定叢集以輸出資料檔案至叢集的 HDFS。

**建立 Amazon EMR 叢集**

1. 在與 Amazon Redshift 叢集相同的 AWS 區域中建立 Amazon EMR 叢集。

   如果 Amazon Redshift 叢集位於 VPC 中，Amazon EMR 叢集必須位在相同的 VPC 群組。如果 Amazon Redshift 叢集使用 EC2-Classic 模式 (亦即，不在 VPC 中)，Amazon EMR 叢集也必須使用 EC2-Classic 模式。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[在虛擬私有雲端 (VPC) 中管理叢集](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-vpc.html)。

1. 設定叢集以將資料檔案輸出至叢集的 HDFS。HDFS 檔案名稱不能包括星號 (\$1) 或問號 (?)。
**重要**  
檔案名稱不能包括星號 (\$1) 或問號 (?)。

1. 針對 Amazon EMR 叢集組態中的**自動終止**選項指定**否**，以便叢集在 COPY 命令執行時保持可用狀態。
**重要**  
如果 COPY 完成之前有任何資料檔案變更或刪除，可能會發生非預期的結果，COPY 操作也可能失敗。

1. 請記下叢集 ID 和主要公有 DNS (主控叢集的 Amazon EC2 執行個體端點)。您將在稍後的步驟中使用該資訊。

## 步驟 3：擷取 Amazon Redshift 叢集公有金鑰和叢集節點 IP 地址
<a name="load-from-emr-steps-retrieve-key-and-ips"></a>

您將使用每個叢集節點的 IP 地址來設定主機安全群組，以允許使用這些 IP 地址從您的 Amazon Redshift 叢集存取。

**使用主控台擷取您叢集的 Amazon Redshift 叢集公有金鑰和叢集節點 IP 地址**

1. 存取 Amazon Redshift 管理主控台。

1. 在導覽窗格中，選擇**叢集**連結。

1. 從清單選取您的叢集。

1. 找到 **SSH Ingestion Settings (SSH 擷取設定)** 群組。

   記下 **Cluster Public Key (叢集公有金鑰)** 和 **Node IP addresses (節點 IP 地址)**。您將在稍後的步驟中用到它們。  
![\[SSH 擷取設定群組的螢幕擷取畫面，其中顯示叢集公有金鑰和節點 IP 位址。\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/images/copy-from-ssh-console-2.png)

   您將使用步驟 3 的私有 IP 地址來設定 Amazon EC2 主機以接受來自 Amazon Redshift 的連線。

若要使用 Amazon Redshift CLI 來擷取叢集的叢集公有金鑰和叢集節點 IP 地址，請執行 describe-clusters 命令。例如：

```
aws redshift describe-clusters --cluster-identifier <cluster-identifier> 
```

回應將包含 ClusterPublicKey 值和私有和公有 IP 地址的清單，類似於下列：

```
{
    "Clusters": [
        {
            "VpcSecurityGroups": [], 
            "ClusterStatus": "available", 
            "ClusterNodes": [
                {
                    "PrivateIPAddress": "10.nnn.nnn.nnn", 
                    "NodeRole": "LEADER", 
                    "PublicIPAddress": "10.nnn.nnn.nnn"
                }, 
                {
                    "PrivateIPAddress": "10.nnn.nnn.nnn", 
                    "NodeRole": "COMPUTE-0", 
                    "PublicIPAddress": "10.nnn.nnn.nnn"
                }, 
                {
                    "PrivateIPAddress": "10.nnn.nnn.nnn", 
                    "NodeRole": "COMPUTE-1", 
                    "PublicIPAddress": "10.nnn.nnn.nnn"
                }
            ], 
            "AutomatedSnapshotRetentionPeriod": 1, 
            "PreferredMaintenanceWindow": "wed:05:30-wed:06:00", 
            "AvailabilityZone": "us-east-1a", 
            "NodeType": "dc2.large", 
            "ClusterPublicKey": "ssh-rsa AAAABexamplepublickey...Y3TAl Amazon-Redshift", 
             ...
             ...
}
```

若要使用 Amazon Redshift API 來擷取叢集的叢集公有金鑰和叢集節點 IP 地址，請使用 `DescribeClusters` 動作。如需詳細資訊，請參閱《Amazon Redshift CLI 指南》**中的 [describe-clusters](https://docs.aws.amazon.com/cli/latest/reference/redshift/describe-clusters.html) 或《Amazon Redshift API 指南》中的 [DescribeClusters](https://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusters.html)。

## 步驟 4：將 Amazon Redshift 叢集公有金鑰新增至每個 Amazon EC2 主機的授權金鑰檔案
<a name="load-from-emr-steps-add-key-to-host"></a>

您可以將叢集公有金鑰新增至所有 Amazon EMR 叢集節點的每個主機的授權金鑰檔案，以便主機識別 Amazon Redshift 並接受 SSH 連線。

**將 Amazon Redshift 叢集公有金鑰新增至主機的授權金鑰檔案**

1. 使用 SSH 連線存取主機。

   如需使用 SSH 連接至執行個體的詳細資訊，請參閱《Amazon EC2 使用者指南》**中的[連接至您的執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-connect-to-instance-linux.html)。

1. 從主控台或從 CLI 回應文字複製 Amazon Redshift 公有金鑰。

1. 將公有金鑰的內容複製和貼上至主機上的 `/home/<ssh_username>/.ssh/authorized_keys` 檔案。包括完整字串，包括字首 "`ssh-rsa`" 和字尾 "`Amazon-Redshift`"。例如：

   ```
   ssh-rsa AAAACTP3isxgGzVWoIWpbVvRCOzYdVifMrh… uA70BnMHCaMiRdmvsDOedZDOedZ Amazon-Redshift
   ```

## 步驟 5：設定主機以接受所有 Amazon Redshift 叢集的 IP 地址
<a name="load-from-emr-steps-configure-security-groups"></a>

 若要允許對主機執行個體的輸入流量，請編輯安全群組，並為每個 Amazon Redshift 叢集節點新增一個輸出規則。針對**類別**，對連接埠 22 上的 TCP 通訊協定選取 SSH。針對**來源**，輸入您在 [步驟 3：擷取 Amazon Redshift 叢集公有金鑰和叢集節點 IP 地址](#load-from-emr-steps-retrieve-key-and-ips) 中擷取的 Amazon Redshift 叢集節點私有 IP 地址。如需將規則新增至 Amazon EC2 安全群組的相關資訊，請參閱《Amazon EC2 使用者指南》**中的[授權執行個體的傳入流量](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/authorizing-access-to-an-instance.html)。

## 步驟 6：執行 COPY 命令以載入資料
<a name="load-from-emr-steps-run-copy"></a>

執行 [COPY](r_COPY.md) 命令以連線至 Amazon EMR 叢集，並將資料載入至 Amazon Redshift 資料表。Amazon EMR 叢集必須繼續執行，直到 COPY 命令完成。例如，請勿將叢集設定為自動終止。

**重要**  
如果 COPY 完成之前有任何資料檔案變更或刪除，可能會發生非預期的結果，COPY 操作也可能失敗。

在 COPY 命令中，指定 Amazon EMR 叢集 ID 和 HDFS 檔案路徑和檔案名稱。

```
COPY sales
FROM 'emr://myemrclusterid/myoutput/part*' CREDENTIALS 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

您可以在檔案名稱引數中使用萬用字元星號 (`*`) 和問號 (`?`)。例如，`part*` 會載入檔案 `part-0000`、`part-0001`，以此類推。如果僅指定資料夾名稱，COPY 會嘗試載入該資料夾中的所有檔案。

**重要**  
如果使用萬用字元或只使用資料夾名稱，請確認不會載入不需要的檔案，否則 COPY 命令將會失敗。例如，某些程序可能將日誌檔案寫入至輸出資料夾。