我使用JDBC客户端代码连接到配置单元。我创建了一个测试表,其中两列(column1,column2)都是字符串类型。当我尝试执行像“select * from test”这样的简单查询时,我会在java程序中得到结果但是where子句和其他复杂查询的查询会抛出以下异常。
“查询返回非零代码:1,原因:FAILED:执行错误,从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:无法初始化Cluster。请检查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) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source) 在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添加到classpath,因为脚本抛出了找不到hadoop fileReader的错误。所以我也添加了以下内容。 for $ in $ {HADOOP_HOME} / * .jar;做 CLASSPATH = $ CLASSPATH:$ I 完成
这将执行类文件并运行查询“select * from test”,但在“select column1 from test”中失败。
仍然没有成功和同样的错误。
答案 0 :(得分:0)
因为hive shell运行正常,你可以检查运行hive shell的用户和java程序(使用JDBC)是否相同?
接下来,启动Thrift Server cd到蜂巢的地方 - 发出此命令 -
bin/hive --service hiveserver &
你应该看到 -
启动Hive Thrift Server
确保HiveServer正在运行的一种快速方法是使用netstat命令确定端口10,000是否已打开并侦听连接:
netstat -nl | grep 10000
tcp 0 0 :::10000 :::* LISTEN
接下来,创建一个名为myhivetest.sh
的文件并将其放入内部
并根据您的要求替换 HADOOP_HOME , HIVE_HOME 和 package.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脚本,它将在调用您的配置单元程序之前构建您的类路径。
请点击instruction here了解详情。 嵌入模式和独立模式有两种方式。 您应该寻找独立模式。
有关您的信息: Hive不是一个类似于DBMS的广泛查询引擎,如MySQL,Oracle和Teradata等。 Hive对您可以进行的复杂查询的范围有限制,例如非常复杂的连接等。 执行查询时,Hive会运行Hadoop MapReduce作业。
Check this tutorial支持哪种类型的查询,哪些不支持。
希望这有帮助。
答案 1 :(得分:0)
我有同样的问题。我设法解决了这个问题。
当我在设置了/ user帐户的hadoop集群上运行配置单元jdbc客户端时,会弹出此错误。 通过设置这样的环境,运行map-reduce作业的能力都基于权限。
如果连接字符串错误,map-reduce框架无法设置暂存目录并触发该作业。
请查看您的连接字符串[如果在hadoop-cluster设置中弹出此错误]。
如果连接字符串看起来像这样
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是群集设置中的已配置用户。
答案 2 :(得分:0)
我遇到了类似的问题。我正在尝试使用Oracle SQL Developer(http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html)和第三方JDBC驱动程序查询Hive,如下所述:https://blogs.oracle.com/datawarehousing/entry/oracle_sql_developer_data_modeler。是的,我知道我可以使用Hue来做这个,但我与许多其他数据库(包括Oracle)进行交互,拥有一个富客户端,我可以直接在我的机器上保存SQL查询和简单报告。
我在AWS上的群集上运行最新版本的Cloudera CDH(5.4)。
我能够发出简单查询,例如“SELECT * FROM SAMPLE_07”并接收结果,但运行“SELECT COUNT(*)FROM SAMPLE_07”会抛出JDBC错误。我能够通过在Hue中创建用户并在Oracle SQL Developer连接信息对话框中输入此用户信息来解决此问题。完成此操作后,我能够运行两个查询。
令人困惑的是,我能够运行一个简单的SELECT语句并且没有收到错误 - 我习惯的是a)我可以登录系统运行查询或b)我不能。奇怪的是它“有点”在没有正确的用户ID的情况下工作,但我想其中一个奇怪的Hadoop事情。