本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
從遠端主機載入資料
您可以使用 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/。
載入資料程序
本節會逐步演練如何從從遠端主機載入資料的程序。下列小節提供每個步驟中必須完成的詳細資訊。
-
公有金鑰可讓 Amazon Redshift 叢集節點與遠端主機建立 SSH 連線。您將使用每個叢集節點的 IP 地址來設定主機安全群組或防火牆,以允許使用這些 IP 地址從您的 Amazon Redshift 叢集存取。
-
步驟 2:將 Amazon Redshift 叢集公有金鑰新增至主機的授權金鑰檔案
您可以將 Amazon Redshift 叢集公有金鑰新增至主機的授權金鑰檔案,以便主機識別 Amazon Redshift 叢集並接受 SSH 連線。
-
步驟 3:設定主機以接受所有 Amazon Redshift 叢集的 IP 地址
針對 Amazon EC2,請修改執行個體的安全群組,以新增傳入規則來接受 Amazon Redshift IP 地址。針對其他主機,修改防火牆使得您的 Amazon Redshift 節點可以與遠端主機建立 SSH 連線。
-
您可以選擇性地指定 Amazon Redshift 應該使用公有金鑰來識別主機。您必須找到公有金鑰,並將文字複製到您的資訊清單檔案。
-
清單檔案是 JSON 格式的文字檔案,具有 Amazon Redshift 連線至主機和擷取資料所需的詳細資訊。
-
Amazon Redshift 會讀取清單檔案,並使用該資訊來連線至遠端主機。如果 Amazon S3 儲存貯體不是位於與 Amazon Redshift 叢集所在的同一區域,您必須使用 REGION 選項來指定資料所在的區域。
-
從 Amazon Redshift 資料庫,執行 COPY 命令以將資料載入至 Amazon Redshift 資料表。
步驟 1:擷取叢集公有金鑰和叢集節點 IP 地址
您將使用每個叢集節點的 IP 地址來設定主機安全群組,以允許使用這些 IP 地址從您的 Amazon Redshift 叢集存取。
使用主控台擷取您的叢集的叢集公有金鑰和叢集節點 IP 地址
-
存取 Amazon Redshift 管理主控台。
-
在導覽窗格中,選擇叢集連結。
-
從清單選取您的叢集。
-
找到 SSH Ingestion Settings (SSH 擷取設定) 群組。
記下 Cluster Public Key (叢集公有金鑰) 和 Node IP addresses (節點 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 叢集公有金鑰新增至主機的授權金鑰檔案
-
使用 SSH 連線存取主機。
如需使用 SSH 連接至執行個體的詳細資訊,請參閱《Amazon EC2 使用者指南》中的連接至您的執行個體。
-
從主控台或從 CLI 回應文字複製 Amazon Redshift 公有金鑰。
-
將公有金鑰的內容複製和貼上至遠端主機上的
/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 連線。您可以對單一主機建立多個連線,也可以對多台主機建立多個連線。如上所示,欄位名稱和值都需要雙引號。不需要雙引號的唯一值為強制欄位的布林值 true
或 false
。
下列描述資訊清單檔案中的欄位。
- 端點
-
主機的 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。如需詳細資訊,請參閱利用自動壓縮載入資料表。