配置单元jdbc客户端引发sqlexception

pkwftd7m  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(384)

我正在使用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。java:83)在org.apache.hadoop.mapreduce.cluster。java:76)在org.apache.hadoop.mapred.jobclient.init(jobclient。java:478)在org.apache.hadoop.mapred.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(任务。java:138)位于org.apache.hadoop.hive.ql.exec.taskrunner.runsequential(taskrunner)。java:57)在org.apache.hadoop.hive.ql.driver.launchtask(驱动程序。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$处理器$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\u core={{ls$hadoop\u home/hadoop--core.jar}}改为hadoop\u core={ls$hadoop\u home/hadoopcore*.jar},因为我的hadoop\u home中没有以hadoop-开始,以-core.jar结尾的jar文件。是这样吗?同时运行脚本会产生以下错误
/usr/lib/hadoop/client/hadoopcore.jar}:没有这样的文件或目录
我还修改了脚本,将hadoop客户机jar添加到类路径中,因为脚本抛出了hadoop filereader找不到的错误。所以我也添加了以下内容。对于${hadoop\u home}/.jar中的i;do classpath=$classpath:$i完成
这将执行类文件并运行查询“select
fromtest”,但在“selectcolumn1fromtest”上失败。
仍然没有成功和同样的错误。

cpjpxq1n

cpjpxq1n1#

我也有同样的问题。我已经设法解决了这个问题。
当我在hadoop集群上运行配置单元jdbc客户机并设置了/user帐户时,出现了这个错误。在这样的环境中,运行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是集群设置上的已配置用户。

dw1jzc5e

dw1jzc5e2#

由于它在hiveshell中运行得很好,您能检查运行hiveshell的用户和java程序(使用jdbc)是否相同吗?
接下来,启动thrift server 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和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 ,它将在调用配置单元程序之前构建类路径。
请按照这里的说明进行详细说明。有两种方式嵌入式模式和独立模式。您应该寻找独立模式。
供您参考:hive不是一个类似于mysql、oracle和teradata等dbms的广泛查询引擎。hive对您可以进行的复杂查询的范围有限制,如非常复杂的联接等。hive在执行查询时运行hadoop mapreduce作业。
查看本教程以了解支持哪种类型的查询以及不支持哪种类型的查询。
希望这有帮助。

46scxncf

46scxncf3#

我也有类似的问题。我正在尝试使用oracle sql developer查询配置单元(http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html)结合第三方jdbc驱动程序,如下所述:https://blogs.oracle.com/datawarehousing/entry/oracle_sql_developer_data_modeler. 是的,我知道我可以使用hue来实现这一点,但是我与许多其他数据库交互,包括oracle,而且有一个富客户机很好,我可以直接在我的机器上保存sql查询和简单报告。
我正在aws的集群上运行最新版本的cloudera cdh(5.4)。
我能够发出简单的查询,比如“selectfromsample\u07”并接收结果,但是运行“selectcount()fromsample\u07”会抛出一个jdbc错误。我可以通过在hue中创建一个用户,并在oraclesql开发人员连接信息对话框中输入这个用户信息来解决这个问题。完成此操作后,我可以运行这两个查询。
令人困惑的是,我能够运行一个简单的select语句,却没有收到任何错误——我习惯于a)我可以登录系统运行查询,b)我不能。奇怪的是,它“有点”没有正确的用户id工作,但我猜这些奇怪的hadoop的事情之一。

相关问题