java - Hadoop SequenceFile 二进制文件安全吗?

标签 java hadoop cloud hdfs sequencefile

我看了hadoop-1.0.4源码中的SequenceFile.java。我找到了 sync(long) 方法 它用于在将 SequenceFile 拆分为 MapReduce 中的文件拆分时在 SequenceFile 中查找“同步标记”(在文件创建时生成时为 16 字节的 MD5)。

/** Seek to the next sync mark past a given position.*/
public synchronized void sync(long position) throws IOException {
  if (position+SYNC_SIZE >= end) {
    seek(end);
    return;
  }

  try {
    seek(position+4);                         // skip escape
    in.readFully(syncCheck);
    int syncLen = sync.length;
    for (int i = 0; in.getPos() < end; i++) {
      int j = 0;
      for (; j < syncLen; j++) {
        if (sync[j] != syncCheck[(i+j)%syncLen])
          break;
      }
      if (j == syncLen) {
        in.seek(in.getPos() - SYNC_SIZE);     // position before sync
        return;
      }
      syncCheck[i%syncLen] = in.readByte();
    }
  } catch (ChecksumException e) {             // checksum failure
    handleChecksumException(e);
  }
}

这些代码只是寻找包含与“同步标记”相同数据的数据序列。

我的疑问:
考虑这样一种情况,SequenceFile 中的数据恰好包含与“同步标记”相同的 16 字节数据序列,上面的代码会错误地将这 16 字节数据视为“同步标记”,然后 SequenceFile 将不会正确解析?

我没有发现任何关于数据或同步标记的“转义”操作。 SequenceFile 如何做到二进制安全?我错过了什么吗?

最佳答案

冲突在技术上是可能的,但实际上它们极不可能发生。

来自 http://search-hadoop.com/m/VYVra2krg5t1 :

The probability of a given random 16-byte string appearing in a petabyte of (uniformly distributed) data is about 10^-23. It's more likely that your data center is wiped out by a meteorite (http://preshing.com/20110504/hash-collision-probabilities).

关于java - Hadoop SequenceFile 二进制文件安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16251110/

相关文章:

hadoop - 如何配置 Flume 来监听 web api http 请求

spring - 在运行时模拟用户进行spring hadoop配置

java - 如何从 Jena RDF Inf 模型中的节点值获取个人名称

java - 如何从android中的字符串解析url?

java - 配置 AppContextListener 类的应用程序监听器时出错

ruby-on-rails - 将图像上传到云服务的最简单解决方案

python - 使用 Python 从 qcow2 图像文件创建自定义 EC2 AMI

java - Arquilian 无法通过多个部署注入(inject) UserTransaction

hadoop - hive 选择列做一个案例陈述

objective-c - Xcode 错误地指出 "Cloud.h"不存在