设为首页 加入收藏

TOP

Hive常用命令及其环境搭建|Hive优化
2019-04-14 13:04:55 】 浏览:122
Tags:Hive 常用 命令 及其 环境 搭建 优化

Hive

官网 http://hive.apache.org/

基本概念

  • 数据仓库(历史数据,用于计算分析)
  • 解释器、编译器、优化器等(将sql转换为MR,提交给Hadoop集群)。
  • hive运行时,元数据(表、库、字段、属性)存储在关系型数据库(在线数据,交互式)里面,数据存储在HDFS里面

架构图

hive架构图
在这里插入图片描述

HIVE 搭建模式

  • local (测试/但不推荐)Derby数据库(自带)
  • 单用户模式 Mysql
  • 多用户/远程服务器模式(MetaStore Server)

单用户模式

  1. 安装mysql
    yum install mysql-server -y
  2. 启动服务
    service mysqld start
  3. 设置开机启动
    chkconfig mysqld on
    查看开机启动列表
    chkconfig mysql --list
  4. 通过mysql命令连接数据库
    mysql 连接成功
  5. 登录权限控制
    show databases;
    use mysql;
    show tables;
    desc user;
    select host, user, password from user;
    GRANT ALL PRIVILEGES ON \*.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
    delete from user where host != '%';
    flush privileges;
    quit;
  6. mysql -u root -p 123 登录验证
1.上传安装包
	sz -e 
2.解压
	tzr -zxvf apache-hive-2.1.1-bin.tar.gz /usr/local/software/
3.配置环境变量
	vim /etc/profile
	export HIVE_HOME=/usr/local/software/apache-hive-2.1.1
	PATH=$HIVE_HOME/bin
	:wq
	source /etc/profile
4.配置文件修改
	cp hive-default.xml.template hive-site.xml
	vim hive-site.xml
	//删除默认的配置
	:.,$-1d
	
	//更改配置hive-site.xml
	<property>
		<name>hive.metastore.warehouse.dir</name>
		<value>/user/hive_remote/warehouse</value>
	</property>
		<property>
		<name>hive.metastore.local</name>
		<value>true</value>
	</property>
	<property>
	  <name>javax.jdo.option.ConnectionURL</name>
	  <value>jdbc:mysql://node1/hive</value>
	</property>
	<property>
	  <name>javax.jdo.option.ConnectionDriverName</name>
	  <value>com.mysql.jdbc.Driver</value>
	</property>
	<property>
	  <name>javax.jdo.option.ConnectionUserName</name>
	  <value>username</value>
	</property>
	<property>
	  <name>javax.jdo.option.ConnectionPassword</name>
	  <value>pwd</value>
	</property>

	//上传jar包 mysql-connector-java-5.1.6.jar
	/usr/local/software/apache-hive-2.1.1/lib

	//jline 需要更改hadoop 中jline 低版本为高版本
	//路径
	/usr/local/software/hadoop-2.6.0/share/hadoop/yarn/lib
	

	//启动验证
	hive


多用户模式

	1.分发服务端到其他节点,然后更改配置
	<property>
	    <name>hive.metastore.local</name>
	    <value>false</value>
	</property>
	<property>
	    <name>hive.metastore.warehouse.dir</name>
	    <value>/user/hive_remote/warehouse</value>
	</property>
	<property>
	    <name>hive.metastore.uris</name>
	    <value>thrift://node1:9083</value>
	</property>

	2. 启动服务端
		hive --service metasore
		后台启动
		hive --service metasore & > hive.log
		客户端直接
		hive
		
		ss -nal 
		查看9083

Hive SQL

DDL

官方文档 http://hive.apache.org/

