你好,看了下代码,1.7.2 确实有这问题,最新的代码已经 fix,见[1]
如果可以的话,升级到1.8.0就包含了该 fixing

1.
https://github.com/apache/flink/commit/24c2e17c8d52ae2f0f897a5806a3a44fdf62b0a5

巫旭阳 <danxieai...@163.com> 于2019年6月24日周一 下午2:40写道:

> 源码在 BucketingSink 615行
> Path testPath = new Path(basePath, UUID.randomUUID().toString());
> try (FSDataOutputStream outputStream = fs.create(testPath)) {
>    outputStream.writeUTF("hello");
> } catch (IOException e) {
> LOG.error("Could not create file for checking if truncate works.", e);
>    throw new RuntimeException("Could not create file for checking if
> truncate works. " +
> "You can disable support for truncate() completely via " +
> "BucketingSink.setUseTruncate(false).", e);
> }
>
> try {
>    m.invoke(fs, testPath, 2);
> } catch (IllegalAccessException | InvocationTargetException e) {
> LOG.debug("Truncate is not supported.", e);
> m = null;
> }
>
> try {
>    fs.delete(testPath, false);
> } catch (IOException e) {
> LOG.error("Could not delete truncate test file.", e);
>    throw new RuntimeException("Could not delete truncate test file. " +
> "You can disable support for truncate() completely via " +
> "BucketingSink.setUseTruncate(false).", e);
> }
> line 635 开始创建一个测试文件 “FSDataOutputStream outputStream = fs.create(testPath)”
> line 636 尝试写入 一段 测试文字"hello" "outputStream.writeUTF("hello")"
> line 645 调用 truncate 方法“m.invoke(fs, testPath, 2);”
> line 652 删除测试文件 “fs.delete(testPath, false);“
> 上述逻辑有一些瑕疵 :
>      1 在635行创建一个测试文件后,636行写入hello 失败,抛出异常(导致程序重启或退出)
>      2 在645行调用m.invocate 失败 抛出异常(导致程序重启或退出)
>  两行操作都抛出异常终止程序或重启程序,导致创建的测试文件无法被删除,极端情况下。程序一直在抛出异常然后重启,根据我阅读的代码
> reflectTruncat(Filesystem fs)是程序初始化 state的时候会执行。
>
>
> 望大佬能指点一下,是我的姿势不对还是这块的设计有瑕疵。
>
>

回复