同事说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二张表,
三,意外收获
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