【问题标题】:Apache Flink Rest-Client Jar-Upload not workingApache Flink Rest-Client Jar-Upload 不起作用
【发布时间】:2017-01-18 16:17:15
【问题描述】:

我正在努力使用 Flink rest-api(可以在 here in the flink Github repository 找到)在我们的 CI/CD 工作流中自动部署新的 Flink 作业。

文档只说可以通过使用/jars/upload 来实现jar 上传,但没有说必须如何构建有效的休息请求(HeadersBody 类型,Authorization,@ 987654327@等)。

于是我在 Github 上查看了 flink/flink-runtime-web 项目的 Flink Dashboard 代码并搜索了 the implementation 他们用来上传 jar 和 - Yippie!它通过调用我尝试使用的rest-api来实现(使用POST作为方法)。之后,我尝试使用 Postman 找出使用不同 Content-Type 标头和 Body 类型发送请求的正确方法,但现在它们都不适合我。

我会直接向 flink 项目提交票证,但找不到任何关于他们票证系统的参考。

所以这里的基本问题是

  • 如何调用其余端点/jars/upload 才能成功上传文件?

【问题讨论】:

    标签: apache-flink


    【解决方案1】:

    比较偏向命令行的可以使用curl:

    curl -X POST -H "Expect:" -F "jarfile=@path/to/flink-job.jar" http://hostname:8081/jars/upload
    

    【讨论】:

    • 谢谢,这行得通。我居然错过了@path,挣扎了一段时间。
    【解决方案2】:

    我遇到了同样的问题,并通过在使用 web UI 上传 jar 时查看 chrome 中的网络请求来解决它。

    请求必须

    • 使用分段上传
    • 字段名称必须为jarfile
    • 多部分内容必须也包括文件 Content-Type(否则你会从 Flink 得到 500 抱怨缺少标题)

    这是一个使用请求上传的 python 脚本

    upload = requests.post(                                                                                               
        base_url + "/jars/upload",                                                                                        
        files={
            "jarfile": (
                os.path.basename(path), 
                open(path, "rb"), 
                "application/x-java-archive"
             )
        }
    )       
    

    【讨论】:

    • 谢谢。第 3 项 'application/x-java-archive' 是关键,这也为我解决了。
    • 删除旧的jar文件怎么样?
    【解决方案3】:

    想要java解决方案的可以使用:

    CloseableHttpClient client = HttpClients.createDefault();
            HttpPost httpPost = new HttpPost("YOUR API URL");
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.addBinaryBody("jarfile", new File("jarr.jar"));
            HttpEntity multipart = builder.build();
            httpPost.setEntity(multipart);
    
            try{
                CloseableHttpResponse response = client.execute(httpPost);
                System.out.println(response);
                BufferedReader rd = new BufferedReader(new InputStreamReader(
                        response.getEntity().getContent()));
    
                String line = "";
                while ((line = rd.readLine()) != null) {
                    System.out.println(line);
                    }
            }
            catch (Exception e){
                e.printStackTrace();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 2017-07-24
      • 1970-01-01
      • 2019-04-20
      相关资源
      最近更新 更多