Hive

123 阅读5分钟

Hive表关联查询,如何解决数据倾斜的问题?

倾斜原因:

  • map输出数据按照key Hash的分配到reduce中,由于key分布不均匀,业务数据本身的特点、建表时考虑不周等 原因造成的reduce上的数据量差异过大。
  1. key 分布不均匀
  2. 业务数据本身的特性
  3. 建表时考虑不周
  4. 某些SQL语句本身就有数据倾斜

解决方案:
参数调节:
hive.map.aggr=true
hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定为true,生成的查询计划会有两个MR job
第一个MRjob中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Grop By key有可能被分发到不同的Reduce中,从而达到负载君和的目的;
第二个MR job 再根据预处理的数据结果按照Group by key分布到Reduce中(这个过程可以保证相同的Group by key 被分不到同一个Reduce中 ),最后完成最终的聚合操作。 SQL语句调节:

  1. 选用join key 分布最均匀的表作为驱动表。做好列裁剪filter操作,以达到两表做join的时候,数据量相对变小的效果。
  2. 大小表Join: 使用map join让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce
  3. 大表join大表:把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。
  4. count distinct大量相同特殊值
    count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1.如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。

谈一下Hive的特点,hive和RDBMS的区别

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql转换为Mapreduce任务进行运行。可以通过类sql语句可以快速实现简单的mapreduce统计,不必开发专门的Mmapreduce应用,十分适合数仓的统计分析,但是hive不支持实时查询。
hive与关系型数据库的关系

Hive有哪些方式保存元数据,各有哪些特点

1. Single User Mode:默认安装hive,hive是使用derby内存数据库保存hive的元数据,这样是不可以并发调用hive的 2. User Mode:通过网络连接到一个数据库中,是最经常使用到的模式。假设使用本机mysql服务器存储元数据。这种存储方式需要在本地运行一个mysql服务器,可并发调用 3. Remote Server Mode:在服务器启动一个MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer访问元数据库

Hive内部表和外部表的区别

`内部表` 的结构化数据文件位置都位于Hive指定默认的文件路径下,当drop表时,Hive中表的信息连同Hdfs的数据一起 被删除.
`外部表` 的结构化数据文件位置可以位于HDFS任意路径下,但是需要location指定清楚,当drop表时,只会删除Hive中 定义的表的信息,HDFS文件不会被删除
1. 默认创建的表都是管理表,有时也被称为内部表。因为这种表,hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项 hive.metastore.warehouse.dir 所定义的的目录的子目录下。当删除一个管理表时,Hive也会删除这个表的数据。管理表不适合和其他工具共享数据
2. Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息被删除掉

Hive中的压缩格式TextFile、SequenceFile、RCfile、ORCfile

TextFile 默认格式,存储方式为行存储,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip使用(系统自动检查,执行查询时自动解压)但使用这种方式,压缩后不支持split,Hive不会对数据进行切分,从而无法对数据进行并行操作。并且在反序列化的过程中,必须逐个字符判断是不是分割符和行结束符,因此反序列化开销会比SequenceFile高几十倍

SequenceFile

RCFile

ORCFile ORC是列式存储,有多种文件压缩方式,并且有着很高的压缩比。文件是可切分(Split)的。因此,在Hive中使用ORC作为表的文件存储格式,不仅节省HDFS存储资源,查询任务的输入数据量减少,使用的MapTask也就减少了。提供了多种索引,row group index、bloom filter index。ORC可以支持复杂的数据结构(比如Map等)

总结:相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大, 但是具有较好的压缩比和查询响应。 数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明 显的优势 企业中hive常用的数据存储格式是ORC格式,数据压缩格式是snappy

Hive的函数:UDF、UDAF、UDTF

UDF:单行进入,单行输出目录里的一个文件 UDAF:多行进入,单行输出 聚合函数,多进一出(User-Defined Aggregation Function) UDTF:单行输入,多行输出 (Table-Generating Functions)

Hive桶表

桶表是对数据进行哈希取值,然后放到不同文件中存储 数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。物理上,每个桶就是表(或分区),一个作业产生的桶(输出文件)