Hadoop HDFS:读取正在写入的序列文件

2023-12-01

我使用的是 Hadoop 1.0.3。

我将日志写入 HDFS 中的 Hadoop 序列文件,在每组日志后调用syncFS(),但我从不关闭该文件(除非我执行每日滚动)。

我想保证的是,当文件仍在写入时,读者就可以使用该文件。

我可以通过 FSDataInputStream 读取序列文件的字节,但如果我尝试使用 SequenceFile.Reader.next(key,val),它会在第一次调用时返回 false。

我知道数据在文件中,因为我可以使用 FSDataInputStream 或 cat 命令读取它,并且我 100% 确定调用了syncFS()。

我检查了namenode和datanode日志,没有错误或警告。

为什么 SequenceFile.Reader 无法读取我当前正在写入的文件?


您无法确保读取完全写入数据节点侧的磁盘。您可以在文档中看到这一点DFSClient#DFSOutputStream.sync()其中指出:

  All data is written out to datanodes. It is not guaranteed that data has
  been flushed to persistent store on the datanode. Block allocations are
  persisted on namenode.

因此它基本上用当前信息更新名称节点的块映射并将数据发送到数据节点。由于您无法将数据刷新到数据节点上的磁盘,而是直接从数据节点读取数据,因此您会遇到数据在某处缓冲且无法访问的时间范围。因此,您的序列文件读取器会认为数据流已完成(或为空),并且无法读取向反序列化过程返回 false 的其他字节。

如果块被完全接收,则数据节点将数据写入磁盘(它是预先写入的,但不能从外部读取)。因此,一旦达到块大小或文件已提前关闭并最终确定块,您就可以从文件中读取数据。这在分布式环境中完全有意义,因为你的编写者可能会死而无法正确完成一个块——这是一个一致性问题。

