我正在嘗試將目錄中的所有 part* 檔案直接從 HDFS 目錄傳輸到 sftp 服務器。hdfs 檔案夾中的所有檔案都非常大,所以我不想將它們復制到本地檔案系統。
目前的設定是
hdfs dfs -text "<HDFS_DIR>/part*" > localfile
curl "<sftp_username>:" --key "<private_key_file_path>" --pubkey "<public_key_file_path>" \
--upload-file local_file "sftp://<SFTP_HOST>/<Upload_dir>"
如何將檔案直接從 HDFS 上傳到 sftp 服務器路徑而不將檔案寫入本地檔案系統。
我考慮了以下選項
- 用 sftp 挖(沒有找到足夠的資源) - https://sqoop.apache.org/docs/1.99.7/user/connectors/Connector-SFTP.html
- 將每個
part檔案復制到本地 fs 并移動到 sftp 服務器(效率低下) - 帶有 sftp 的 hadoop distcp 在 cdh5 中不起作用。我在用
CDH-5.16.2
請讓我知道這是實作此目的的最佳方法。謝謝!
uj5u.com熱心網友回復:
也許您可以通過使用--upload-file . 或--upload-file -,例如,將 hdfs 的輸出通過管道直接傳送到 curl 進行上傳
hdfs dfs -text "<HDFS_DIR>/part*" | curl "<sftp_username>:" --key "<private_key_file_path>" --pubkey "<public_key_file_path>"
--upload-file 。"sftp://<SFTP_HOST>/<Upload_dir>"
關于.和-檔案之間的區別說
使用檔案名“-”(單破折號)來使用 stdin 而不是給定的檔案。或者,檔案名“.” (單個句點)可以指定而不是“-”以在非阻塞模式下使用 stdin 以允許在上傳 stdin 時讀取服務器輸出。
在我看來,在開始上傳之前,curl 可能會嘗試將整個檔案放入 ram 中,或者至少放入 stdin 緩沖區中,因此.聽起來比-處理大檔案更安全。
uj5u.com熱心網友回復:
你可能可以這樣做。
hdfs dfs -cat <HDFS_DIR>/part* | ssh <sftp_username>:<sftp_hostname> 'cat - > <Upload_dir>/<file_name>'
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/371899.html
