Hive JDBC客户端抛出SQLException

时间:2013-07-06 05:51:44

标签: jdbc hadoop client hive sqlexception

我使用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”中失败。

仍然没有成功和同样的错误。

3 个答案:

答案 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事情。