不需要重新写一个应用程序将数据导入HDFS中,值得考虑用一些线程的工具将数据导入。这些工具涵盖了很多常用的需求。
Apache Flume是一个将大规模流数据导入HDFS的工具。最典型的应用是从另外一个系统中收集日志数据。如:银行的网络服务器-并实现在HDFS中的聚集操作以便用于后期的分析操作。Flume能够支持大量的数据源,其中一些通常用于包含tail,syslog和apache log4j的系统.
Flume节点允许以任何拓扑方式进行组织。典型配置是在每个源机器上运行一个Flume节点,通过多个层级的聚合节点,最后将数据存入HDFS中。
Flume提供了不同级别的数据投递可靠性。
Apache Sqoop是为了将数据从结构化存储设备批量导入HDFS中设计的。例如关系数据库。应用场景,是组织将白天生产的数据库中的数据在晚间导入Hive数据仓库中进行分析。
Sqoop数据导入工具的简单介绍
Hadoop平台的最大优势在于它支持不同形式的数据。HDFS能够可靠的存储日志和来自不同渠道的其他数据,MapReduce程序能够解析多种“即席”数据格式,抽取相关信息并将多个数据集组合成非常有用的结果。
但是为了能够和HDFS之外的数据存储进行交互,MapReduce程序需要使用外部API来访问数据。通常,一个组织中有价值的数据都存储在关系型数据库系统(RDBMS)等结构化的存储器中。Sqoop是一个开源工具,它允许用户将数据从结构化存储器综合功能抽取到Hadoop中,用于进一步的处理。抽取出的数据可以被MapReduce程序使用,也可以被其他类似于Hive的工具使用。也可以使用Sqoop将数据从数据库转移到HBase,形成最终的分析结果之后,Sqoop可以将这些结果导回数据存储器,供其他客户端使用。
sqoop被组织成一组工具或命令。不选择工具,Sqoop便无所适从。
sqoop拥有一个可扩展的框架,使得它能够从任何支持批量数据传输的外部存储系统导入导出数据。一个Sqoop连接器(connector)就是这个框架下的一个模块化组件、用于支持Sqoop的导入和导出操作。Sqoop附带的连接器能够支持大多数常用的关系数据库系统,包括MySQL,postgreSql、Oracle、sqlserver和DB2.同时还有一个通用的JDBC连接器,用于连接支持jdbc协议的数据库。sqoop所提供的mysql和postgresql连接器都是经过优化的,通过使用数据库特定的API来提供高效率的批量数据传输工作。
sqoop可以将数据导入成几种不同的格式,文本文件时一种默认的人类可读的数据表示形式,并且是平台独立和最简单的数据格式。但文本文件不能保存二进制字段,并且在区分null值和null字符串时可能会出现问题。为了处理这种情况,应该使用sequenceFile格式活着avro格式。它们能够为导入的数据提供最精确的表示方式,同时还允许对数据进行压缩,并支持mapreduce并行处理同一文件的不同部分。
Sqoop除了能够将数据库表的内容写到HDFS,Sqoop同时还生成了一个JAVA源文件-widgets.java,保存在当前的本地目录中。在sqoop将数据库的表数据写到HDFS之前,会先用生成的代码对其进行反序列化。
sqoop时通过一个MapReduce作业从数据库中导入一个表,这个作业从表中抽取一行行记录,然后将记录写入HDFS.
上图是sqoop的导入过程。
sqoop不需要每次都导入整张表,可以指定导入表的部分列。
在想HDFS中导入数据时,重要的是要确保访问的是数据源的一致性快照,最好的方法就是在导入时,不允许运行任何对表中数据进行更新的进程。
一旦数据被导入HDFS,就可以供定制的MapReduce程序使用。导入的文本格式数据可以供hadoop streaming中的脚本或以textinputformat为默认格式运行的MapReduce作业使用。
针对分析任务,使用Hive的系统来处理关系操作有利于加快分析任务的开发。所以Hive和sqooop共同构成了一个强大的服务于分析任务的工具链。
在数据库中使用大对象会有困难,像hadoop这样的系统更适合处理大型的、复杂的数据对象,sqoop能够从表中抽取大对象数据,并且将它们保存在HDFS中供进一步处理。
在sqoop中,导入时指将数据库从数据库系统移动到HDFS.与之相反,导出是将HDFS作为数据源,而将远程数据库作为目标。