從 HDFS 轉移至 Cloud Storage

Storage 移轉服務支援從雲端和地端部署 Hadoop 分散式檔案系統 (HDFS) 來源轉移資料。

從 HDFS 轉移資料時,必須使用 Cloud Storage 做為目的地。

用途包括從內部部署儲存空間遷移至 Cloud Storage、封存資料以釋出內部部署儲存空間、將資料複製到 Google Cloud 以確保業務持續運作,或是將資料傳輸至 Google Cloud 進行分析和處理。

設定權限

建立轉移作業前,您必須為下列實體設定權限:

用於建立轉移作業的使用者帳戶。這是登入 Google Cloud 控制台的帳戶,或是驗證 `gcloud` CLI 時指定的帳戶。使用者帳戶可以是一般使用者帳戶,也可以是使用者管理的服務帳戶。
Storage 移轉服務使用的Google 代管服務帳戶 (又稱服務代理程式)。這個帳戶通常會以電子郵件地址識別,格式為 project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com
轉移代理程式帳戶:為轉移代理程式提供 Google Cloud 權限。移轉代理程式帳戶會使用安裝代理程式的使用者憑證,或使用者代管服務帳戶的憑證進行驗證。

如需操作說明,請參閱「以代理程式為準的轉移權限」。

將代理程式安裝到代理程式集區

代理式移轉作業會使用軟體代理程式來協調移轉作業。這些代理程式必須安裝在一或多部可存取檔案系統的機器上。代理程式必須有權存取 namenode、所有 datanode、Hadoop 金鑰管理伺服器 (KMS) 和 Kerberos 金鑰發布中心 (KDC)。

轉移代理程式會在代理程式集區中協同運作。增加代理程式數量可提升整體工作效能,但這取決於多項因素。

  • 新增更多代理程式有助於解決問題,最多可新增至 HDFS 叢集中節點數的一半。舉例來說,如果叢集有 30 個節點,將代理程式從 5 個增加到 15 個應可提升效能,但超過 15 個可能就沒有太大差異。

  • 如果是小型 HDFS 叢集,一個代理程式就已足夠。

  • 如果轉移作業包含大量小型檔案,額外代理程式對效能的影響通常會更大。Storage 移轉服務會在多個代理程式之間平行處理移轉工作,藉此提高輸送量。工作負載中的檔案越多,新增更多代理程式的好處就越多。

請勿在代理程式集區名稱或代理程式 ID 前置字元中,加入個人識別資訊 (PII) 或安全性資料等私密資訊。資源名稱可能會傳播至其他 Google Cloud 資源的名稱,並可能向專案外部的 Google 內部系統公開。

建立代理程式集區

建立代理程式集區。請使用使用者帳戶執行這項操作。使用者帳戶符號

安裝代理程式

將代理程式安裝到代理程式集區。請使用轉移代理商帳戶執行這項操作。

Google Cloud 控制台

  1. 前往 Google Cloud 控制台的「Agent pools」頁面。

    前往代理程式集區

  2. 選取要新增代理程式的代理程式集區。

  3. 按一下「安裝代理程式」

  4. 按照操作說明安裝及執行代理程式。

    如要進一步瞭解代理程式的指令列選項,請參閱「代理程式指令列選項」。

gcloud CLI

如要使用 gcloud CLI 安裝一或多個代理程式,請執行 gcloud transfer agents install

gcloud transfer agents install --pool=POOL_NAME \
  --count=NUM_AGENTS \
  --mount-directories=MOUNT_DIRECTORIES \
  --hdfs-namenode-uri=HDFS_NAMENODE_URI \
  --hdfs-username=HDFS_USERNAME \
  --hdfs-data-transfer-protection=HDFS_DATA_TRANSFER_PROTECTION \
  --kerberos-config-file=KERBEROS_CONFIG_FILE \
  --kerberos-keytab-file=KERBEROS_KEYTAB_FILE \
  --kerberos-user-principal=KERBEROS_USER_PRINCIPAL \
  --kerberos-service-principal=KERBEROS_SERVICE_PRINCIPAL \

