Как загрузить файл из EFS (WinSCP) в WebHDFS (Hue / Cloudera) в PowerShell?

Я пытался разбить эту проблему на две части, чтобы автоматизировать это:

  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(), но безуспешно ...


person Petter_M    schedule 11.02.2021    source источник


Ответы (1)


Если 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.

person Martin Prikryl    schedule 24.02.2021