從遠端主機載入資料 - Amazon Redshift

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

從遠端主機載入資料

您可以使用 COPY 命令從一或多台遠端主機平行載入資料,例如 Amazon EC2 執行個體或其他電腦。COPY 會使用 SSH 連接至遠端主機,然後在遠端主機執行命令來產生文字輸出。

遠端主機可以是 Amazon EC2 Linux 執行個體,或另一台設定為接受 SSH 連線的 Unix 或 Linux 電腦。本指南假設您的遠端主機為 Amazon EC2 執行個體。當其他電腦上的程序不同時,指南將指出差異。

Amazon Redshift 可以連線到多台主機,而且可以對每台主機開啟多個 SSH 連線。Amazon Redshift 會透過每個連線傳送一個唯一的命令,將文字輸出產生到主機的標準輸出,然後 Amazon Redshift 會像讀取文字檔一樣讀取該輸出。

開始之前

開始之前,您應該備妥下列各項:

  • 您可以使用 SSH 連線的一或多個主機,例如 Amazon EC2 執行個體。

  • 主機上的資料來源。

    您將提供 Amazon Redshift 叢集將在主機上執行以產生文字輸出的命令。叢集連線至主機之後,COPY 命令會執行這些命令,讀取來自主機標準輸出的文字,以及並行載入資料至 Amazon Redshift 資料表。文字輸出必須採用 COPY 命令可以擷取的格式。如需詳細資訊,請參閱 準備您的輸入資料

  • 從您的電腦存取主機。

    針對 Amazon EC2 執行個體,您將使用 SSH 連線來存取主機。您將需要存取主機以將 Amazon Redshift 叢集的公有金鑰新增至主機的授權金鑰檔案。

  • 執行中的 Amazon Redshift 叢集。

    如需如何啟動叢集的相關資訊,請參閱《Amazon Redshift 入門指南》https://docs.aws.amazon.com/redshift/latest/gsg/

載入資料程序

本節會逐步演練如何從從遠端主機載入資料的程序。下列小節提供每個步驟中必須完成的詳細資訊。

步驟 1:擷取叢集公有金鑰和叢集節點 IP 地址

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

使用主控台擷取您的叢集的叢集公有金鑰和叢集節點 IP 地址
  1. 存取 Amazon Redshift 管理主控台。

  2. 在導覽窗格中,選擇叢集連結。

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

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

    記下 Cluster Public Key (叢集公有金鑰)Node IP addresses (節點 IP 地址)。您將在稍後的步驟中用到它們。

    來自 SSH 擷取設定群組的螢幕擷取畫面,顯示叢集公有金鑰和節點 IP 地址。

    您將使用步驟 3 的 IP 地址來設定主機以接受來自 Amazon Redshift 的連線。取決於您連線的主機類型以及它是否位於 VPC,您將使用公有 IP 地址或私有 IP 地址。

若要使用 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 或《Amazon Redshift API 指南》中的 DescribeClusters

步驟 2:將 Amazon Redshift 叢集公有金鑰新增至主機的授權金鑰檔案

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

將 Amazon Redshift 叢集公有金鑰新增至主機的授權金鑰檔案
  1. 使用 SSH 連線存取主機。

    如需使用 SSH 連接至執行個體的詳細資訊,請參閱《Amazon EC2 使用者指南》中的連接至您的執行個體

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

  3. 將公有金鑰的內容複製和貼上至遠端主機上的 /home/<ssh_username>/.ssh/authorized_keys 檔案。<ssh_username> 必須符合資訊清單檔案中 "username" 欄位的值。包括完整字串,包括字首 "ssh-rsa" 和字尾 "Amazon-Redshift"。例如:

    ssh-rsa AAAACTP3isxgGzVWoIWpbVvRCOzYdVifMrh… uA70BnMHCaMiRdmvsDOedZDOedZ Amazon-Redshift

步驟 3:設定主機以接受所有 Amazon Redshift 叢集的 IP 地址

如果是使用 Amazon EC2 執行個體或 Amazon EMR 叢集,新增輸出規則至主機的安全群組可允許來自每個 Amazon Redshift 叢集節點的流量。針對類別,對連接埠 22 上的 TCP 通訊協定選取 SSH。針對來源,輸入您在 步驟 1:擷取叢集公有金鑰和叢集節點 IP 地址 中擷取的 Amazon Redshift 叢集節點 IP 地址。如需將規則新增至 Amazon EC2 安全群組的相關資訊,請參閱《Amazon EC2 使用者指南》中的授權執行個體的傳入流量

使用私有 IP 地址的時機:

  • 您的 Amazon Redshift 叢集不在虛擬私有雲端 (VPC) 中,而 Amazon EC2 -Classic 執行個體,兩者都位於相同 AWS 區域。

  • 您有一個位於 VPC 的 Amazon Redshift 叢集,以及一個 Amazon EC2 -VPC 執行個體,這兩個執行個體都位於相同的 AWS 區域和相同的 VPC 中。

否則,請使用公有 IP 地址。

如需在 VPC 中使用 Amazon Redshift 的相關資訊,請參閱《Amazon Redshift 管理指南》中的在虛擬私有雲端 (VPC) 中管理叢集

步驟 4:取得主機的公有金鑰

您可以選擇性地在資訊清單檔案中提供主機的公有金鑰,使得 Amazon Redshift 可以識別主機。COPY 命令不需要主機公有金鑰,但因為安全原因,我們強烈建議使用公有金鑰來幫助避免 'man-in--middle' 攻擊。

您可以在下列位置中尋找主機的公有金鑰,其中的 <ssh_host_rsa_key_name> 為主機公有金鑰的唯一名稱:

: /etc/ssh/<ssh_host_rsa_key_name>.pub
注意

Amazon Redshift 只支援 RSA 金鑰。我們不支援 DSA 索引鍵。

在步驟 5 建立您的資訊清單檔案時,您會將公有金鑰的文字貼上至資訊清單檔案項目中的「公有金鑰」資料欄。

步驟 5:建立資訊清單檔案

COPY 命令可以使用 SSH 來連接至多台主機,也可以對每台主機建立多個 SSH 連線。COPY 會透過每個主機連線執行命令,然後將命令的輸出平行載入資料表。資訊清單檔案是 JSON 格式的文字檔案,供 Amazon Redshift 用來連接至主機。資訊清單檔案指定 SSH 主機端點,以及在主機上執行以將資料傳回給 Amazon Redshift 的命令。您可以選擇在每個項目中包含主機公有金鑰、登入使用者名稱及 mandatory 旗標。

在本機電腦上建立資訊清單檔案。在稍後的步驟中,您會將檔案上傳到 Amazon S3。

資訊清單檔案的格式如下所示:

{ "entries": [ {"endpoint":"<ssh_endpoint_or_IP>", "command": "<remote_command>", "mandatory":true, "publickey": "<public_key>", "username": "<host_user_name>"}, {"endpoint":"<ssh_endpoint_or_IP>", "command": "<remote_command>", "mandatory":true, "publickey": "<public_key>", "username": "host_user_name"} ] }

資訊清單檔案會對每個 SSH 連線包含一個 "entries" 結構。每個項目代表單一 SSH 連線。您可以對單一主機建立多個連線,也可以對多台主機建立多個連線。如上所示,欄位名稱和值都需要雙引號。不需要雙引號的唯一值為強制欄位的布林值 truefalse

下列描述資訊清單檔案中的欄位。

端點

主機的 URL 地址或 IP 地址。例如,"ec2-111-222-333.compute-1.amazonaws.com" 或 "22.33.44.56"

command

主機將執行的命令,以產生文字或二進位 (gzip、lzop 或 bzip2) 輸出。命令可以是使用者 "host_user_name" 有許可執行的任何命令。命令可能只是列印檔案這麼簡單,也可能查詢資料庫或啟動指令碼。輸出 (文字檔案、gzip 二進位檔案、lzop 二進位檔案,或 bzip2 二進位檔案) 必須採用 Amazon Redshift COPY 命令可擷取的格式。如需詳細資訊,請參閱準備您的輸入資料

publickey

(選用) 主機的公有金鑰。如果提供公有金鑰,Amazon Redshift 會使用此金鑰來識別主機。如果未提供公有金鑰,Amazon Redshift 不會嘗試識別主機。例如,如果遠端主機的公有金鑰是:ssh-rsa AbcCbaxxx…xxxDHKJ root@amazon.com,請在公有金鑰欄位中輸入下列文字:AbcCbaxxx…xxxDHKJ

mandatory

(選用) 指出如果嘗試連線失敗,COPY 命令是否就應該失敗。預設值為 false。如果 Amazon Redshift 未成功建立至少一個連線,則 COPY 命令會失敗。

使用者名稱

(選用) 用來登入主機系統並執行遠端命令的使用者名稱。使用者登入名稱與步驟 2 中用來將公有金鑰新增至主機授權金鑰檔案的登入必須相同。預設的使用者名稱為 "redshift"。

下列範例顯示完整的清單檔案,可開啟對相同主機的四個連線,並透過每個連線執行不同的命令:

{ "entries": [ {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", "command": "cat loaddata1.txt", "mandatory":true, "publickey": "ec2publickeyportionoftheec2keypair", "username": "ec2-user"}, {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", "command": "cat loaddata2.txt", "mandatory":true, "publickey": "ec2publickeyportionoftheec2keypair", "username": "ec2-user"}, {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", "command": "cat loaddata3.txt", "mandatory":true, "publickey": "ec2publickeyportionoftheec2keypair", "username": "ec2-user"}, {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", "command": "cat loaddata4.txt", "mandatory":true, "publickey": "ec2publickeyportionoftheec2keypair", "username": "ec2-user"} ] }

步驟 6:上傳資訊清單檔案至 Amazon S3 儲存貯體

上傳資訊清單檔案至 Amazon S3 儲存貯體。如果 Amazon S3 儲存貯體與 Amazon Redshift 叢集不位於相同的 AWS 區域,您必須使用 REGION選項來指定資訊清單所在的 AWS 區域。如需有關建立 Amazon S3 儲存貯體及上傳檔案的詳細資訊,請參閱《Amazon Simple Storage Service 使用者指南》https://docs.aws.amazon.com/AmazonS3/latest/gsg/

步驟 7:執行 COPY 命令以載入資料

執行 COPY 命令以連線至主機,並將資料載入至 Amazon Redshift 資料表。在 COPY 命令中,指定資訊清單檔案的明確 Amazon S3 物件路徑,並包括 SSH 選項。例如

COPY sales FROM 's3://amzn-s3-demo-bucket/ssh_manifest' IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' DELIMITER '|' SSH;
注意

如果您使用自動壓縮,COPY 命令會執行兩次資料讀取,也就是會執行遠端命令兩次。第一次讀取會提供樣本進行壓縮分析,第二次讀取就實際載入資料。如果執行遠端命令兩次可能因為潛在的副作用造成問題,您應該關閉自動壓縮。若要關閉自動壓縮,請在執行 COPY 命令時將 COMPUPDATE 選項設為 OFF。如需詳細資訊,請參閱利用自動壓縮載入資料表