其中:

  • --hdfs-namenode-uri 以 URI 格式指定 HDFS 叢集,包括結構定義、namenode 和通訊埠。例如:

    • rpc://my-namenode:8020
    • http://my-namenode:9870

    WebHDFS 使用 HTTP 或 HTTPS。如未提供結構定義,我們會假設為 RPC。如果未提供通訊埠,RPC 的預設通訊埠為 8020,HTTP 為 9870,HTTPS 則為 9871。舉例來說,輸入 my-namenode 會變成 rpc://my-namenode:8020

    如果叢集設定了多個 namenode,請指定目前的 primary 節點。詳情請參閱具有多個 namenode 的叢集

  • --hdfs-username 是用於透過簡單驗證連線至 HDFS 叢集的使用者名稱。如果您使用 Kerberos 進行驗證,或連線時不進行任何驗證,請省略這個標記。

  • --hdfs-data-transfer-protection (選用) 是 Kerberos 叢集的用戶端保護品質 (QOP) 設定。這個值不得比伺服器端 QOP 值更嚴格。有效值為:authenticationintegrityprivacy

如果使用 Kerberos 驗證,請一併加入下列旗標:

  • --kerberos-config-file 是 Kerberos 設定檔的路徑。例如:--kerberos-config-file=/etc/krb5.conf

  • --kerberos-user-principal 是要使用的 Kerberos 使用者主體。例如:--kerberos-user-principal=user1

  • --kerberos-keytab-file 是 Keytab 檔案的路徑,內含以 --kerberos-user-principal 標記指定的使用者主體。例如:--kerberos-keytab-file=/home/me/kerberos/user1.keytab

  • --kerberos-service-principal 是要使用的 Kerberos 服務主體,格式為 <primary>/<instance>。系統會從 Kerberos 設定檔對應領域,並忽略任何提供的領域。如未指定此旗標,預設值為 hdfs/<namenode_fqdn>,其中 <namenode_fqdn> 是設定檔中指定的完整網域名稱。

    例如:--kerberos-service-principal=hdfs/my-namenode.a.example.com

這項工具會引導您完成安裝代理程式的所有必要步驟。這項指令會在電腦上安裝 NUM_AGENTS 代理程式,對應至指定為 POOL_NAME 的集區名稱,並使用 gcloud 憑證驗證代理程式。集區名稱必須存在,否則系統會傳回錯誤。

--mount-directories 標記為選用項目,但強烈建議使用。這個值是檔案系統上要授予代理存取權的目錄清單,並以半形逗號分隔各個值。如果省略這個標記,系統會將整個檔案系統掛接至代理程式容器。詳情請參閱 gcloud 參考資料

docker run

使用 docker run 安裝代理程式之前,請先按照操作說明安裝 Docker

docker run 指令會安裝一個代理程式。如要增加集區中的代理程式數量,請視需要多次重新執行這項指令。

必要指令旗標取決於您使用的驗證類型。

Kerberos

如要使用 Kerberos 驗證檔案系統,請使用下列指令:

sudo docker run -d --ulimit memlock=64000000 --rm \
  --network=host \
  -v /:/transfer_root \
  gcr.io/cloud-ingest/tsop-agent:latest \
  --enable-mount-directory \
  --project-id=${PROJECT_ID} \
  --hostname=$(hostname) \
  --creds-file="service_account.json" \
  --agent-pool=${AGENT_POOL_NAME} \
  --hdfs-namenode-uri=cluster-namenode \
  --kerberos-config-file=/etc/krb5.conf \
  --kerberos-user-principal=user \
  --kerberos-keytab-file=/path/to/folder.keytab

其中:

  • 如果要在這部電腦上執行多個代理程式,請省略 --network=host
  • --hdfs-namenode-uri:URI 格式的結構定義、namenode 和通訊埠,代表 HDFS 叢集。例如:

    • rpc://my-namenode:8020
    • http://my-namenode:9870

WebHDFS 使用 HTTP 或 HTTPS。如未提供結構定義,我們會假設為 RPC。如果未提供通訊埠,RPC 的預設通訊埠為 8020,HTTP 為 9870,HTTPS 則為 9871。舉例來說,輸入 my-namenode 會變成 rpc://my-namenode:8020

如果叢集設定了多個 namenode,請指定目前的 primary 節點。詳情請參閱具有多個 namenode 的叢集

  • --kerberos-config-file:Kerberos 設定檔的路徑。預設值為 /etc/krb5.conf
  • --kerberos-user-principal:Kerberos 使用者主體。
  • --kerberos-keytab-file:Keytab 檔案的路徑,內含以 --kerberos-user-principal 指定的使用者主體。
  • --kerberos-service-principal:要使用的 Kerberos 服務主體,格式為「service/instance」。領域會從 Kerberos 設定檔對應,系統會忽略任何提供的領域。如未指定此標記,預設值為 hdfs/<namenode_fqdn>,其中 fqdn 是完整網域名稱。

