配置单元JDBC客户端引发SQLException
我正在使用JDBC客户端代码连接到配置单元安装。我已经创建了一个测试表,其中有两列(column1、column2)都是字符串类型。当我尝试执行像“select*fromtest”这样的简单查询时,我会在java程序中得到结果,但带有where子句的查询和其他复杂查询会抛出以下异常 查询返回非零代码:1,原因:失败:执行错误,从org.apache.hadoop.hive.ql.exec.MapRedTask返回代码1 我已尝试更改存在文件的hdfs目录/tmp对本地目录的权限,但这不起作用 这是我的连接码配置单元JDBC客户端引发SQLException,jdbc,hadoop,client,hive,sqlexception,Jdbc,Hadoop,Client,Hive,Sqlexception,我正在使用JDBC客户端代码连接到配置单元安装。我已经创建了一个测试表,其中有两列(column1、column2)都是字符串类型。当我尝试执行像“select*fromtest”这样的简单查询时,我会在java程序中得到结果,但带有where子句的查询和其他复杂查询会抛出以下异常 查询返回非零代码:1,原因:失败:执行错误,从org.apache.hadoop.hive.ql.exec.MapRedTask返回代码1 我已尝试更改存在文件的hdfs目录/tmp对本地目录的权限,但这不起作用 这
Connection con = DriverManager.getConnection("jdbc:hive://"+host+":"+port+"/default", "", "");
Statement stmt = con.createStatement();
在executeQuery()方法中抛出错误
检查服务器上的日志会出现以下异常:
java.io.IOException:无法初始化群集。请检查您的配置以获取mapreduce.framework.name和相应的服务器地址。
位于org.apache.hadoop.mapreduce.Cluster.initialize(Cluster.java:121)
位于org.apache.hadoop.mapreduce.Cluster.(Cluster.java:83)
位于org.apache.hadoop.mapreduce.Cluster.(Cluster.java:76)
位于org.apache.hadoop.mapred.JobClient.init(JobClient.java:478)
位于org.apache.hadoop.mapred.JobClient.(JobClient.java:457)
位于org.apache.hadoop.hive.ql.exec.ExecDriver.execute(ExecDriver.java:426)
位于org.apache.hadoop.hive.ql.exec.MapRedTask.execute(MapRedTask.java:138)
位于org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:138)
位于org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:57)
位于org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1374)
位于org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1160)
位于org.apache.hadoop.hive.ql.Driver.run(Driver.java:973)
位于org.apache.hadoop.hive.ql.Driver.run(Driver.java:893)
位于org.apache.hadoop.hive.service.HiveServer$HiveServerHandler.execute(HiveServer.java:198)
位于org.apache.hadoop.hive.service.ThriftHive$Processor$execute.getResult(ThriftHive.java:644)
位于org.apache.hadoop.hive.service.ThriftHive$Processor$execute.getResult(ThriftHive.java:628)
位于org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
位于org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
位于org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:206)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源)
位于java.lang.Thread.run(未知源)
作业提交失败,出现异常“java.io.IOException(无法初始化群集。请检查您的配置以了解mapreduce.framework.name和相应的服务器地址)。”
这些查询在命令提示符下运行,但在JDBC客户机中不运行
我被困在这个问题上了。任何建议都会有帮助
更新
我正在使用cloudera CDH4 hadoop/hive分发版。我运行的脚本如下
#!/bin/bash
HADOOP_HOME=/usr/lib/hadoop/client
HIVE_HOME=/usr/lib/hive
echo -e '1\x01foo' > /tmp/a.txt
echo -e '2\x01bar' >> /tmp/a.txt
HADOOP_CORE={{ls $HADOOP_HOME/hadoop*core*.jar}}
CLASSPATH=.:$HADOOP_CORE:$HIVE_HOME/conf
for i in ${HIVE_HOME}/lib/*.jar ; do
CLASSPATH=$CLASSPATH:$i
done
for i in ${HADOOP_HOME}/*.jar ; do
CLASSPATH=$CLASSPATH:$i
done
java -cp $CLASSPATH com.hive.test.HiveConnect
我把HADOOP_CORE={{ls$HADOOP_HOME/HADOOP-*-CORE.jar}}改为HADOOP_CORE={{ls$HADOOP_HOME/HADOOP*CORE*.jar}因为我的HADOOP_HOME中没有jar文件,从HADOOP开始,到-CORE.jar结束。这是正确的吗?同时运行脚本会产生以下错误
/usr/lib/hadoop/client/hadoop*core*.jar}:没有这样的文件或目录
我还修改了脚本,将hadoop客户端JAR添加到类路径中,因为脚本抛出了hadoop fileReader找不到的错误。因此,我还添加了以下内容。
对于${HADOOP_HOME}/*.jar中的i;做
CLASSPATH=$CLASSPATH:$i
完成
这将执行类文件并运行查询“select*fromtest”,但在“selectcolumn1fromtest”上失败
仍然没有成功,并且出现了相同的错误。由于hive shell运行正常,您能否检查运行hive shell的用户和java程序(使用JDBC)是否相同 接下来,启动Thrift服务器 cd到配置单元所在的位置- 发出以下命令—
bin/hive --service hiveserver &
你应该看到-
正在启动Hive Thrift服务器
确保HiveServer正在运行的一种快速方法是使用netstat命令确定端口10000是否打开并侦听连接:
netstat -nl | grep 10000
tcp 0 0 :::10000 :::* LISTEN
接下来,创建一个名为myhivetest.sh
的文件,并将以下内容放入
并根据您的要求更换HADOOP\u HOME、HIVE\u HOME和软件包。youMainClass-
#!/bin/bash
HADOOP_HOME=/your/path/to/hadoop
HIVE_HOME=/your/path/to/hive
echo -e '1\x01foo' > /tmp/a.txt
echo -e '2\x01bar' >> /tmp/a.txt
HADOOP_CORE={{ls $HADOOP_HOME/hadoop-*-core.jar}}
CLASSPATH=.:$HADOOP_CORE:$HIVE_HOME/conf
for i in ${HIVE_HOME}/lib/*.jar ; do
CLASSPATH=$CLASSPATH:$i
done
java -cp $CLASSPATH package.youMainClass
保存myhivetest.sh
并执行chmod+x myhivetest.sh
。您可以使用/myhivetest.sh
运行bash脚本,它将在调用配置单元程序之前构建类路径
详情请按。
嵌入式模式和独立模式有两种方式。
您应该寻找独立模式
供您参考:
Hive不是一个类似于MySQL、Oracle和Teradata等DBMS的广泛查询引擎。
Hive限制了您可以进行的复杂查询的范围,例如非常复杂的连接等。
Hive在执行查询时运行Hadoop MapReduce作业
支持哪些类型的查询,哪些不支持
希望这有帮助。我也有同样的问题。我已经设法解决了这个问题 当我在设置了/user帐户的hadoop集群上运行hive jdbc客户机时,出现了这个错误。 设置这样的环境后,运行map reduce作业的能力都基于权限 由于连接字符串错误,map reduce框架无法设置临时目录并触发作业 请查看连接字符串[如果hadoop群集设置中出现此错误] 如果连接字符串看起来是这样的
Connection con = DriverManager
.getConnection(
"jdbc:hive2://cluster.xyz.com:10000/default",
"hive", "");
换成
Connection con = DriverManager
.getConnection(
"jdbc:hive2://cluster.xyz.com:10000/default",
"user1", "");
其中,user1是群集设置上的已配置用户