【发布时间】:2017-11-05 02:34:15
【问题描述】:
我使用 Spark Streaming 将数据附加到 HDFS 文件。对于每个批次,我都会写入数据,然后调用 hsync 以确保数据是持久的。
执行 hadoop fs -cat 命令时,我可以看到我的更新是持久的,但是如果我从 Hive 中的表中执行 select count(*),则在关闭 OutputStream 之前,总计数不会改变。
我还注意到,当执行 hadoop fs -ls 命令时,HDFS 文件最后修改时间和文件大小在关闭 OutputStream 之前不会改变。
它是怎么发生的?有没有办法让 Hive 读取新数据但不关闭 OutputStream?
已编辑@20180811
我猜问题是,在文件关闭之前,文件大小没有同步到namenode。当 MR 作业启动时,它从 namenode 获取文件大小,这不是实际大小,并告诉 MR 作业读取大小,因此不会读取新的附加数据。 是否有配置属性可以避免这种情况?
【问题讨论】:
-
count(*)单独是不可靠的——这太疯狂了,但是有人认为 HQL 可能会根据陈旧的统计数据等提供错误的结果。如果您确定 A 不能为空(但 Hive 不为空),请尝试更详细地强制 Hive 运行正确的 Yarn 作业,例如... where A is not null -
AFAIK HDFS NameNode 不会更新文件元数据,直到 DataNode-in-charge-of-write 发出 (a) 客户端关闭连接或 ( b) 当前块已完成[因为它达到了限制,或者客户端强制重置] 或 (c) 之后客户端连接超时60 分钟。
-
@SamsonScharfrichter 感谢您的重播。我试过你的建议,但也不起作用。而且我认为 MR 作业正在运行,因为 hive 控制台报告了 MR 进度。