Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 从spark server执行SFTP时在大型机服务器上执行记录级数据截断_Scala_Apache Spark_Sftp_Jsch_Mainframe - Fatal编程技术网

Scala 从spark server执行SFTP时在大型机服务器上执行记录级数据截断

Scala 从spark server执行SFTP时在大型机服务器上执行记录级数据截断,scala,apache-spark,sftp,jsch,mainframe,Scala,Apache Spark,Sftp,Jsch,Mainframe,请仔细阅读 我正在通过SFTP将scala中开发的spark应用程序中的csv文件发送到大型机服务器。我正在使用jsch(java安全通道)包版本0.1.53来完成从spark服务器到大型机服务器的SFTP连接。我面临的问题是,在大型机服务器上,csv文件被截断为每个记录行1024字节。 经过研究,我发现在大型机上,我们可以选择使用“lrecl”和“recfm”来控制文件中每条记录的长度和记录的格式。但我无法在scala上集成这些选项。我在stackoverflow上找到了答案,这是为了在Jav

请仔细阅读

我正在通过SFTP将scala中开发的spark应用程序中的csv文件发送到大型机服务器。我正在使用jsch(java安全通道)包版本0.1.53来完成从spark服务器到大型机服务器的SFTP连接。我面临的问题是,在大型机服务器上,csv文件被截断为每个记录行1024字节。

经过研究,我发现在大型机上,我们可以选择使用“lrecl”和“recfm”来控制文件中每条记录的长度和记录的格式。但我无法在scala上集成这些选项。我在stackoverflow上找到了答案,这是为了在Java中实现。当我在scala上使用相同的逻辑时,我得到以下错误:

EDC5129I No such file or directory., file: /+recfm=fb,lrecl=3000 at
    at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846)
    at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:2198)
    at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:2215)
    at com.jcraft.jsch.ChannelSftp.ls(ChannelSftp.java:1565)
    at com.jcraft.jsch.ChannelSftp.ls(ChannelSftp.java:1526)
使用jsch库建立SFTP连接和传输文件的Scala代码块如下:

session = jsch.getSession(username, host, port)
session.setConfig("PreferredAuthentication","publickey")
session.setConfig("MaxAuthTries",2)
System.out.println("Created SFTP Session")

val sftpSessionConfig: Properties = new Properties()
sftpSessionConfig.put("StrictHostKeyChecking","no")
session.setConfig(sftpSessionConfig)
session.connect() //Connect to session
System.out.println("Connected to SFTP Session")
      
val channel = session.openChannel("sftp")
channel.connect()
val sftpChannel = channel.asInstanceOf[ChannelSftp]
sftpChannel.ls("/+recfm=fb,lrecl=3000") //set lrecl and recfm ---> THROWING ERROR HERE

sftpChannel.put(sourceFile, destinationPath,ChannelSftp.APPEND) //Push file from local to mainframe
有没有办法使用jsch库将这些选项设置为scala代码中的配置?我还尝试使用SpringML的SparkSFTP包。但是这个包在大型机服务器上也有数据截断的问题

请帮助,因为这个问题已经成为我的项目非常关键的障碍

编辑:使用scala代码块更新了幻灯片21中演示文稿中的问题:

ls /+recfm=fb,lrecl=80
在我看来,您的代码中有一个“/”太多了

从错误消息中,我认为SFTP服务器在UNIX文件系统中具有当前路径。您没有为数据集设置数据集高级限定符(HLQ),是吗?我在代码中看不到它。同样,从上述演示中,在
ls
之前制作一张
cd