簡易驗證

如要使用簡單驗證機制向檔案系統進行驗證,請按照下列步驟操作:

sudo docker run -d --ulimit memlock=64000000 --rm \
  --network=host \
  -v /:/transfer_root \
  gcr.io/cloud-ingest/tsop-agent:latest \
  --enable-mount-directory \
  --project-id=${PROJECT_ID} \
  --hostname=$(hostname) \
  --creds-file="${CREDS_FILE}" \
  --agent-pool="${AGENT_POOL_NAME}" \
  --hdfs-namenode-uri=cluster-namenode \
  --hdfs-username="${USERNAME}"

其中:

  • --hdfs-username:使用簡易驗證連線至 HDFS 叢集時要使用的使用者名稱。
  • --hdfs-namenode-uri:URI 格式的結構定義、namenode 和通訊埠,代表 HDFS 叢集。例如:
    • rpc://my-namenode:8020
    • http://my-namenode:9870

WebHDFS 使用 HTTP 或 HTTPS。如未提供結構定義,我們會假設為 RPC。 如未提供通訊埠,RPC 的預設值為 8020,HTTP 為 9870,HTTPS 則為 9871。舉例來說,輸入 my-namenode 會變成 rpc://my-namenode:8020

如果叢集設定了多個 namenode,請指定目前的 primary 節點。詳情請參閱具有多個 namenode 的叢集

無驗證

如要連線至檔案系統,且不需進行任何驗證,請按照下列步驟操作:

sudo docker run -d --ulimit memlock=64000000 --rm \
  --network=host \
  -v /:/transfer_root \
  gcr.io/cloud-ingest/tsop-agent:latest \
  --enable-mount-directory \
  --project-id=${PROJECT_ID} \
  --hostname=$(hostname) \
  --creds-file="${CREDS_FILE}" \
  --agent-pool="${AGENT_POOL_NAME}" \
  --hdfs-namenode-uri=cluster-namenode \

其中:

  • --hdfs-namenode-uri:URI 格式的結構定義、namenode 和通訊埠,代表 HDFS 叢集。例如:
    • rpc://my-namenode:8020
    • http://my-namenode:9870

WebHDFS 使用 HTTP 或 HTTPS。如未提供結構定義,我們會假設為 RPC。 如未提供通訊埠,RPC 的預設值為 8020,HTTP 為 9870,HTTPS 則為 9871。舉例來說,輸入 my-namenode 會變成 rpc://my-namenode:8020

如果叢集設定了多個 namenode,請指定目前的 primary 節點。詳情請參閱具有多個名稱節點的叢集

轉移作業選項

從 HDFS 移轉至 Cloud Storage 時,可使用下列 Storage 移轉服務功能。

從 HDFS 移轉的檔案不會保留中繼資料

建立移轉作業

請勿在轉移作業名稱中加入個人識別資訊 (PII) 或安全性資料等私密資訊。資源名稱可能會傳播至其他 Google Cloud 資源的名稱,並可能向專案外部的 Google 內部系統公開。

Storage 移轉服務提供多種介面,可供您建立移轉作業。

Google Cloud 控制台

  1. 前往 Google Cloud 控制台的「Storage Transfer Service」頁面。

    前往 Storage 移轉服務

  2. 按一下「建立移轉工作」。系統隨即會顯示「建立移轉工作」頁面。

  3. 選取「Hadoop 分散式檔案系統」做為「來源類型」。目的地必須是 Google Cloud Storage

    點選「下一步」

設定來源

  1. 指定這項轉移作業的必要資訊:

    1. 選取您為這項轉移作業設定的代理程式集區

    2. 輸入要轉移的路徑 (相對於根目錄)。

  2. 視需要指定要套用至來源資料的篩選器

  3. 點選「下一步」

設定接收器

  1. 在「Bucket or folder」(值區或資料夾) 欄位中,輸入目的地值區和 (選用) 資料夾名稱,或按一下「Browse」(瀏覽),從目前專案的現有值區清單中選取值區。如要建立新值區,請按一下 值區圖示 「建立新值區」

  2. 點選「下一步」

排定轉移時間

您可以安排轉移作業只執行一次,也可以設定週期性轉移作業。

點選「下一步」

