Hive的主要作用是什么?
Hive是基于hadoop的数据仓库工具,可以将结构化的数据文件映射成一张数据表,并且提供sql查询。相当于mapreduce的客户端
配置hive-env.sh都涉及到哪些属性?
1.添加JAVA_HOME路径 JAVA_HOME=/opt/modules/jdk1.7.0_67
2.添加HADOOP_HOME路径 HADOOP_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6/
3.添加HIVE_COF路径 export HIVE_CONF_DIR=/opt/modules/hive-0.13.1-cdh5.3.6/conf
配置hive-site.xml都修改了哪些属性,请写出属性名称并解释该属性。
1.连接数据库的uRL
2.数据库驱动名
3.数据库账户
4.数据库密码
Hive的两个重要参数是什么?
1.hive -e ‘’ 从命令行执行指定的HQL
2.hive -f *.hql 执行hive脚本命令
Hive几种排序的特点
1.order by 全局排序
2.sort by 非全局排序
3.distribute by hash散列分区,常和sort by同时使用。即分区又排序,需要设置mapreduce.job.reduces的个数
4.cluster by 当distribute by 和sort by的字段相同时,等同于cluster by.可以看做特殊的distribute + sort
Sqoop如何导入数据,如何导出数据?
1.将mysql数据导入到hive中。
bin/sqoop import \
--jdbc:mysql//hadoop102:3306/company \
--username root
--password 123456
--table staff
--terminated by '\t'
--m 1
2.用sqoop将hive中的数据导出到hdfs
bin/sqoop export \
--connect jdbc:mysql://hadoop102/test\
--username root \
--password 123456 \
--table employee \
--export-dir /user/hadoop/emp/
hive表关联查询,如何解决数据倾斜的问题?
倾斜原因:
map输出数据按key Hash的分配到reduce中,由于key分布不均匀、业务数据本身的特、建表时考虑不周、等原因造成的reduce 上的数据量差异过大。
1)、key分布不均匀;
2)、业务数据本身的特性;
3)、建表时考虑不周;
4)、某些SQL语句本身就有数据倾斜;
如何避免:对于key为空产生的数据倾斜,可以对其赋予一个随机值。
解决方案
1>.参数调节:
hive.map.aggr = true
hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定位true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个Reduce中),最后完成最终的聚合操作。
2>.SQL 语句调节:
1)、选用join key分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表做join 的时候,数据量相对变小的效果。
从左到右表的大小依次增大
2)、大小表Join:
使用map join让小的维度表(1000 条以下的记录条数)先进内存。在map端完成reduce.
set hive.auto.convert.join = true 表示开启map端优化
4)、大表Join大表:
把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null 值关联不上,处理后并不影响最终结果。
5)、count distinct大量相同特殊值:
count distinct 时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。
Hive文件压缩格式有哪些?压缩效率如何
开启压缩
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set mapred.output.compression.type=BLOCK;
TextFile(压缩方式Bzip2,Gzip压缩后不支持split)
SequenceFile-<key,value> (NONE,RECORD,BLOCK!。Record)
RCFile(存储方式:数据按行分块,每块按列存储。结合了行存储和列存储的优点)
ORCFile
https://blog.csdn.net/wf1982/article/details/7988566
Hive的分组排序(row_number()),组内TopN
select * from(
select g_field,
pv,
row_number() over(partition by g_field order by pv desc) as rn
)where rn <=3;
Hive解析hql转化为MR的执行过程
hive自定义函数
1.写一个类继承(org.apache.hadoop.hive.ql.)UDF
public class IpToNum extends UDF {
public long evaluate(String ip) {
String[] nums = ip.split("\\.");
return Long.parseLong(nums[3]) + Long.parseLong(nums[2]) * 256
+ Long.parseLong(nums[1]) * 65536 + Long.parseLong(nums[0]) * 16777216;
}
}
2.打jar包,提交hive服务器
3.创建函数分为临时函数和永久函数
永久函数,可以制定库
create function test.iptonum as 'com.liam8.hive.IpToNum' using jar 'hdfs:///user/hadoop/hiveUDF/udfs-0.1.jar'
临时函数
create temporary function iptonum as 'com.liam8.hive.IpToNum' using jar 'hdfs:///user/hadoop/hiveUDF/udfs-0.1.jar'
4.使用
select iptonum('127.0.0.1');
hive有哪些保存元数据的方式,有什么特点
1、Single User Mode:
默认安装hive,hive是使用derby内存数据库保存hive的元数据,这样是不可以并发调用hive的,
这种模式时hive默认的存储模式,。
2、Multi User Mode:
通过网络连接到一个数据库中,是最经常使用到的模式。假设使用本机mysql服务器存储元数据。这种存储
方式需要在本地运行一个mysql服务器,并作如下配置(需要将mysql的jar包拷贝到$HIVE_HOME/lib目录下
)。
3、Remote Server Mode:
在服务器端启动一个 MetaStoreServer,客户端利用 Thrift 协议通过 MetaStoreServer 访问元数据
库。