1

我正在使用 JDBC 客户端代码连接到配置单元安装。我创建了一个包含两列(column1,column2)的测试表,它们都是字符串类型。当我尝试执行像“select * from test”这样的简单查询时,我会在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。

查询在命令提示符下运行时有效,但在 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 中没有以 hadoop- 开头的 jar 文件并以 -core.jar 结尾。这个对吗?运行脚本也会出现以下错误

/usr/lib/hadoop/client/hadoop*core*.jar}}:没有这样的文件或目录

我还修改了脚本以将 hadoop 客户端 jar 添加到类路径,因为脚本抛出了 hadoop fileReader not found 的错误。所以我也添加了以下内容。对于我在 ${HADOOP_HOME}/*.jar 中;做 CLASSPATH=$CLASSPATH:$i 完成

这将执行类文件并运行查询“select * from test”,但在“select column1 from test”上失败。

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

4

3 回答 3

0

我遇到过同样的问题。我已经设法解决了这个问题。

当我在设置了 /user 帐户的 hadoop 集群上运行 hive 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 是集群设置中配置的用户。

于 2013-07-16T17:03:53.980 回答
0

由于它在 hive shell 上运行良好,您能否检查运行 hive shell 的用户和 java 程序(使用 JDBC)是否相同?

接下来,将 Thrift 服务器 cd 启动到 hive 所在的位置 - 发出此命令 -

bin/hive --service hiveserver &

你应该看到 -

启动 Hive Thrift 服务器

确保 HiveServer 正在运行的一种快速方法是使用 netstat 命令来确定端口 10,000 是否打开并侦听连接:

netstat -nl | grep 10000
tcp  0  0 :::10000         :::*          LISTEN

接下来,创建一个名为的文件并将以下内容放入其中并根据您的要求myhivetest.sh替换HADOOP_HOMEHIVE_HOMEpackage.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. 您可以使用 运行 bash 脚本./myhivetest.sh,这将在调用 hive 程序之前构建您的类路径。

请按照此处的说明了解详细信息。有嵌入模式和独立模式两种方式。您应该寻找独立模式。

供您参考: Hive 不是类似于 MySQL、Oracle 和 Teradata 等 DBMS 的广泛查询引擎。Hive 对您可以进行的复杂查询的范围有限制,例如非常复杂的连接等。当您运行 Hadoop MapReduce 作业时,Hive做一个查询。

查看本教程以了解支持哪些类型的查询,哪些不支持。

希望这可以帮助。

于 2013-07-06T07:20:41.373 回答
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 事情之一。

于 2015-05-05T00:37:40.790 回答