如何在 PowerShell 中将文件从 EFS (WinSCP) 上传到 WebHDFS (Hue/Cloudera)?

问题描述

我一直试图将这个问题分解为两个部分,以实现自动化:

  1. PowerShell:将文件从本地桌面传输到 EFS(通过 WinSCP) - 好的
  2. PowerShell:在 EFS 上获取相同的文件(通过 WinSCP)并将其放入 Cloudera WebHDFS(我们使用 Hue 接口)- NOK

在部分 (1) 中,我创建了以下代码

# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"

# Set up session options
$sessionoptions = New-Object WinSCP.Sessionoptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = "peanut-edgenode1.dundlermufflin.com"
    UserName = "JoeStreet"
    Password = "dundlermufflin123"
    SshHostKeyFingerprint = "ssh-ed28549 255 HJGF564hjfq8if1Y8KYALtf6zEv+z3o="
}

$sessionoptions.AddRawSettings("Cipher","aes,chacha20,3des,WARN,des,blowfish,arcfour")
$sessionoptions.AddRawSettings("ProxyHost","web.isa.la.proxy.dundlermufflin.com")
$sessionoptions.AddRawSettings("ProxyPort","4200")
$sessionoptions.AddRawSettings("ProxyUsername","na%5CJoeStreet")
$sessionoptions.AddRawSettings("ProxyPassword","dundlermufflin123")

$session = New-Object WinSCP.Session

try
{
    # Connect
    $session.Open($sessionoptions)

    # Your code
    $session.PutFiles("C:\Users\JoeStreet\Documents\report-2021-02-02_no_locations.xlsx","/efs/home/JoeStreet/report-2021-02-02_no_locations.xlsx").Check()
}
finally
{
    $session.dispose()
}

但是...如果我想从 EFS (WinSCP) 转移到 Cloudera WebHDFS,通过 PuTTY 我们登录peanut-edgenode1.dundlermufflin.com 并执行以下操作:[上面的部分 (2) ]

hdfs dfs -put -f /efs/home/JoeStreet/report-2021-02-02_no_locations.xlsx /prd/product/ssa_stg/JoeStreet/

一切顺利。

但是我如何在 PowerShell 中插入该命令?

我尝试以不同的方式放入 $session.PutFiles(origin,destiny).Check() 但没有成功...

解决方法

如果 EFS 具有类似 Linux 的外壳,您可以使用 Session.ExecuteCommand

$session.ExecuteCommand("hdfs dfs -put -f /efs/home/JoeStreet/report-2021-02-02_no_locations.xlsx /prd/product/ssa_stg/JoeStreet/")

如果服务器的内容更非标准,您可能需要使用适当的 SSH(而非 SFTP)库,例如 SSH.NET 或 Posh-SSH。