Hadoop 在我关闭OutputStream之前,配置单元不会读取最新的HDFS文件数据

Hadoop 在我关闭OutputStream之前,配置单元不会读取最新的HDFS文件数据,hadoop,hive,hdfs,Hadoop,Hive,Hdfs,我使用Spark Streaming将数据附加到HDFS文件中。对于每个批,我都写入数据,然后调用hsync以确保数据是持久的 当执行hadoop fs-cat命令时,我可以看到我的更新是持久的,但是如果我在配置单元中执行select count*from table,在关闭OutputStream之前,总计数不会改变 我还注意到,当执行hadoop fs-ls命令时,HDFS文件的上次修改时间和文件大小将不会更改,直到关闭OutputStream 这是怎么发生的?有没有办法让配置单元读取新数据

我使用Spark Streaming将数据附加到HDFS文件中。对于每个批,我都写入数据,然后调用hsync以确保数据是持久的

当执行hadoop fs-cat命令时,我可以看到我的更新是持久的,但是如果我在配置单元中执行select count*from table,在关闭OutputStream之前,总计数不会改变

我还注意到,当执行hadoop fs-ls命令时,HDFS文件的上次修改时间和文件大小将不会更改,直到关闭OutputStream

这是怎么发生的?有没有办法让配置单元读取新数据但不关闭OutputStream

Edited@20180811

我想问题是,在文件关闭之前,文件大小不同步到namenode。当MR作业启动时,它从namenode获取文件大小(不是实际大小),并告诉MR作业读取该大小,因此不会读取新附加的数据。
是否有配置属性可以避免这种情况?

原因是当初始化MR作业时,客户端将从名称节点获取文件长度并计算文件拆分。当文件未关闭时,文件长度不同步到名称节点,所以客户端不知道有新数据。我定制了文件输入格式来验证这个问题,@

count*本身是不可靠的——这太疯狂了,但有人认为HQL可能会根据陈旧的统计数据和诸如此类的东西提供错误的结果。尝试更精细的sthg,迫使蜂巢运行一个适当的纱线作业,如。。。其中A不为空,如果您确定A不能为空,但Hive不为空,则HDFS NameNode不会更新文件元数据,直到负责写入的DataNode发出信号A客户端关闭连接或b当前块完成[因为它达到了限制,或客户端强制重设]或者c客户端连接在60分钟后超时。@SamsonScharfrichter感谢您的重播。我试过你的建议,但也不管用。我认为运行MR作业是因为蜂巢控制台报告MR进度。