選擇轉移設定

  1. 在「Description」(說明) 欄位中,輸入轉移作業的說明。最佳做法是輸入有意義且獨特的說明,方便您區分工作。

  2. 在「中繼資料選項」下方,選取 Cloud Storage 儲存空間類別,以及是否要儲存每個物件的建立時間。詳情請參閱「保留中繼資料」。

  3. 在「何時覆寫」下方,選取下列其中一個選項:

    • 永不:不要覆寫目的地檔案。如果已有同名檔案,系統就不會轉移。

    • 如果不同:如果名稱相同的來源檔案具有不同的 ETag 或總和檢查碼值,則覆寫目的地檔案。

    • 一律覆寫:來源檔案與目的地檔案的名稱相同時,一律覆寫目的地檔案 (即便檔案內容完全相同)。

  4. 在「何時刪除」下方,選取下列其中一個選項:

    • 永不:永不刪除來源或目的地的檔案。

    • 如果檔案未同時存在於來源,則將檔案從目的地中刪除:如果目的地 Cloud Storage bucket 中的檔案未同時存在於來源,則將檔案從 Cloud Storage bucket 中刪除。

      這個選項可確保目的地 Cloud Storage bucket 與來源完全相符。

  5. 選取是否啟用移轉記錄和/或 Pub/Sub 通知

按一下「建立」即可建立轉移工作。

gcloud CLI

如要建立新的移轉工作,請使用 gcloud transfer jobs create 指令。建立新工作會啟動指定的轉移作業,除非指定排程或 --do-not-run

gcloud transfer jobs create \
  hdfs:///PATH/ gs://BUCKET_NAME/PATH/
  --source-agent-pool=AGENT_POOL_NAME

其中:

  • PATH 是 HDFS 叢集根目錄的絕對路徑。叢集 namenode 和連接埠是在代理程式層級設定,因此工作建立指令只需要指定 (選用) 路徑和代理程式集區。

  • --source-agent-pool 會指定這項轉移作業要使用的來源代理程式集區。

其他選項包括:

  • --do-not-run 可防止 Storage 移轉服務在提交指令後執行作業。如要執行工作,請更新工作以新增排程,或使用 jobs run手動啟動工作。

  • --manifest-file 指定 Cloud Storage 中 CSV 檔案的路徑,其中包含要從來源轉移的檔案清單。如需資訊清單檔案格式,請參閱「使用資訊清單轉移特定檔案或物件」。

  • 工作資訊:您可以指定 --name--description

  • 時間表:指定 --schedule-starts--schedule-repeats-every--schedule-repeats-until,或 --do-not-run

  • 物件條件:使用條件判斷要轉移哪些物件。包括 --include-prefixes--exclude-prefixes,以及 --include-modified-[before | after]-[absolute | relative] 中的時間條件。如果您指定來源資料夾,前置字串篩選器會與該資料夾相關。詳情請參閱「依前置字串篩選來源物件」一文。

  • 轉移選項:指定是否要覆寫目的地檔案 (--overwrite-when=differentalways),以及是否要在轉移期間或之後刪除特定檔案 (--delete-from=destination-if-uniquesource-after-transfer);並視需要為轉移的物件設定儲存空間類別 (--custom-storage-class)。

  • 通知:使用 --notification-pubsub-topic--notification-event-types--notification-payload-format 設定轉移作業的 Pub/Sub 通知

如要查看所有選項,請執行 gcloud transfer jobs create --help 或參閱gcloud參考說明文件

REST API

如要使用 REST API 從 HDFS 來源建立轉移作業,請建立類似下列範例的 JSON 物件。

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
  ...
  "transferSpec": {
    "source_agent_pool_name":"POOL_NAME",
    "hdfsDataSource": {
      "path": "/mount"
    },
    "gcsDataSink": {
      "bucketName": "SINK_NAME"
    },
    "transferOptions": {
      "deleteObjectsFromSourceAfterTransfer": false
    }
  }
}

如要進一步瞭解其他支援的欄位,請參閱 transferJobs.create 參考資料。

具有多個 namenode 的叢集

儲存空間移轉服務代理程式只能設定單一 namenode。如果 HDFS 叢集設定了多個 namenode (「高可用性」),且發生容錯移轉事件導致新的主要 namenode,您必須使用正確的 namenode 重新安裝代理程式。

如要刪除舊代理程式,請參閱「刪除代理程式」。

執行下列指令,即可擷取叢集的有效名稱節點:

hdfs haadmin -getAllServiceState