直接罗列我碰到的问题和我的处理方式,有更好的方式希望能评论告知,互相成长。
1、取消hive on spark,取消mr,使用hive on tez
(1)hive on spark,hive底层使用hivesql转化成sparksql,调用俩种driver使用spark引擎来查询hive数据。本身没什么问题,但需要注意一定要使用官网推荐的版本依赖,否则会出现不可控问题。例如:用了半年多,突然就卡顿的要死,不是不能查,但慢的要死,还有的可能直接就不能查了。(查看源码入口到调用,起初以为是没有默认yarn模式,后来发现会给client,最后也没找到为啥。。换个官网推荐的版本,就没问题了)
版本依赖官网https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started
(2)取消mr,我觉得没什么说的,大部分公司都基本放弃了mr,因为的确慢,就算有各种调优方式,但内部过程怎么都是无法略过的,刷盘的io就注定要比spark内存慢上一些,这也是为什么spark能得到大众喜爱迅速占有市场的原因。
(3)tez,也是apache下的开源项目,也是走的内存那一套,也是dagGraph,至于为什么用它可以看一下tez官网http://tez.apache.org/index.html
针对这个说一下现在碰到的问题:
①select count(1) ,count(DISTINCT xxx) from xxx group by xxx limit 10;
这条语句在tez上执行就会出现问题,能执行,但结果不是你想要的结果。自己测试一下。
解决:去掉limit就正常了,或者直接换其他框架查询。
②创建表的时候,不可以使用``符号了,使用报错,例如:create table `xxx.xxx`(不可以)
解决: create table xxx.xxx(可以) create table `xxx`.`xxx`(可以)
③ACID事务性,创建表不使用external关键字创建表,默认为内部表,内部表默认具有ACID原子性,也就是不适用hive本身是无法查询的,如图使用spark查询:
暂时没有get到特性带来的便利,可能是更安全一些。
解决:弄外部表就好了,删数据的确麻烦些,但可以直接配置全局变量或者写个脚本来直接删表删数据(友情提示:记得开启hdfs回收站,删错了还有回旋余地)
④创建内部表后,会有一些特别的文件在内部表目录中,可以自己去hdfs上看一下,所以如果你想通过mv到其他位置,在创建外部表加载此表数据的话,不行哦~
⑤好像记得还有个时间戳的sqlapi变了,具体记不起来是哪个了
解决:有替换的
⑥想起来了,hive取消了hiveclient,只能通过beeline使用
解决:配置环境变量,beeline直连不用输入url:10000
补充
⑦CDP的Hive3.1创建的表默认是ORC格式,建表的时候也可以指定其他格式
|
⑧load加载数据
现象:当使用JDBC(HiveServer2使用场景)时,执行语句:load data local inpath '' overwrite into table table_name,导入选中的文件必须存在与HiveServer2节点的本地服务器上,若存在别的服务器上,命令报错;
还有几个,记不起来了,有问题可以直接提。