欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hive开荒

程序员文章站 2022-07-02 19:18:56
...

Hive起源

Apache Hive
*,*的百科全书

Apache Hive是一个建立在Hadoop架构之上的数据仓库。它能够提供数据的精炼,查询和分析。Apache Hive起初由Facebook开发,目前也有其他公司使用和开发Apache Hive,例如Netflix等。亚马逊公司也开发了一个定制版本的Apache Hive,亚马逊网络服务包中的Amazon Elastic MapReduce包含了该定制版本。

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析

什么是Hive

  • Facebook开发的解决海量结构化日志的数据统计
  • 基于Hadoop的数据仓库工具 HQL转换成MapReduce程序
    • 使用HQL作为查询接口
    • 使用HDFS存储
    • 使用MapReduce计算
  • 将结构化的数据文件映射成一张表 提供类SQL查询功能
  • 灵活拓展性好 :支持UDF 自定义存储格式
  • 适合做离线数据处理

为什么使用Hive

  • MapReduce开发的不便利性
  • 数据分析 针对DBA SQL语句 对数据分析
  • MapReduce编程成本高

Hive的优点 使用场景

  • 操作接口类SQL 提供快速的开发能力
  • 避免写MR
  • 统一的元数据管理 可与impala/Spark等共享元数据
  • 易拓展(HDFS+MR:可以拓展任意集群规模;支持自定义函数)
  • 数据离线处理;日志分析,海量结构化数据离线分析
  • Hive执行延迟比较大,因此Hive常用与数据分析、对实时性要求不高的场景
  • Hive优势在于处理大数据 小数据没有优势,因为Hive执行延迟比较高

Hive和Hadoop的关系

Hive开荒
Hive架构
Hive开荒

用户接口Client

  • CLi
  • JDBC/ODBC
  • WEBUI

元数据:Metestore

  • 表名
  • 表所属的数据库
  • 表拥有者
  • 列、分区、
  • 表的数据所在目录
    默认的元数据存储在derby数据库中
    推荐使用MySQL存储Metastore

Hive配置安装

首先安装Hadoop
Hadoop分布式安装

Hive安装:
Hive安装配置

安装MySQL

解压tar文件 命令

tar -xvf mysql-5.7.19-1.el7.x86_64.rpm-bundle.tar

卸载冲突的PRM组件

rpm -qa | grep postifix
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
rpm -ev postfix-2.10.1-6.el7.x86_64

安装依赖

yum -y install perl

安装命令

rpm -ivh mysql-community-common-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.19-1.el7.x86_64.rpm

启动数据库

//查看mysql是否启动
service mysqld status

//启动MySQL
service mysqld start

//停止mysql
service mysqld stop

//重启mysql
service mysqld restart

查看临时密码

grep password /var/log/mysqld.log

修改密码
数据库的密码需要满足:

  • 大小写字母
  • 数字
  • 特殊符号
mysql -uroot -p 密码
ALTER USER ‘root’ @ 'localhost' IDENTIFIED BY 'aaa@qq.com' ;

授权远程登录

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT
OPTION;
mysql>FLUSH PRIVILEGES;

基于Mysql

配置hive-site.xml

vi conf/hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>mysql</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.150.1:3306/hive_metadata?
createDatabaseIfNotExsit=true&amp;characterEncoding=UTF-8&amp;verifyServerCerti
ficate=false&amp;useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
</configuration>

上传数据库驱动到lib目录下
初始化schema

bin/schematool -initScherma -dbType mysql

以命令行形式运行hive

vi conf/hvie-site.xml

配置Hive UI客户端

配置链接权限

vi core-site.xml
<property>
<name>hadoop.proxyuser.<username>.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.<username>.hosts</name>
<value>*</value>
</property>

注意: username应与hadoop使⽤的⽤户名⼀致

取消⽤户权限验证(hdfs-site.xml)

<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

Hive基本操作

显示数据库

show database;

使用某个数据库

use dafault;

创建简单表

create table users(uname string,age int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\T';
//ROW FORMAT DELIMITED FIELDS TERMINATED BY '\T' : 指定导入数据的分隔符

导入本地数据到表中

load data local inpath '/opt/datas/users.tst' into table users;

查询表结构

desc users;

简单查询

不使用MR执行操作

select * from users;

执行MR操作

select count(*) from users;
select uname form users;

查看完整的表信息

desc formatted users;

查看所有的内置函数

show function;

查看内置函数的使用方法

//查看upper使用方法
desc function extended upper;

显示查询结果中表头信息
在CLI中 执行

set hive.cli.print.header = true;

或者在hive-site周那个 修改配置属性

<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>

Hive常用交互命令

-e 不进入交互式命令,执行hql语句

bin/hive -e "hql"

-f 执行hql脚本

vi hive,sql

内容 :

select * from users;

执行脚本:

bin/hive -f /opt/datas/hive.sql

或者将执行结果保存在文件中

bin hive -f /opt/datas/hive.sql > /opt/datas/res.txt

Hive常用shell命令

快速执行HDFS文件系统指令

hive > dfs -ls /

Hive详解

数据库相关

创建数据库

CREATE (DATABASE | SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name = property_value,...)];
create databse if not exists sysoa
COMMENT 'OA数据库'
LOCATION '/users/skhive/hive/warehouse/sysoa.db' ;

删除DB

DROB (DATABASE | SCHEMA ) [IF EXISTS] database_name [RESTRICT | CASCADE] ;

若数据库下有表存在,则必须使用CASCADE;

表相关

创建表

create table if not exists myusers
(
	uid string COMMENT '用户id',
	uname string COMMENT '用户名'
)
COMMENT '用户表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' , '
STORED AS TEXTFILE;

导入数据

load data local inpath '/opt/datas/myusers.txt' into table myusers;

第二种方式

create table IF NOT EXISTS myisers2
as select uname myusers;

第三种方式

create table IF NOT EXISTS myusers3
like myusers;

Hive worldcount实例

创建表

hive> create table wordcount(line string);

加载数据

hive> load data inpath '/inputdata/counter.txt' overwirite into table wordcount;

查询文件数据

hive> select * from wordcount;

按照‘ ’分割

select split(line,' ')from wordcount;

大爆炸

select explod(split(line , ' ' ) from wordcount;

explode函数将KEY相同的value存在数组里。这HQL条语句相当于Hadoop中的Map函数。

使用聚合函数count进行统计

select word,count(word) as count from (select explode(split(line, ' ')) as word form  wordcount)group by word;

现在来处理第二条HQL语句:SELECT word,count(1) FROM w GROUP BY word ORDER BY word;
这条语句相当于Hadoop中的reduce函数。聚合函数count

按照词频排列

select word,count(word) as count form (select explode(split(line,' ')) as word from wordcount) group by word order by word;

存储计算结果

create table word_counts as select word,count(word) as count from (select explode(split(line,' ')) as word form wordcount ) group by word order by word;
select * from word_counts;

sougou搜索结果统计

日志上传到hdfs 启动hive

create table sougou (qtime string ,qid string ,qword string ,url string) row format delimited fileds terminated by ',';

加载数据

load data inpath '/sougou.dic' into table sougou;
select count(*) form sougou;
create table sougou_results as select keyword,count(qword)  as count from (select qword as keyword from sougou )  group by keyword order by count desc;