整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

hive> SELECT * FROM zip_profits ORDER BY sales_vol DESC; OK 403.71 90210 28.0 10005 20.0 95014 15.7导入大对象

很多数据库都支持在一个字段中保存大量的数据,根据数据是文本还是二进制类型,通常将其保存在表中CLOB或BLOB类型的列中。数据库一般会 对这些“大对象”进行特殊处理。大多数的表在磁盘上的物理存储都如图 15-2所示。通过行扫描来确定哪些行匹配特定的査询条件时,通常需要从 磁盘上读出每一行的所有列。如果也是以这种方式“内联”(inline)存储大 对象,它们会严重影响扫描的性能。因此,一般将大对象与它们的行分开 存储,如图15-3所示。在访问大对象时,需要通过行中包含的引用来“打 开它。

Row1:

coll

col2

col3

col4

Row 2:

coll

col2

coB

col4

图15-2.数据库通常以行数组的方式来存储表,行中所有列存储在相邻的位置


image.png

图15-3.大对象通常保存在单独的存储区域,行的主存储区域包含指向大对象的间接引用

在数据库中使用大对象的困难表明,像Hadoop这样的系统更适合于处理大 型的、复杂的数据对象,也是存储此类信息的理想选择。Sqoop能够从表中 抽取大对象数据,并且将它们保存在HDFS中供进一步处理。

同在数据库中一样,MapReduce在将每条记录传递给mapper之前一般要对 其进行“物化”(materialize)。如果单条记录真的很大,物化操作将非常

低效。

如前所示,Sqoop所导入的记录在磁盘上的存储格式与数据库的内部数据结 构非常相似:将每条记录的所有字段放在一起组成的一个记录数组。在导 入的记录上运行一个MapReduce程序时,每个map任务必须将所读记录的 所有字段完全物化。如果MapReduce程序所处理的输入记录中仅有很小一 部分的大对象字段的内容,那么将所有记录完全物化将导致程序效率低 下。此外,从大对象的大小来看,在内存中进行完全物化也许是无法实 现的。

为了克服这些困难,Sqoop将导入的大对象数据存储在LobFile格式的单独 文件中。LobFile格式能够存储非常大的单条记录(使用了 64位的地址空 间),每条记录保存一个大对象。LobFile格式允许客户端持有对记录的引 用,而不访问记录内容;对记录的访问是通过java.io.InputStream(用 于二进制对象)或java.io.Reader(用于字符对象)来实现的。

在导入一条记录时,所有的“正常”字段会在一个文本文件中一起被物


化,同时还生成一个指向保存CLOBBLOB列的LobFile文件的引用。 例如,假设我们的widgets表有一个名为schematicBLOB字段,该 字段用于保存每个部件的原理图。

导入的记录可能像下面这样:

2,gizmo,4.00,2009-11-30,4^ null
J
externalLob(lf,lobfileO,100,5011714)

externalLob(…)是对外部存储大对象的一个引用,这个大对象以LobFile 格式(If)存储在名为/〇妨/e0的文件中,同时还给出了该对象在文件中的字 节位移和长度。

在使用这条记录时,Widget • get_scheinatic ()方法会返回一个类型为 BlobRef的对象,用于引用schematic列,但这个对象并不真正包含记录 的内容。BlobRef.getDataStream()方法实际会打开LobFile文件并返回 一个InputStream,用于访问schematic字段的内容。

在使用一个MapReduce作业来处理许多Widget记录时,可能你只需要访 问少数几条记录的schematic字段。单个原理图数据可能有几兆大小或更 大,使用这种方式时,只需要承担访问所需大对象的丨/0开销。

在一个map任务中,BlobRefClobRef类会缓存对底层LobFile文件的 引用。如果你访问几个顺序排列记录的schematic字段,就可以利用现有 文件指针来定位下一条记录。

转载请注明:全栈大数据 » hive> SELECT * FROM zip_profits ORDER BY sales_vol DESC; OK 403.71 90210 28.0 10005 20.0 95014 15.7导入大对象

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址