如何在scala/spark中将文件从hadoop(hdfs)复制到远程sftp服务器?

gblwokeq  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(754)

在的文件系统中 Hadoop 我有 Excel 文件。
我有任务要从中复制那个文件 Hadoop 到远程 SFTP 我的服务器 Scala/Spark 应用程序。
我已经形成了这样的看法:直接说是行不通的。如果我的担心是正确的,我需要采取下一步行动:
1) 将excel文件从hadoop删除到本地目录。例如,我可以使用scala dsl:

import scala.sys.process._
s"hdfs dfs -copyToLocal /hadoop_path/file_name.xlsx /local_path/" !

2) 从本地目录将文件发送到远程sftp服务器。你可以为这个任务推荐什么样的库?
我的推理正确吗?解决我的问题最好的方法是什么?

cwtwac6a

cwtwac6a1#

我终于找到了解决问题的方法。我决定使用jsch库。
内部版本.sbt:

libraryDependencies += "com.jcraft" % "jsch" % "0.1.55"

斯卡拉先生:

import scala.sys.process._
import com.jcraft.jsch._

// Copy Excel file from Hadoop file system to local directory with Scala DSL.
s"hdfs dfs -copyToLocal /hadoop_path/excel.xlsx /local_path/" !

val jsch = new JSch()
val session = jsch.getSession("XXX", "XXX.XXX.XXX.XXX") // Set your username and host
session.setPassword("XXX") // Set your password
val config = new java.util.Properties()
config.put("StrictHostKeyChecking", "no")
session.setConfig(config)
session.connect()

val channelSftp = session.openChannel("sftp").asInstanceOf[ChannelSftp]
channelSftp.connect()
channelSftp.put("excel.xlsx", "sftp_path/") // set your path in remote sftp server
channelSftp.disconnect()

session.disconnect()
3pmvbmvn

3pmvbmvn2#

正如评论中提到的,sparksftp是一个不错的选择
如果没有,您可以尝试以下来自apachecommons ftp库的示例代码。。将列出所有远程文件。。同样,您也可以删除这些文件。。未经测试请试用。
选项1:

import java.io.IOException

import org.apache.commons.net.ftp.FTPClient

//remove if not needed
import scala.collection.JavaConversions._

object MyFTPClass {

  def main(args: Array[String]): Unit = {
// Create an instance of FTPClient
    val ftp: FTPClient = new FTPClient()
    try {
// Establish a connection with the FTP URL
      ftp.connect("ftp.test.com")
// Enter user details : user name and password
      val isSuccess: Boolean = ftp.login("user", "password")
      if (isSuccess) {
// empty array is returned
        val filesFTP: Array[String] = ftp.listNames()
        var count: Int = 1
// Iterate on the returned list to obtain name of each file
        for (file <- filesFTP) {
          println("File " + count + " :" + file) { count += 1; count - 1 }
        }
      }
// Fetch the list of names of the files. In case of no files an
// Fetch the list of names of the files. In case of no files an
      ftp.logout()
    } catch {
      case e: IOException => e.printStackTrace()

    } finally try ftp.disconnect()
    catch {
      case e: IOException => e.printStackTrace()

    }
  }

}

选项2:有一个叫做jsch库的东西,您可以从中看到这个问题和示例片段

相关问题