cd //your-hlq-of-choice
这将做两件事:

  • 将当前工作目录更改为MVS数据集端
  • 设置要使用的HLQ

  • 对不起,我不能测试自己;我不知道scala。

    首先,z/OS上运行的是什么SFTP服务器?如果是z/OS(非燕尾型)提供的命令,则您正在执行的命令不受支持,您将收到一条消息,如
    无法找到ls:“/+recfm=fb,lrecl=80”
    。这将是有效的,因为该文件无效。
    /
    右侧的所有内容都将被视为文件名的一部分

    我将您的代码转换为Java,因为我不熟悉Scala,没有时间学习它。这是我使用的代码示例

    import com.jcraft.jsch.JSch;
    import java.util.Properties;
    import java.util.Vector;
    
    class sftptest {
      static public void main(String[] args) {
    
        String username = "ibmuser";
        String host = "localhost";
        int port = 10022;              // Note, my z/OS is running in a docker container so I map 10022 to 22
        JSch jsch = new JSch(); 
        String sourceFile = "/";
        String destinationPath ="/";
        String privateKey = "myPrivateKey";
    
    
        try {
          jsch.addIdentity(privateKey);                   //add private key path and file
          com.jcraft.jsch.Session session = jsch.getSession(username, host, port);
          session.setConfig("PreferredAuthentication","password");
          session.setConfig("MaxAuthTries", "2");
          System.out.println("Created SFTP Session");
    
          Properties sftpSessionConfig = new Properties();
          sftpSessionConfig.put("StrictHostKeyChecking","no");
          session.setConfig(sftpSessionConfig);
          session.connect(); //Connect to session
          System.out.println("Connected to SFTP Session");
          
          com.jcraft.jsch.ChannelSftp channel = (com.jcraft.jsch.ChannelSftp) session.openChannel("sftp");
          channel.connect();
          // com.jcraft.jsch.Channel sftpChannel = (ChannelSftp) channel;
          //    channel.ls("/+recfm=fb,lrecl=3000"); //set lrecl and recfm ---> THROWING ERROR HERE
          //    channel.ls("/"); //set lrecl and recfm ---> THROWING ERROR HERE
          Vector filelist = channel.ls("/");
          for(int i=0; i<filelist.size();i++){
              System.out.println(filelist.get(i).toString());
          }
    
    
        //  channel.put(sourceFile, destinationPath, com.jcraft.jsch.ChannelSftp.APPEND);  //Push file from local to mainframe
        } catch (Exception e) {
          System.out.println("Exception "+e.getMessage());
        }
      }
    }
    
    +
    和所有东西放在右边,您可以得到:

    已创建SFTP会话
    已连接到SFTP会话
    drwxr-xr-x 2 Omvkern系统18192年5月13日01时18分。
    drwxr-xr-x 7 Omvkern系统18192年5月13日01时18分。。
    -rw-r--r--1 OMVSKERN SYS1 0 May 13 01:18文件1
    -rw-r--r--1 OMVSKERN SYS1 0 May 13 01:18文件2
    
    主要问题是z/OS似乎不支持您正在使用的语法,这是由Davetail的特定SFTP实现提供的


    如果您没有鸠尾榫,我建议,由于您发送的CSV文件通常长度可变,因此您可以将其作为USS文件发送,以便正确翻译这些行并使其具有可变长度。将它们传输到USS(z/OS上的常规Unix),然后将它们复制到具有VB RECFM的MVS文件中。假设文件已分配,您可以执行
    cp myuploadedFile.csv”//'MY.MVS.file'

    我已使用scala代码测试了spark服务器与SFTP的连接,连接已正确建立,甚至可以推送文件。唯一的问题是我需要修复的每个记录行都被截断了。。我没有尝试过Java,因为我们的项目完全是在scala上开发的。我想大型机运行的是z/OS。您是否考虑过将文件发送到z/OS上的UNIX文件系统?在我看来,这个问题与Spark无关。出于调试目的,我会尝试纯粹用Scala(无Spark)编写一个小程序来检查happens@werner在没有spark服务器的本地系统上尝试此操作时,我遇到了相同的问题。问题是大型机服务器定义了每行记录的默认长度(lrecl)。我们需要在scala代码中增加lrecl值,以便在使用sftp在大型机上编写文件时不会发生行级截断。我建议您与客户机联系,询问他们正在运行的是什么STFP服务器。然后让他们与所述产品的供应商交谈,并寻求帮助,指定LRECL、RECFM参数(如果支持的话)。我们在这里所能谈论的似乎都是没有这些知识的猜测。我仍然得到EDC5129I没有这样的文件或目录。文件:/+recfm=fb,lrecl=30002:EDC5129I没有这样的文件或目录。文件:/+recfm=fb,lrecl=3000在com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846)在com.jcraft.jsch.ChannelSftp(ChannelSftp.java:2198)在com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:2215)在com.jcraft.jsch.ChannelSftp.ls(ChannelSftp.java:1565)在com.jcraft.jsch.ChannelSftp.ls(ChannelSftp.java:1526)我将使用用于指定这些选项的代码更新我的问题。使用scala代码块更新我的问题。请查看并帮助我解决此问题。