前言:遇到困难,旁边有大佬一定要问!!!(当然,如果觉得自己能解决就自己解决吧!!!)你怎么也解决不了的问题,在别人看来只是看一眼就能解决的问题!一个小问题卡了一天,还好在中秋前一天解决了,能够过一个快乐的中秋节了!!!祝大家中秋节快乐,都吃上好吃的大月饼!!!
进入正题: 需求:通过Spark消费Kafka的数据并进行处理,将用户的行为数据和基本信息数据分类,使用Hudi存储并同步Hive表,生成两张表。
报错情况
执行代码,报出如下错误:
Exception in thread "main" org.apache.spark.sql.streaming.StreamingQueryException: Cannot create hive connection jdbc:hive2://192.168.109.101:10000/
=== Streaming Query ===
Identifier: [id = 454bfb83-c6a7-4f3e-88f1-4cf18a631c61, runId = e0300265-62bf-4795-8ea1-ad1025477296]
Current Committed Offsets: {KafkaV2[Subscribe[news]]: {"news":{"2":316,"1":308,"0":268}}}
Current Available Offsets: {KafkaV2[Subscribe[news]]: {"news":{"2":316,"1":309,"0":268}}}
org.apache.spark.sql.streaming.StreamingQueryException: Cannot create hive connection jdbc:hive2: //192.168.109.101:10000/😦
乍一看,就是不能远程连接hive,它确实也就是不能连接。
思路一
首先
,考虑不能连接是否节点没开启,所以 开启hive元数据
hive --service matestore &
开启远程连接hiveserver2
hive --service hiveserver2
或直接
hiveserver2
再次打开一个虚拟机界面 jps 检查节点是否开启。
第二步
(其他博主那里借鉴的一点解决思路),检查pom 文件中的依赖,看hive-jdbc 版本是否匹配 检查resources 下的.xml 文件,是否配置齐全
第三步
,检查参数是否配置正确(如下图所示)
以上三步(启动节点、检查配置文件、检查启动参数)都没问题了,再次执行代码,结果还是不能连接; 既然这样连不上,换个方式连接试试。
思路二
(步骤如下图) 在项目右边点击Database 连接到hive ,看是否能够建立连接 点击+ 号 选择Data Source ,再选择Apache Hive
这里填写连接信息,Name填写随意,Host填写IP地址,User和Password根据自己设定的填写,端口默认10000,最后点击Test Connection 测试能否连接到hive,这里结果显示能够连上,同时这里也会显示Hive JDBC的版本。 做到这里,我就纳闷了,难道是代码有问题?继而检查代码,最后也没发现啥问题… 最后的最后,只能报最后的希望寄托到老师身上,当然老师也从没让人失望,看了一眼报错就判断出了问题所在。
问题所在
报错信息太多没仔细看后面的一长串,下面是详细问题描述:
Required field ‘serverProtocolVersion’ is unset!
[*org.apache.hive.service.cli.HiveSQLException:Failed to open new session:
org.apache.hadoop.security.AccessControlException: Permission denied: user=hive, access=EXECUTE, inode=“/tmp”:root:supergroup:dr–r–r–
Caused by: java.sql.SQLException: Could not open client transport with JDBC Uri: jdbc:hive2://192.168.109.101:10000: Could not establish connection to jdbc:hive2://192.168.109.101:10000: Required field 'serverProtocolVersion' is unset! Struct:TOpenSessionResp(status:TStatus(statusCode:ERROR_STATUS, infoMessages:[*org.apache.hive.service.cli.HiveSQLException:Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.security.AccessControlException: Permission denied: user=hive, access=EXECUTE, inode="/tmp":root:supergroup:dr--r--r--
Caused by: java.sql.SQLException: Could not establish connection to jdbc:hive2://192.168.109.101:10000: Required field 'serverProtocolVersion' is unset! Struct:TOpenSessionResp(status:TStatus(statusCode:ERROR_STATUS, infoMessages:[*org.apache.hive.service.cli.HiveSQLException:Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.security.AccessControlException: Permission denied: user=hive, access=EXECUTE, inode="/tmp":root:supergroup:dr--r--r--
总而言之,言而总之,就是HDFS中的文件权限不够。所以,困了我一天的问题,就是这么一个不起眼的小问题:( 操作:
hdfs dfs -chmod 777 /tmp
再次执行代码,不出意外的成功运行,进入hive,查询库、表、数据,数据成功落地!!! 谨以此篇,警醒自己认真分析报错信息(可能还是解决不了…)
|