近来在做项目中的技术调研,使用最新版的hdp3.1,其中使用spark2.3和hive 3.1.
遇到 一些问题,记录如下:
一,使用spark-sql client driver去访问hive创建的数据库,发现找不到,使用presto访问hive,只能读写外部表。
经过查询资料了解到,hive3.1默认对内部表支持事务和ACID特性,spark等外部工具无法直接读取ACID的表数据,
spark新版本正在跟进,但spark-sql本身也在和hive分离,走自己的路,已经和hive共用一个元数据库,但是使用不同的
catalog,存不同的元数据。
如果想使用spark-sql来处理hive的表数据,则需要做如下调整:
1.在advanced spark2-hive-site-override中配置metastore.catalog.default=hive之后重启spark2 服务,
这样就可以看到hive创建的数据库和表,但是只能访问外部表,无法访问内部表,原因上面已说明。
2.如果想使用presto,spark-sql来访问hive3.1的表,则需要做如下调整,放弃acid和事务特性。
hive.strict.managed.tables=false
hive.create.as.insert.only=false
metastore.create.as.acid=false
这三个属性设置之后,重启hive server2,这样hive 放弃了事务,acid的特性,生成的表数据,spark-sql,presto
就可以读取了。
二,使用kylin生成cube报错,无法修改hive运行时属性xxxxx
* hive.security.authorization.sqlstd.confwhitelist
Kylin在执行作业的时候,需要做一些mapreduce的优化,set xxx=xxx,但报错,显示不能在运行时修改,
经查可以配置这个属性,符合这个java正则的属性可以被修改。