当前位置:首页 > 问答 > 正文

树叶云教你怎么用Hadoop来读取各种数据,简单又实用的入门指南

开始)

大家好,这里是树叶云,今天我们来聊一个听起来很专业,但其实可以理解得很简单的话题:怎么用Hadoop来读取各种数据,你可能会想,Hadoop不是处理海量数据的大家伙吗?会不会很难?别担心,我们今天就把它拆解成日常语言,让你轻松入门。

我们得知道Hadoop是怎么看待数据的,在Hadoop的世界里,数据通常不是放在我们电脑的C盘、D盘里,而是放在一个叫“HDFS”的超级大仓库里。(来源:Hadoop官方文档关于HDFS的核心概念)你可以把HDFS想象成一个巨大的、由很多台普通电脑硬盘组成的网络硬盘,它的好处是数据很安全(一份数据会存好几份在不同的电脑上),而且能存海量的文件。

我们要怎么从这个大仓库里拿数据呢?关键在于一个叫做MapReduce的程序模型。(来源:Google的MapReduce论文及Hadoop对其的实现)你不用被这个名字吓到,它其实就是干两件事:“分”和“合”,你有一屋子杂乱的书,要统计每种书有多少本,MapReduce的做法是:

  1. Map(映射/分):你叫来一群小伙伴,给每人分一堆书,让他们各自统计自己手里书的种类和数量,这个过程就是Map,是并行处理的,所以非常快。
  2. Reduce(归约/合):等大家都统计完了,你把所有小伙伴的结果收上来,把同一种书的数量加在一起,得到最终的总数,这个过程就是Reduce。

Hadoop读取和处理数据,就是建立在MapReduce这个思想上的,我们来看看具体怎么读取几种常见的数据。

第一种:读取普通的文本文件(log日志文件或.csv文件) 这是最常见的情况,Hadoop自带了一个最基础的“阅读器”,叫TextInputFormat。(来源:Hadoop API文档中的TextInputFormat类说明)它怎么工作呢?

  • 它会把一个大文本文件,比如一个100G的日志文件,自动切成很多个小块(比如128MB一块),然后分发给不同的机器去并行读取。
  • 在Map阶段,它是一行一行地读数据的,每一行文本,都会作为一个独立的记录交给你的Map程序去处理。
  • 举个例子,你有一个网站的访问日志,每一行记录了一次点击,你的Map任务就可以解析每一行,提取出比如“用户名”和“访问时间”,然后输出一个中间结果,留给Reduce任务去统计。

第二种:读取序列化文件(SequenceFile) 文本文件效率不高,比如里面有很多重复的键(key),这时候可以用SequenceFile。(来源:Hadoop官方文档中关于SequenceFile的章节)它有点像把数据“打包”成一个二进制文件。

  • 这种文件格式是Hadoop“喜欢”的格式,因为它支持压缩,而且是可以被分割的,这意味着Hadoop依然可以把它切成块,并行处理。
  • 读取SequenceFile时,你用的“阅读器”是SequenceFileInputFormat,它读出来的不是一行行文本,而是一个个的“键值对”(key-value pair),这非常适合直接进行MapReduce计算,因为MapReduce本身就是在处理键值对。
  • 你的数据是“城市:温度”,已经存成了SequenceFile,那么Map任务一读进来,就直接拿到了“北京, 25”这样的键值对,可以直接开始计算,省去了从文本行里解析的步骤。

第三种:读取数据库里的数据 数据不一定都在HDFS文件里,很多时候它们还在传统的数据库里,比如MySQL。(来源:Hadoop官方文档中关于DBInputFormat的说明)Hadoop也能读吗?当然可以,它提供了一个叫DBInputFormat的工具。

  • 它的原理是:Hadoop会通过数据库的JDBC驱动(就像是一个通用的数据库连接器)去连接你的数据库。
  • 它会执行你写好的一条SQL查询语句,比如SELECT id, name, age FROM users
  • 它会将查询结果集进行划分,分配给不同的Map任务,每个Map任务会处理结果集的一部分记录。
  • 需要注意的是,频繁读取数据库可能会给数据库本身带来压力,所以这种方式通常用于一次性将大量数据从数据库导入到HDFS中,后续的分析就在HDFS上进行了,这也就是常说的“数据仓库”的构建过程。

第四种:读取其他格式的数据(比如JSON) 现在JSON格式的数据非常流行,Hadoop本身没有专门的JSONInputFormat,那怎么办呢?(来源:社区实践及Apache Pig、Hive等工具的处理方式)

  • 通常的做法是,我们还是使用最基础的TextInputFormat,把每一行JSON字符串读进来。
  • 在我们的Map程序里,引入一个外部的JSON解析库(比如Jackson、Gson),把这一行字符串解析成JSON对象,再从中提取我们需要的数据字段。
  • 这里有个小技巧:最好保证你的JSON数据是“每行一个完整的JSON记录”,这样TextInputFormat按行读取时,每一行就是一个独立的数据单元,处理起来很方便。

用Hadoop读取数据,核心是选择一个合适的InputFormat(输入格式类),它就像是Hadoop的“眼睛”,告诉Hadoop:

  1. 数据在哪?(在HDFS上还是在数据库里?)
  2. 数据是怎么组织的?(是文本行,还是二进制键值对?)
  3. 该怎么把它切分成块,方便大家(Map任务)并行干活?

你不需要自己去实现复杂的底层读取逻辑,Hadoop已经为你准备好了很多现成的工具,你只需要根据你的数据来源和格式,选择合适的工具,然后专注于在Map和Reduce函数里编写你的核心业务逻辑就行了。

希望树叶云的这个简单指南,能帮你拨开Hadoop读取数据的神秘面纱,从简单的文本文件开始尝试,一步步来,你会发现它并没有想象中那么复杂! 结束)

树叶云教你怎么用Hadoop来读取各种数据,简单又实用的入门指南