第7章 MapReduce编程
从编程角度讲,其过程是:在各Mapper端中,MapReduce框架将输入文件按行分割,一行作为一条数据,以每条数据作为输入参数循环调用map处理方法,再将一条条输出的数据分发给各Reducer,Reducer对每条数据调用一次reduce处理方法,得到最终结果。
第8章 Hive
HiveHive(相关信息可参考官方网站)是一个基于MapReduce的海量数据处理、分析工具,为我们利用Hadoop平台处理数据提供了一个简易途径。
Hive可以让我们用SQL的方式描述对数据如何处理,并解析SQL语句、转化成MapReduce job链、自动执行Job链输出结果,省去很多工作。
Hive被称作数据仓库工具,因为它适合做的事与关系型数据库是有差别的,它基于HDFS和MapReduce,适合做一些对数据进行抽取、转换、加载(ETL)的工作,而不适合做事务性的工作(修改这些数据),其原因是HDFS不支持随机写(比如update等SQL命令)
Hive适于做联机数据分析(OLAP),而不适于做联机事务处理(OLTP),所以大家喜欢将Hive为数据仓库而不是数据库。
Hive的初始定位不是一个独立的系统,只是提供一个便于利用MapReduce进行数据处理的辅助工具。随着功能的更新和发展,它的定位正在发生变化,变得越来越像一个数据库系统。
8.1 Hive的设计架构
为了让用户以关系型数据库方式查询和计算数据,Hive提供了表结构管理服务。
Hive支持的基本数据类型与其他数据库差不多。Hive会在数据文件之外独立地保存其表结构以及表的其他属性(这些叫作元数据meta),这就是表结构管理服务所提供的,这个服务的名字叫作MetaStore(元数据存储)。
通过Hive处理文件中的数据时需要先创建表,并将表与文件关联(当然要保证表的结构与文件中的数据是一致的,否则就会出错),然后就可以用SQL进行数据查询了。
8.2 运行架构
要使用Hive3,需先启动其服务程序HiveServer2,然后通过Hive提供的命令行工具连接,就可以进行交互式操作了。HiveServer2的命令行工具叫beeline。
HiveServer2的主要功能是接受客户端的连接,接收客户端发出的SQL语句,处理语句,转成MR作业链,执行MR作业,返回结果。
MetaStore的运行需要一个数据库支持。
MetaStore依赖的数据库也有两种部署模式:嵌入式和独立式。当采用Derby这样的嵌入式数据库时,MetaStore与数据库处于同一进程中;当采用MySQL这样的独立服务时,MetaStore以JDBC远程访问数据库。
已经存在一个或一堆文件,文件的数据都是结构化的,比如存储的是所有学生几年的考试成绩。为了能用Hive处理它们,我们会创建一个表score,然后将这些文件中的数据load到表中,这个load动作其实就是简单地复制了一下,将这些文件复制到Hive仓库目录中,然后就可以用类似SQL的方式处理这些数据了。
创建表时,必须保证表的结构与文件中的数据兼容,即表的列数与数据可分出的字段数相同,且对应的列与字段的类型要兼容(如果一个字段中含有非数字字符,就不能把它当成数值类型)。
对于文本文件,如何进行区分?在创建表时,除了指定表结构,也要考虑这些问题。在文本文件中,大多数结构化数据一条占一行,一条数据的字段之间以逗号、空格或其他符号分割,
ROW FORMAT表示定义一条数据的区分方式;
- DELIMITED表示在语句中指定如何区分各条数据和一条数据中的字段。
- FIELDS TERMINATED BY ','表示一条数据中各字段以逗号分割。
- LINES TERMINATED BY '\n’表示各条数据以换行符分割。
Hive所使用的文件一般是其他系统产生的,所以不要指望每条数据都像MySQL的表一样有主键,即使有的数据有可以作为主键的字段(比如编号),也不能保证它的值没有重复,这是Hive表的一个特点。
8.10 Hive编程
Hive是一个关系型数据库,因此提供了JDBC API和ODBC API。