【问题标题】:Hive doesn't read latest HDFS file data until I close OutputStream在我关闭 OutputStream 之前,Hive 不会读取最新的 HDFS 文件数据
【发布时间】: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 进度。

标签: hadoop hive hdfs


【解决方案1】:

原因是在初始化 MR 作业时,客户端会从名称节点获取文件长度并计算文件拆分。当文件未关闭时,文件长度不会同步到名称节点,因此客户端不知道有新数据。我自定义文件输入格式来验证这个问题,@https://github.com/yantzu/hendeavour

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 2020-10-25
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多