我使用Spark Streaming将数据附加到HDFS文件。对于每个批处理,我编写数据然后调用hsync以确保数据是持久的。
当执行hadoop fs -cat命令时,我可以看到我的更新是持久的,但是如果我从Hive中的表执行select count(*),则总计数不会改变,直到我关闭OutputStream。
另外我注意到,当执行hadoop fs -ls命令时,HDFS文件的最后修改时间和文件大小在关闭OutputStream之前不会改变。
怎么回事?有没有办法让Hive读取新数据但不关闭OutputStream?
编辑@ 20180811
我想问题是,在文件关闭之前,文件大小不同步到namenode。当MR作业启动时,它从namenode获取的文件大小不是实际大小,并告诉MR作业读取大小,因此不会读取新的附加数据。 是否有配置属性来避免这种情况?
答案 0 :(得分:0)
原因是当init MR作业时,客户端将从名称节点获取文件长度并计算文件拆分。当文件未关闭时,文件长度不与名称节点同步,因此客户端不知道有新数据。我自定义文件输入格式以验证此问题,@ https://github.com/yantzu/hendeavour