hadoop hive 创建表的坑

张映 发表于 2019-02-25

分类目录: hadoop/spark/scala

标签:, , ,

同事说spark-sql插入不了数据,读取数据可以。写会报以下错误

2019-02-20 19:12:40 INFO audit:371 - ugi=root ip=unknown-ip-addr cmd=get_table : db=dataall tbl=track_pc
Error in query: java.lang.IllegalArgumentException: Wrong FS: hdfs://aaaaa:9000/user/hive/warehouse/dataall.db/track_pc/.hive-staging_hive_2019-02-20_19-12-39_656_7771985312772642109-1/-ext-10000/part-00000-53761c78-6e3b-47e0-b203-57fba5f90856-c000, expected: hdfs://bbbbb;

hive读取数据,插入数据都可以。

一,问题分析

错误提示也很清楚了,hdfs地址不对。期望的是hdfs://bbbbb,而实际的是hdfs://aaaaa:9000

1,hdfs的配置检查,做了ha后,也不会在使用带端口的hdfs,应当不是这块问题

2,检查spark的配置文件,使用hdfs的地方,也使用了ha,应当不是这块问题

3,无意间看了看元数据,发现数据库里面竟然有hdfs://aaaaa:9000, 这些属于配置,放到数据库里面无语哦。配置的改动,数据库并不会根着变动。

二,解决办法有二

1,使用metatool,这是hive自带工具(官方推荐,本人没有实验成功)

# metatool -updateLocation hdfs://aaaaa:9000/ hdfs://bbbbb/  //更换
# metatool -listFSRoot  //查看

如果通过更新操作,出现以下内容,说明更新成功,不然不成功。

# metatool -listFSRoot
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/bigdata/hive/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/bigdata/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Initializing HiveMetaTool..
Listing FS Roots..
hdfs://bbbbb/user/hive/warehouse
hdfs://bbbbb/user/hive/warehouse/dataall.db

我用的是hive2.3.4 bin版的,安装方法参考:hive mysql 安装配置

2,直接修改元数据库

要改DBS和SDS二张表,

元数据库表dbs修改

元数据库表dbs修改

元数据库sds修改

元数据库sds修改

三,意外收获

namenode做ha,请参考:zookeeper hadoop 集群 安装配置,如果active的namenode发生宕机时,调度的任务会切换到ha的其他节点。整个yarn的调度任务,以及hdfs的存储任务是不会受影响的。

但是只要hdfs://aaaaa:9000,这台机器由active转变成standby后,hive和spark根本连不上去,直接报,READ is not supported in state standby

这个问题,在元数据库改过以后,就在也没发生过

其实还有一种解决办法就是,让hdfs://aaaaa:9000,一直active,如果这样,HA就失去它的价值了。



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/hadoop/2057.html