因此,解决方法是使块大小非常小,以便更频繁地完成块。但这不是那么有效,我希望您应该清楚您的要求不适合 HDFS。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hadoop HDFS:读取正在写入的序列文件 的相关文章

  • 2n + 1 法定人数是什么意思?

    我在描述 HBase 的 Zookeeper 配置时遇到过这个问题 但我对这个术语并不熟悉 N 与我的 HBase 集群中的节点数量有关系吗 或者我应该在 Zookeeper 集群中使用的节点数量 2f 1是指你所需要的可靠性 可用性水平
  • Hadoop 推测任务执行

    在Google的MapReduce论文中 他们有一个备份任务 我认为这与Hadoop中的推测任务是一样的 推测任务是如何实现的 当我启动一项推测任务时 该任务是从一开始就作为较旧且缓慢的任务开始 还是从较旧的任务到达的位置开始 如果是这样
  • Talend 和 Apache Spark?

    我对 Talend 和 Apache Spark 在大数据生态系统中的定位感到困惑 因为 Apache Spark 和 Talend 都可以用于 ETL 有人可以用一个例子解释一下吗 Talend 是一种基于工具的大数据方法 通过内置组件支
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • Apache hadoop 版本 2.0 与 0.23

    Hadoop 的版本和发行版太多 让我很困惑 我有几个问题 Apache Hadoop 1 x 是从 0 20 205 开始的 Apache Hadoop 2 0 是从 0 22 还是 0 23 开始 根据这个blogpost http b
  • 从 Spark 访问 Hdfs 会出现令牌缓存错误 Can't get Master Kerberosprincipal for use as renewer

    我正在尝试运行测试 Spark 脚本 以便将 Spark 连接到 hadoop 脚本如下 from pyspark import SparkContext sc SparkContext local Simple App file sc t
  • java.lang.ClassNotFoundException:找不到类 org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem

    我是 Spark 和 Kubernetes 世界的新手 我使用 docker image tool sh 实用程序使用与 Hadoop 3 2 捆绑在一起的官方 Spark 3 0 1 构建了 Spark docker 映像 我还为 Jup
  • java.io.IOException: EnsureRemaining: 仅剩余 0 个字节,尝试读取 1

    我在 giraph 中的自定义类方面遇到一些问题 我制作了 VertexInput 和 Output 格式 但总是收到以下错误 java io IOException ensureRemaining Only bytes remaining
  • 如何按行扩展数组值!!使用 Hive SQL

    我有一个有 4 列的表 其中一列 项目 类型是 ARRAY 其他是字符串 ID items name loc id1 item1 item2 item3 item4 item5 Mike CT id2 item3 item7 item4 i
  • Spark on Hive SQL 查询错误 NoSuchFieldError: HIVE_STATS_JDBC_TIMEOUT

    针对 Hive 2 1 0 提交 Spark 1 6 0 SQL 应用程序时出现错误 Exception in thread main java lang NoSuchFieldError HIVE STATS JDBC TIMEOUT a
  • 更改 Hadoop 中的数据节点数量

    如何改变数据节点的数量 即禁用和启用某些数据节点来测试可扩展性 说得更清楚一点 我有4个数据节点 我想一一实验1 2 3 4个数据节点的性能 是否可以只更新名称节点中的从属文件 临时停用节点的正确方法 创建一个 排除文件 这列出了您想要删除
  • 将 Apache Zeppelin 连接到 Hive

    我尝试将我的 apache zeppelin 与我的 hive 元存储连接起来 我使用 zeppelin 0 7 3 所以没有 hive 解释器 只有 jdbc 我已将 hive site xml 复制到 zeppelin conf 文件夹
  • 在蜂巢中出现错误

    当我连接到 ireport 时 如果说在 hive shell 中显示表 则会出现此错误 元数据错误 java lang RuntimeException 无法实例化 org apache hadoop hive metastore Hiv
  • Mapreduce shuffle 阶段出现内存不足错误

    我在运行时遇到奇怪的错误类似字数统计映射缩减程序 我有一个包含 20 个从站的 hadoop 集群 每个从站都有 4 GB RAM 我将 Map 任务配置为 300MB 堆 Reduce 任务槽为 1GB 我每个节点有 2 个映射槽和 1
  • 覆盖hadoop中的log4j.properties

    如何覆盖hadoop中的默认log4j properties 如果我设置 hadoop root logger WARN console 它不会在控制台上打印日志 而我想要的是它不应该在日志文件中打印 INFO 我在 jar 中添加了一个
  • 无法在 Presto 中读取数据 - 在 Hive 中可以读取数据

    我有一个 Hive DB 我创建了一个与 Parquet 文件类型兼容的表 CREATE EXTERNAL TABLE default table date date udid string message token string PAR
  • 使用 Java API 在 Hadoop 中移动文件?

    我想使用 Java API 在 HDFS 中移动文件 我想不出办法做到这一点 FileSystem 类似乎只想允许在本地文件系统之间移动 但我想将它们保留在 HDFS 中并将它们移动到那里 我错过了一些基本的东西吗 我能想到的唯一方法是从输
  • 如何使用 python 从 Azure Data Lake Gen 2 读取文件

    我有一个文件位于 Azure Data Lake gen 2 文件系统中 我想读取文件的内容并进行一些低级更改 即从记录中的一些字段中删除一些字符 更明确地说 有些字段的最后一个字符也为反斜杠 由于该值包含在文本限定符 中 因此字段值会转义
  • sqoop 通过 oozie 导出失败

    我正在尝试将数据导出到mysql from hdfs通过sqoop 我可以通过 shell 运行 sqoop 并且它工作正常 但是当我通过调用oozie 它出现以下错误并失败 我还包括了罐子 没有描述性日志 sqoop脚本 export c
  • Hadoop 作业:任务在 601 秒内无法报告状态

    在伪节点上运行 hadoop 作业时 任务失败并被杀死 错误 任务尝试 在 601 秒内无法报告状态 但同一个程序正在通过 Eclipse 运行 本地作业 任务 大约有 25K 个关键字 输出将是所有可能的组合 一次两个 即大约 25K 2

随机推荐