本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
從遠端主機載入資料
您可以使用 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/。
載入資料程序
本節會逐步演練如何從從遠端主機載入資料的程序。下列小節提供每個步驟中必須完成的詳細資訊。
-
公有金鑰可讓 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擷取設定群組。
記下 Cluster Public Key (叢集公有金鑰) 和 Node IP addresses (節點 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 叢集公有金鑰新增至主機的授權金鑰檔案
-
使用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 上的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連線。您可以對單一主機建立多個連線,也可以對多台主機建立多個連線。如上所示,欄位名稱和值都需要雙引號。不需要雙引號的唯一值為強制欄位的布林值 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命令會執行兩次資料讀取,這表示它會執行遠端命令兩次。第一次讀取會提供樣本進行壓縮分析,第二次讀取就實際載入資料。如果執行遠端命令兩次可能因為潛在的副作用造成問題,您應該關閉自動壓縮。若要關閉自動壓縮,請使用 COMPUPDATE選項設定為 來執行 COPY命令OFF。如需詳細資訊,請參閱利用自動壓縮載入資料表。