1

我想使用org.apache.hadoop.hiveMetastore。

hive(1.1) 和 hadoop(2.6 版) 安装在 linux 服务器上。我的电脑有一个windows操作系统。在这里,我正在尝试创建 Hive conf。

import org.apache.hadoop.hive.conf.HiveConf;


    public class Main {
        public static void main(String[] args){

            HiveConf hiveConf = new HiveConf();
            hiveConf.setIntVar(HiveConf.ConfVars.METASTORETHRIFTCONNECTIONRETRIES, 3);
            hiveConf.setVar(HiveConf.ConfVars.METASTOREURIS, "thrift://server:port");

            HiveMetastore hiveMetaStoreConnector = new HiveMetastore(hiveConf);
            if(hiveMetaStoreConnector != null){
                System.out.print(hiveMetaStoreConnector.getAllPartitionInfo("tablename"));
            }
        }
    }

但是我遇到了一个问题HiveConf hiveConf = new HiveConf();

严重:无法在 hadoop 二进制路径中找到 winutils 二进制文件 java.io.IOException:无法在 Hadoop 二进制文件中找到可执行的 null\bin\winutils.exe。在
org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:379) 在
org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:394) 在 org.apache.hadoop.util.Shell.( Shell.java:387) 在
org.apache.hadoop.hive.conf.HiveConf$ConfVars.findHadoopBinary(HiveConf.java:2065)
在 org.apache.hadoop.hive.conf.HiveConf$ConfVars.(HiveConf.java:332 )
在 org.apache.hadoop.hive.conf.HiveConf.(HiveConf.java:95) 在 Main.main(Main.java:11) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.lang.reflect.Method.invoke(Method.java:497) 在 com。 intellij.rt.execution.application.AppMain.main(AppMain.java:144) org.apache.hadoop.hive.conf.HiveConf.(HiveConf.java:95) 处
的线程“main”java.lang.ExceptionInInitializerError 异常
Sun.reflect.NativeMethodAccessorImpl.invoke0 的 Main.main(Main.java:11) (Native Method) sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:62)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java :144) 原因:java.lang.RuntimeException: 无法
在 org.apache.hadoop.hive.shims.ShimLoader.loadShims(ShimLoader.java:86) 的类 null 中加载 shims
在 org.apache.hadoop.hive.shims.ShimLoader.getHadoopShims(ShimLoader.java:62) 在 org.apache.hadoop.hive.conf.HiveConf$ConfVars.(HiveConf.java:335) ... 7 更多: java.lang.NullPointerException at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at org.apache.hadoop.hive.shims.ShimLoader.loadShims(ShimLoader.爪哇:83)... 9更多

我应该在我的 Windows(winutils.exe)上安装 hadoop 客户端吗?还是我应该包含更多库?

另外,我只需要设置 confhiveConf.setVar(HiveConf.ConfVars.METASTOREURIS, "thrift://server:port")吗?

还是与设置smth有关?

任何建议将不胜感激。

4

1 回答 1

0

我不确定你想要实现什么,但你的代码不会在 windows 机器上运行,因为 windows 机器缺少 hadoop 库。我认为不可能在裸机上进行真正的设置。您需要某种 VMware 软件才能让窗口机器作为配置单元客户端工作。

如果您尝试通过程序连接到 hive,您应该尝试使用 Hive API,它公开了JDBC连接到 hive 的方式。

JDBC

HiveServer2 有一个 JDBC 驱动程序。它支持对 HiveServer2 的嵌入式和远程访问。建议将远程 HiveServer2 模式用于生产用途,因为它更安全,并且不需要为用户授予直接 HDFS/元存储访问权限。

HiveServer2 URL 是具有以下语法的字符串:

jdbc:hive2://<host1>:<port1>,<host2>:<port2>/dbName;initFile=<file>;sess_var_list?hive_conf_list#hive_var_list

在哪里

<host1>:<port1>,<host2>:<port2>是要连接的服务器实例或逗号分隔的服务器实例列表(如果启用了动态服务发现)。如果为空,将使用嵌入式服务器。

dbName是初始数据库的名称。

<file>是初始化脚本文件的路径(Hive 2.2.0 及更高版本)。这个脚本文件是用 SQL 语句编写的,连接后会自动执行。此选项可以为空。

sess_var_list是分号分隔key=value的会话变量对列表(例如,user=foo;password=bar)。

hive_conf_listkey=value是此会话的 Hive 配置变量对的分号分隔列表

hive_var_listkey=value是此会话的 Hive 变量对的分号分隔列表。

于 2018-03-20T21:46:47.260 回答