调优时,相应的参数配置
修改配置文件
原始数据,动态分区
设置两个参数,支持动态分区、非严格模式
分区:把数据文件导入到不同目录里去
Hive 参数、变量
命名空间 | 读写权限 | 含义 |
---|---|---|
hiveconf | 可读写 | hive-site.xml 当中的各配置变量 例: hive --hiveconf hive.cli.print.header=true |
system | 可读写 | 系统变量,包含JVM运行参数等 例: system:user.name=root |
env | 只读 | 环境变量 例: env:JAVA_HOME |
hivevar | 可读写 | 例:hive -d val=key |
hive当中的参数
、变量
,都是以命名空间
开头
通过${}
方式进行引用,其中system
、env
下的变量必须以前缀开头
Hive 参数设置方式
1、修改配置文件 ${HIVE_HOME}/conf/hive-site.xml
2、启动hive cli
时,通过--hiveconf key=value
的方式进行设置
例:hive --hiveconf hive.cli.print.header=true
3、进入cli之后,通过使用set命令设置、查询(当前会话有效)
set设置:
set hive.cli.print.header=true;
set查看
set hive.cli.print.header
hive参数初始化配置,启动客户端默认加载
当前用户家目录下的.hiverc文件
如: ~/.hiverc
配置:set hive.cli.print.header=true
如果没有,可直接创建该文件(vi .hiverc),将需要设置的参数写到该文件中,hive启动运行时,会加载改文件中的配置。
hive历史操作命令集
~/.hivehistory
动态分区
LOAD数据时,把数据导入到不同目录下;
录数据时,不需要指定分区,所有数据都在原始表里放着!
开启支持动态分区
set hive.exec.dynamic.partition=true;
默认:false
set hive.exec.dynamic.partition.mode=nonstrict;
非严格模式
- 默认:strict
(至少有一个分区列是静态分区)
原始表,加载数据
hive> create table psn21(
id int,
name string,
age int,
sex string,
likes array,
address map
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
hive> load data local inpath '/root/psn21.data' into table psn21;
动态分区,插入数据
hive> create table psn22(
id int,
name string,
likes array,
address map
)
partitioned by(age int, sex string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
hive> from psn21
insert overwrite table psn22 partition(age, sex)
select id, name, likes, address, age, sex distribute by age, sex;
后面是分区字段,在psn22中也是在后面
插入数据,执行MapReduce任务
Loading data to table default.psn22 partition (age=null, sex=null)
Time taken for load dynamic partitions : 856
Loading partition {age=20, sex=boy}
Loading partition {age=10, sex=boy}
Loading partition {age=20, sex=man}
Loading partition {age=10, sex=man}
Time taken for adding to write entity : 8
Partition default.psn22{age=10, sex=boy} stats: [numFiles=1, numRows=3, totalSize=168, rawDataSize=165]
Partition default.psn22{age=10, sex=man} stats: [numFiles=1, numRows=2, totalSize=112, rawDataSize=110]
Partition default.psn22{age=20, sex=boy} stats: [numFiles=1, numRows=3, totalSize=167, rawDataSize=164]
Partition default.psn22{age=20, sex=man} stats: [numFiles=1, numRows=1, totalSize=51, rawDataSize=50]
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 3.26 sec HDFS Read: 8861 HDFS Write: 726 SUCCESS
Total MapReduce CPU Time Spent: 3 seconds 260 msec
OK
id name likes address age sex
Time taken: 46.652 seconds
hive>
[root@node005 ~]# hdfs dfs -cat /user/hive/warehouse/psn22/age=10/sex=boy/*
9,小明9,lol-book-movie,shenzhen:luohu-shanghai:pudong
8,小明8,lol-book-movie,shenzhen:luohu-shanghai:pudong
1,小明1,lol-book-movie,shenzhen:luohu-shanghai:pudong
相关参数
set hive.exec.max.dynamic.partitions.pernode;
- 每一个执行mr节点上,允许创建的动态分区的最大数量(100)
set hive.exec.max.dynamic.partitions;
- 所有执行mr节点上,允许创建的所有动态分区的最大数量(1000)
set hive.exec.max.created.files;
- 所有的mr job允许创建的文件的最大数量(100000)
数据文件
1,小明1,10,boy,lol-book-movie,shenzhen:luohu-shanghai:pudong
2,小明2,10,man,lol-book-movie,shenzhen:luohu-shanghai:pudong
3,小明3,10,man,lol-book-movie,shenzhen:luohu-shanghai:pudong
4,小明4,20,man,lol-movie,shenzhen:luohu-shanghai:pudong
5,小明5,20,boy,lol-book-movie,shenzhen:luohu-shanghai:pudong
6,小明6,20,boy,lol-book-movie,shenzhen:luohu-shanghai:pudong
7,小明7,20,boy,lol-book-game,shenzhen:luohu-shanghai:pudong
8,小明8,10,boy,lol-book-movie,shenzhen:luohu-shanghai:pudong
9,小明9,10,boy,lol-book-movie,shenzhen:luohu-shanghai:pudong
报错:
FAILED: SemanticException [Error 10096]: Dynamic partition strict mode requires at least one static partition co lumn. To turn this off set hive.exec.dynamic.partition.mode=nonstrict
- 设置Hive参数即可
Loading data to table default.psn22 partition (age=null, sex=null)
Failed with exception MetaException(message:For direct MetaStore DB connections, we don't support retries at the client level.)
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
- 正确操作:进入
mysql
的metastore
数据 alter table PARTITIONS convert to character set latin1;
alter table PARTITION_KEYS convert to character set latin1;
- hive导入数据报错 - 知乎
参考资料
Hadoop集群上搭建Hive
Hive建表并加载数据 -
Hive基础之Hive的存储类型
Hive静态分区表&动态分区表 - 瞌睡中的葡萄虎 - 博客园
Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!