Spark创建的Hive表在HUE/Hive GUI中不可见的问题求助
问题描述
我用Scala写了这段Spark代码来创建Hive表:
val spark = SparkSession .builder() .appName("self service") .enableHiveSupport() .master("local") .getOrCreate() spark.sql("CREATE TABLE default.TEST_TABLE (C1 INT)")
重复执行代码时会提示表已存在,说明创建是成功的,但在HUE或者Hive GUI里就是看不到这张表。我推测是表的存储路径和HUE使用的路径不一致,想请教下怎么才能让HUE能看到我用代码创建的表?
排查与解决步骤
先对齐Spark和HUE的Hive Metastore
本地运行的Spark默认会用内置的Derby数据库当Metastore,这玩意儿是单进程专属的,只能让当前Spark应用访问,而HUE连接的是集群里共享的Metastore(一般是MySQL/PostgreSQL这类)。两边元数据不互通,HUE自然看不到你创建的表。
解决办法很简单:找到集群里Hive的hive-site.xml配置文件,把它复制到你的Spark安装目录的conf文件夹下(比如$SPARK_HOME/conf/),重启Spark应用后,它就会连接到集群的共享Metastore,之后创建的表元数据会直接同步,HUE刷新页面就能看到。显式指定表的HDFS存储路径
如果Spark默认把表存在本地文件系统,而HUE访问的是HDFS,那肯定看不到。创建表时直接指定和Hive仓库一致的HDFS路径:// 替换成你集群的HDFS地址和Hive默认仓库路径 spark.sql("CREATE TABLE default.TEST_TABLE (C1 INT) LOCATION 'hdfs://namenode:9000/user/hive/warehouse/test_table'")Hive默认的仓库目录一般是
/user/hive/warehouse,把表建在这个目录的子文件夹下就对了。检查权限与元数据同步
确保运行Spark应用的用户有访问集群Metastore的权限,还有写入HDFS对应目录的权限,不然可能表创建成功了但元数据没同步到集群。如果之前用Derby创建过表,这些表的元数据只存在本地,需要重新在集群Metastore下创建。手动刷新Hive元数据
要是已经创建了表但HUE还是看不到,登录Hive客户端执行下面的命令,让Metastore刷新元数据:MSCK REPAIR TABLE default.TEST_TABLE;执行完再去HUE刷新页面,应该就能看到这张表了。
内容的提问来源于stack exchange,提问作者James

