分布式SQL查询引擎-Hive
分布式SQL查询引擎方面,了解到的有Hive、SparkSQL、Presto、Flink,可以说各有侧重,今天说一下Hive。
为什么要用Hive
大数据生态下,通过Hadoop MapReduce,实现将计算分割成多个处理单元,然后分散到一群家用或服务器级别的硬件上,从而降低成本并提供可伸缩性;这个计算模型下是HDFS,这是个“可插拔的“文件系统。不过,这里存在一个问题,就是用户如何从一个现有的数据基础架构转移到Hadoop上,而这个基础架构是基于关系型数据库和结构化查询语句(SQL)?
这就是Hive出现的原因,Hive提供了被称为Hive查询语言的(或称为HiveQL或HQL)的SQL方言,来查询存储在Hadoop集群中的数据。Hive将大多数据的查询转换为MapRecue任务(job)。
Hive安装
Hive使用环境变量HADOOP_HOME来指定Hadoop的所有相关JAR和配置文件,因此在安装之前请确认下是否设置好了这个环境变量。
curl -o http://archive.apache.org/dis/hive/hive-0.9.0/hive-0.9.0-bin.tar.gz
sudo mkdir-p /user/hive/warehouse
$sudo chmod a+rwx /user/hive/warehouse
可以定义HIVE_HOME环境变量
PWD/hive-0.9.0">/etc/profile.d/hive.sh
PATH:./etc/profile
Hive组成
主要包含三个部分:
1.代码本身,在HIVE_HOME/bin下,包含hive的命令行界面CLI,CLI是使用hive最常用的方式,一般会使用小写的hive代替。CLI用于提供交互式的界面供输入语句或用户执行hive语句的脚本。
3.metastore service(元数据服务),所有的hive客户端都需要元数据服务,hive使用这个服务来存储表模式信息和其他元数据信息。通常会使用关系型数据库来存储这些信息,默认使用内置的DerbySQL服务器,其可以提供有限的、单进程的存储服务。例如,当使用Derby时,用户不能执行2个并发的HiveCLI实例,然而,如果是在个人计算机上或某些开发任务上使用的话这样也没有问题。对于集群来说,需要使用MYSQL或类似的关系型数据库。
另外,hive还有一些组件,Thrift服务提供可远程访问的其他进程的功能,也提供JDBC和ODBC访问Hive的功能。Hive还提供了一个简单的网页界面HWI,提供远程访问Hive服务。
Hive启动
使用 cd bin/hive
hive>CREATETABLEx(aINT);
hive>SELECT*fromx;
hive>DROPTABLEx;
hive>exit;
Hive命行
[root@TESTPBSDIGDATAMASTER01 ~]# hive --help
Service List: beeline cleardanglingscratchdir cli help hiveburninclient hiveserver2 hiveserver hwi jar lineage metastore metatool orcfiledump rcfilecat schemaTool version
Parameters parsed:
--auxpath : Auxillary jars
--config : Hive configuration directory
--service : Starts specific service/component. cli is default
Parameters used:
HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory
HIVE_OPT : Hive options
For help on a particular service:
./hive --service serviceName --help
Debug help: ./hive --debug --help
需要注意ServiceList:后面的内容,这里提供了几个服务,包括我们绝大多数据时间将要使用的CLI。用户可以通过--servicename服务名称来启用某个服务。
常用SQL
*显示数据库 **
hive>showdatabases;
OK
Default
hive>showdatabaselike'h.';
**创建数据库 **
hive>create database test_test001;
use命令用于将某个数据库设置为用户当前的工作数据库
hive>usetest_test001;
设置当前工作数据库后,即可查询所有表
hive>show tables;
删除数据库
hive>drop database if exists test_test001;
**创建数据 **
create table if no texists mydb.employees(
name string comment 'emplyeename',
Salaryfloat
)
**删除表 **
drop table if exists test_test001;
修改表
alter table只会修改元数据
**表重命名 **
alter table test_test001renametotes;
set hive.cli.print.header=true; // 打印列名
set hive.cli.print.row.to.vertical=true; // 开启行转列功能, 前提必须开启打印列名功能
set hive.cli.print.row.to.vertical.num=1; // 设置每行显示的列数