所以我想了解hdfs中的一些行为。我的目标是建立一个配置,在这个配置中,我打开一个fsdataoutputstream到某个位置,然后让我的应用程序的其他部分在写入任何字节之前,立即打开一个fsdatainputstream到同一个位置。
我的想法是,当我将字节写入fsdataoutputstream、刷新它们并调用“sync()”时,任何有权访问fsdatainputstream的人都应该能够读取这些字节。
可悲的是,它似乎不是这样工作的。当我以这种方式设置代码时:
FSDataOutputStream writer = fs.create(new Path("/foo/bar"));
FSDataInputStream reader = fs.open(new Path("/foo/bar"));
writer.write(new byte[]{1, 1, 1, 1, 1});
writer.flush();
writer.sync();
System.out.println(reader.available()); // writes '0'
然而!当我这样设置代码时,会发生以下情况:
FSDataOutputStream writer = fs.create(new Path("/foo/bar"));
writer.write(new byte[] {1, 1, 1, 1, 1});
writer.flush();
writer.sync();
FSDataInputStream reader = fs.open(new Path("/foo/bar"));
System.out.println(reader.available()); // writes '5'
最后,我做的第三个测试是:
FSDataOutputStream writer = fs.create(new Path("/foo/bar"));
writer.write(new byte[] {1, 1, 1, 1, 1});
writer.flush();
writer.sync();
FSDataInputStream reader = fs.open(new Path("/foo/bar"));
writer.write(new byte[] {2, 2, 2, 2, 2});
writer.flush();
writer.sync();
System.out.println(reader.available()); // writes '5'
我的结论是fsdatainputstream的作用域总是局限于创建输入流时已经写入的字节。有什么办法吗?我在输入流上没有看到“refresh()”方法或类似的方法。
我真的,真的很想,如果我有什么办法强迫输入流更新它的可用字节。我错过了什么?我做错什么了?这样做是不是很简单?
1条答案
按热度按时间ntjbwcob1#
据我所知,
DFSInputStream
仅在打开时以及在尝试从块读取时遇到错误时刷新其已定位块的列表。因此,不管您在输出流中做了什么,输入流都不会被更新。如果您正试图实现一个单一生产者/多消费者系统,您可能会考虑使用类似zookeeper的东西来进行协调。