hive 的使用,内外部表的区别,分区作用, UDF 和 Hive 优化
(1)hive的使用:仓库,工具
(2)内部表:加载数据到hive所在的hdfs目录,删除时,元数据文件都删除
外部表:不加载数据到Hive所在的hdfs目录,删除时,只删除表结构
(3)分区作用:防止数据倾斜
(4)UDF函数:用户自定义的函数(主要解决格式,计算问题),需要继承UDF类
class TestUDFHive extends UDF{ public String evalut(String str){ try{ return "hello" + str }catch(Exception e){ return str + "error" } } }
class TestUDFHive extends UDF{ public String evalut(String str){ try{ return "hello" + str }catch(Exception e){ return str + "error" } } }
(5)Hive优化:看做mapreduce处理
排序优化:sort by效率高于order by
分区:使用静态分区(statu_date="20160516",location="beijing"),每个分区对应hdfs上的一个目录,减少job和task数量;
使用表连接操作,解决group by数据倾斜问题
设置hive.groupby.skewindata=true,那么hive会自动负载均衡,叫文件合并成大文件
常用数据导入数据库的方法有哪些?导入到什么数据库?
eg:将Hive统计分析结果导入到MySQL数据库表中——sqoop操作
可以使用flume/FTP/Kettle/DataX。。。
业务量有多大?有多少行数据??
根据业务自行定义。。。。。
hive跟hbase的区别?
共同点:
1.hbase 与 hive 都是架构在hadoop之上的。都是用hadoop作为底层存储
区别:
2.Hive是建立在Hadoop之上为了减少MapReduce Jobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目
3.想想你在操作RMDB数据库,如果全表扫描,就用Hive+Hadoop/Spark/flink,如果是索引访问,就用HBase+Hadoop/Spark/Flink
4.Hive query就是MapReduce jobs可以从5分钟到数小时不止,HBase是非常高效的,肯定比Hive高效的多。
5.Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑。
6.hive是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎通过它来存储索引,方便查询操作
7.hbase是列存储
8.hdfs作为底层存储,hdfs是存放文件的系统,而Hbase负责组织文件
9.hive需要到hdfs存储文件,需要用到MapReduce计算框架
Hive有哪些方式存储元数据,各有哪些有点?
三种:内存数据库 derby—小,不常用。
本地mysql/常用远程段Mysql
Hive内部表与外部表的区别
Hive创建内部表时,会将数据移动到数据仓库指向的路径,若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据,这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。。
Hive底层与数据库交互原理
hive有一套自己的sql解析引擎,称作 metastore ,存储在mysql或者derby数据库中,可以将sql语句转化为mapreducejob任务执行
Hive如何调优
- 底层是MapReduce,所以可以说是MapReduce优化
- 小文件合并成大文件
- Reduce数据在代码中介于节点数*reduceTask的最大数量的0.95倍到1.75倍
- 写一个UDF函数,在建表的时候制定好分区
- 配置文件中,打开在 map 端的合并
- 在库表设计的时候,尽量考虑rowkey 和 columnfamily的特性
- 进行hbase集群的调优(参考hbase调优)
Hive中德meta store用来做什么的?
metastore是一套映射工具,将sql语句转换成对应的job任务区进行执行