1. DESC  TBNAME;
2. DESC FORMATTED + TBNAME;
3. SHOW CREATE TABLE + TBNAME ;
4. hive 建表外部指定 Location(EXTERNAL TABLE,删除表 (DROP TABLE + TBNAME) 只是删除了元数据,但数据并不删除。
5. 分区:PARTITIONED BY (col_name data_type [COMMENT col_comment], ...) 根据col_name 建不通的子目录进行管理。
	- 分区字段不能在建表的字段里面;
	- 分区字段太多、粒度太细不易维护;
6. 修改增加分区
ALTER TABLE page_view ADD PARTITION (dt='2008-08-08', country='us') location '/path/to/us/part080808'
                          PARTITION (dt='2008-08-09', country='us') location '/path/to/us/part080809';

7.设置动态分区
set hive.exec.dynamic.partition.mode=nonstrict;	

beeline> set hive.exec.dynamic.partition.mode=nonstrict;
beeline> FROM page_view_stg pvs
      INSERT OVERWRITE TABLE page_view PARTITION(dt, country)
             SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip,
                    from_unixtimestamp(pvs.viewTime, 'yyyy-MM-dd') ds, pvs.country
             DISTRIBUTE BY ds, country;



8.行转列 可以用case a when 'b' then c end as ...




DML

1.LOAD DATA LOCAL INPATH 'filepath' INTO TABLE tab1 partition(month='10',....);





TIPS

1.hive后台运行-->并将结果写入到本地文件 
> vim hive_shell.sh 
`hive [-S] -e "select * from tb_name where col_name = 'x' " > ./localresult`

> sh hive_shell.sh

2.hive后台运行 -->并将结果写入到本地文件2
> vim exer.sql
`select * from student where sex = '男';
 select count(*) from student;`
> hive -f exer.sql  > ./output.txt

3.hive后台运行 -->并将结果写入到本地文件3
	将结果写入到hdfs 中
	-[-S] 静默输出
	-e exec
	-i 执行完进入hive
	[hvie> source ***.sql 在hive客户端执行linux上的sql文件]
4.explain + sql 

5.UDF 开发
 - 继承UDF
 - 开发程序,打包上传到指定机器
 - hive> add jar /usr/.../udf.jar
 - create tmporary tmp_fun as 'com.***.***'
 - hive> select tmp_fun(col_) from tb_name;

6.加载数据
	insert into 会执行mr操作,慢
	load data [local] inpath '' into table 快,但是会将数据加载(移动)到同一目录
	from tb_name insert into ...7.创建表(表结构) create table tb_name1 like tb_name;

8.分区:提高查询效率,将不同的数据文件存放到不同的目录,检索查询时可以查询部分目录

9.select explode(split(word,'')) from wc

10.分桶(适用于抽样)







word count
在这里插入图片描述

hive 优化

1.核心思想: 将Hive Sql 当成MR 程序进行优化
 	tips:select不会转换成MR 程序执行
 		 where 仅对本表字段做条件过滤

2.Explain [Extended]+ sql 显示执行计划
	
3.参数
set hive.exec.local.auto=true; --开启本地计算

set hive.exec.parallel=true; --开启并行计算

set hive.exec.parallel.thread.number=10; -- 并行计算的数量

set hive.mapred.mode=true; --严格模式(生产环境不开启)
hive> hive.mapred.mode=nonstrict
	-- 对于分区表,必须添加where 对于分区字段的限制
	-- order by 语句必须包含limit 限制输出条数
	-- 限制执行笛卡尔积的查询
4. hvie join 
	join 计算时,将小标放在join的左边
	Map join: 在Map端完成jion,
		- 1.Sql方式:在Sql语句中添加MapJoin标记(mapjoin hint)
		语法:参考文章 [https://www.cnblogs.com/raymoc/p/5323824.html](https://www.cnblogs.com/raymoc/p/5323824.html)
		- 2.开启自动的MapJoin

5. Map-Side聚合:
	set hive.map.aggr=true;
	相关参数配置:
		hive.groupby.mapaggr.checkinterval;
		-map端聚合时处理的数据行数(默认:100000)
		hive.map.aggr.hash.min.reduction;
		-进行聚合的最小比例,(预先对100000行数据做聚合,如果聚合之后的数据/100000大于0.5,则不会聚合)
		hive.groupby.skewindata;
		- 是否对group by之后的数据倾斜做优化,默认false;

6. 控制hive中的M & R 的数量
	Map数量相关参数
		mapred.max.split.size
		mapred.max.split.size=256000000
		-- 一个split的最大值,即每个map处理文件的最大值
		set mapred.min.split.size.per.node=1;
		-- 一个节点上split的最小值
		set mapred.min.split.size.per.rack=1;
		-- 一个机架上split的最小值
	Reduce数量相关参数
		mapred.reduce.tasks=-1;
		-- 强制指定reduce任务的数量
		
7. JVM重用
	1)小文件过多
	2)task过多

	通过设置 set mapred.job.reuse.jvm.num.tasks=n (taks的插槽个数) 来设置
	
	缺点:插槽个数设置后,会一直占用资源,知道所有的tasks都执行完即整个job执行完才会释放






-- loading

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Hive常见问题汇总 下一篇Exception in thread "main&..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目