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

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

從遠端主機載入資料

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

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

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

開始之前

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

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

  • 主機上的資料來源。

    您將提供 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擷取設定群組。

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

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

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

若要使用 Amazon Redshift 擷取叢集的叢集公有金鑰和叢集節點 IP 地址CLI,請執行 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 擷取叢集的叢集公有金鑰和叢集節點 IP 地址API,請使用 DescribeClusters 動作。如需詳細資訊,請參閱 Amazon Redshift CLI指南或 Amazon Redshift API指南DescribeClusters中的 describe-cluster

步驟 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 上的SSHTCP通訊協定選取 。針對來源,輸入您在 步驟 1:擷取叢集公有金鑰和叢集節點 IP 地址 中擷取的 Amazon Redshift 叢集節點 IP 地址。如需將規則新增至 Amazon EC2安全群組的資訊,請參閱 Amazon EC2使用者指南 中的授權執行個體的傳入流量

使用私有 IP 地址的時機:

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

  • 您有位於 的 Amazon Redshift 叢集VPC,以及位於相同 AWS 區域的 Amazon EC2 VPC執行個體VPC。

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

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

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

您可以選擇性地在資訊清單檔案中提供主機的公有金鑰,使得 Amazon Redshift 可以識別主機。COPY 命令不需要主機公有金鑰,但基於安全考量,強烈建議使用公有金鑰來協助防止 'man-in-the-middle' 攻擊。

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

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

Amazon Redshift 僅支援RSA金鑰。我們不支援DSA金鑰。

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

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

COPY 命令可以使用 連線至多個主機SSH,並可以建立與每個主機的多個SSH連線。COPY 會透過每個主機連線執行命令,然後將命令的輸出平行載入資料表。資訊清單檔案是 Amazon Redshift 用來連線至主機JSON的文字檔案。資訊清單檔案會指定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連線的一個「輸入」建構。每個項目代表單一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命令會執行兩次資料讀取,這表示它會執行遠端命令兩次。第一次讀取會提供樣本進行壓縮分析,第二次讀取就實際載入資料。如果執行遠端命令兩次可能因為潛在的副作用造成問題,您應該關閉自動壓縮。若要關閉自動壓縮,請使用 COMPUPDATE選項設定為 來執行 COPY命令OFF。如需詳細資訊,請參閱利用自動壓縮載入資料表