Hadoop I/O系统介绍

2019-03-28 13:06|来源: 网络

看过很多Hadoop介绍或者是学习的帖子和文章,发现介绍Hadoop I/O系统的很少。很多文章都会介绍HDFS的架构和使用,还有MapReduce编程等等。尤其是在介绍Hadoop的MapReduce编程之前,首先必须了解下Hadoop的I/O知识,要不一看到IntWritable、LongWritable、Text、NullWritable等概念就有点犯晕,看到和普通的Java程序类似的MapReduce程序就觉得很难。如果这时候你知道其实IntWritable就是其他语言如Java、C++里的int类型,LongWritable就是其他语言里的long,Text类似String,NullWritable就是Null,这样你就会很轻易的明白Hadoop 的MapReduce 程序。就像在学习其他编程语言之前必须先学习数据类型一样,在学习Hadoop的MapReduce编程之前,最好先学习下Hadoop的I/O知识。这里就简要介绍Hadoop的I/O知识,就当抛砖引玉吧。

1序列化和反序列化

序列化(Serialization)就是结构化的对象转化为字节流,这样可以方便在网络上传输和写入磁盘进行永久存储(原因看完这部分后就明白了)。反序列化(deserialization)就是指将字节流转回结构化对象的逆过程。

序列化和反序列化在分布式数据处理里主要出现在进程间通行和永久存储两个应用领域。在Hadoop 系统中,系统中多个节点上的进程间通信是通过远程过程调用(romote procedure call,R PC)实现的,RPC协议将消息序列转化为二进制流后发送到远程节点,远程节点接着将二进制流反序列化为消息,所以RPC对于序列化有以下要求(也就是进程间通信对于序列化的要求):

(1)紧凑,紧凑的格式可以提高传输效率,充分利用网络带宽,要知道网络带宽是数据中心的一种非常重要的资源。

(2)快速,进程间通信是分布是系统的重要内容,所以必须减少序列化和反序列化的开销,这样可以提高整个分布式系统的性能。

(3)可扩展,通信协议为了满足一些新的需求,比如在方法调用的过程中增加新的参数,或者新的服务器系统要能够接受老客户端的旧的格式的消息,这样就需要直接引进新的协议,序列化必须满足可扩展的要求。

(4)互操作,可以支持不同语言写的客户端(比如C++、java、Python等等)与服务器交互。

前面说了序列化的目的是可以方便在网络上传输和写入磁盘进行永久存储,前面讲了进程间通信对于序列化的要求,下面来说一说数据永久存储对于序列化的要求。前面说的4个序列化的要求也是数据永久存储所要求的,存贮格式紧凑可以高效的利用存储空间,快速可以减少读写数据的额外开销,可扩张这样就可以方便的读取老格式的数据,互操作就可以满足不同的编程序言来读写永久存贮的数据。

相关问答

更多
  • 它是实现正确的接口还是为reducer实现扩展正确的类。 例外情况表明实现方法中的包差异与使用相比(新旧vso hadoop api) Is it implementing the correct interface or extending the correct class for the reducer implementation. The exception says a package difference in the implementation method required vs the ...
  • 做了一个全新安装的hadoop并用同一个罐子运行工作,问题就消失了。 似乎是一个错误,而不是编程错误。 Did a fresh installation of hadoop and ran the job with the same jar, the problem disappeared. Seems to be a bug rather than programming errors.
  • Hadoop有asm 3.2而我使用的是ASM 5.在ASM5中,ClassVisitor是一个超类,而在3.2中它是一个接口。 出于某种原因,错误是Throwable(信任Shevek),catch块只捕获异常。 任何hadoop日志都没有捕获throwable错误。 因此,调试非常困难。 使用jar jar链接修复asm版本问题,现在一切正常。 如果你正在使用Hadoop并且某些东西不起作用并且没有日志显示任何错误,那么请尝试抓住Throwable。 阿伦 Hadoop had asm 3.2 and ...
  • 您应该添加/usr/lib/hadoop-0.xx/lib找到的所有jar以避免这种类路径问题。 为了给你一个想法,你可以输入hadoop classpath ,它将打印出获取Hadoop jar和所需库所需的类路径。 在你的情况下,你错过了hadoop-common-0.xx.jar ,所以你应该把它添加到classpath中,你应该很好。 You should add all the jars found in /usr/lib/hadoop-0.xx/lib to avoid this kind of ...
  • 我认为这会帮助你更好地理解Spark和Haddop之间的关系: Hadoop本质上是一个分布式数据基础架构:它在大量商品服务器中的多个节点上分发海量数据集合,这意味着您不需要购买和维护昂贵的定制硬件。 它还对这些数据进行索引和跟踪,使大数据处理和分析能够比以前更有效。 另一方面,Spark是一种数据处理工具,可以对这些分布式数据集进行操作; 它不会做分布式存储。 欲了解更多信息,请阅读。 I think this will help you understand better the relation be ...
  • 这可能发生在作业仅检测到本地文件系统的情况下,它使用LocalFileSystem API与本地文件系统中的文件进行交互。 请参考以下链接, 使用MiniDFSCluster单元测试hadoop hdfs着作 这是我们在开发环境中开发的mapreduce / hdfs代码的单元测试选项之一。虽然在hadoop clsuter中部署相同的代码,但输入文件将在HDFS位置。 This probably happens in the scenario where the job only detects the ...
  • 假设zipIn是java.util.zip.ZipInputStream ,你不应该迭代地调用getNextEntry而不是读取字节吗? I resolved this issue after doing some changes in my code. In the first part of code, I was trying to unzip all the zip files whereas I should have access the spilts. Hadoop basic, which ...
  • 看起来你正在使用hadoop的后级版本。 检查您的图形构建器版本所需的hadoop版本,并确保它是您正在运行的版本。 Looks like you're using a back level version of hadoop. Check the version of hadoop that your version of graph builder needs and make sure that's the version you're running.
  • 您可以使用Sqoop将数据从RDBMS导入Hadoop。 Hadoop会处理非结构化数据,因为您将约束(创建结构化数据)推到了最后。 这也允许创建什么样的结构,这将定义您可以提取的信息类型。 永远不会说您无法处理结构化数据,但获得的里程数很低。 RDBMS可以高效地处理结构化数据。 You can use Sqoop to import data from RDBMS to Hadoop. Hadoop shines at processing unstructured data because you a ...
  • ETL是一种提取数据,转换(连接,充实,过滤,...)它并将结果加载到另一个数据存储中的工具。 良好的ETLS是可视化的,数据存储不可知并且易于自动化。 Hadoop是一个分布在集群网络和软件上的数据存储,用于处理发现的数据。 数据转换专门针对少数基本操作,这些操作可以针对这种通常大量的数据进行优化,例如(但不仅仅是)Map-Reduce。 Pentaho Data Integrator具有Hadoop系统的连接器,易于设置和调整。 因此,最好的策略是将Hadoop网络设置为数据存储并通过PDI对其进行操作 ...