• 沒有找到結果。

kinit Hive业务用户

4.3.6 样例程序指导

功能介绍

本小节介绍了如何使用样例程序完成分析任务。样例程序主要有以下方式。

● 使用JDBC接口提交数据分析任务。

● 使用HCatalog接口提交数据分析任务。

样例代码

● 使用Hive JDBC接口提交数据分析任务,参考样例程序中的JDBCExample.java。

a. 定义HiveQL。HiveQL必须为单条语句,注意HiveQL不能包含“;”。

// 定义HQL,不能包含“;”

String[] sqls = {"CREATE TABLE IF NOT EXISTS employees_info(id INT,name STRING)", "SELECT COUNT(*) FROM employees_info", "DROP TABLE employees_info"};

b. 拼接JDBC URL。

// 拼接JDBC URL

StringBuilder sBuilder = new StringBuilder(

"jdbc:hive2://").append(clientInfo.getZkQuorum()).append("/");

if (isSecurityMode) { // 安全模式

// ZooKeeper登录认证

sBuilder.append(";serviceDiscoveryMode=") .append(clientInfo.getServiceDiscoveryMode())

.append(";zooKeeperNamespace=")

sBuilder.append(";serviceDiscoveryMode=") .append(clientInfo.getServiceDiscoveryMode()) .append(";zooKeeperNamespace=")

.append(clientInfo.getZooKeeperNamespace()) .append(";auth=none");

}String url = sBuilder.toString();

以上是通过ZooKeeper的方式访问Hive。若直连HiveServer的方式访问 Hive,需按如下方式拼接JDBC URL,并将hiveclient.properties文件中的 zk.quorum配置项的端口改为10000。

// 拼接JDBC URL

StringBuilder sBuilder = new StringBuilder(

"jdbc:hive2://").append(clientInfo.getZkQuorum()).append("/");

if (isSecurityMode) { // 安全模式

// ZooKeeper登录认证 sBuilder.append(";sasl.qop=") .append(clientInfo.getSaslQop())

sBuilder.append(";auth=none");

}String url = sBuilder.toString();

注:直连HiveServer时,若当前连接的HiveServer故障则会导致访问Hive失 败;若使用ZooKeeper的访问Hive,只要有任一个HiveServer实例可正常提供 服务即可。因此使用JDBC时建议通过ZooKeeper的方式访问Hive。

c. 加载Hive JDBC驱动。

// 加载Hive JDBC驱动 Class.forName(HIVE_DRIVER);

d. 填写正确的用户名,获取JDBC连接,确认HQL的类型(DDL/DML),调用 对应的接口执行HiveQL,输出查询的列名和结果到控制台,关闭JDBC连接。

Connection connection = null;

try {

// 获取JDBC连接

// 第二个参数需要填写正确的用户名,否则会以匿名用户(anonymous)登录 connection = DriverManager.getConnection(url, "userName", "");

// 建表

// 表建完之后,如果要往表中导数据,可以使用LOAD语句将数据导入表中,比如从HDFS上将 数据导入表:

//load data inpath '/tmp/employees.txt' overwrite into table employees_info;

execDDL(connection,sqls[0]);

System.out.println("Create table success!");

// 查询

execDML(connection,sqls[1]);

// 删表

execDDL(connection,sqls[2]);

System.out.println("Delete table success!");

}

public static void execDDL(Connection connection, String sql) throws SQLException {

PreparedStatement statement = null;

try {

statement = connection.prepareStatement(sql);

statement.execute();

public static void execDML(Connection connection, String sql) throws SQLException { PreparedStatement statement = null;

ResultSet resultSet = null;

ResultSetMetaData resultMetaData = null;

try { // 执行HQL

statement = connection.prepareStatement(sql);

resultSet = statement.executeQuery();

// 输出查询的列名到控制台

resultMetaData = resultSet.getMetaData();

int columnCount = resultMetaData.getColumnCount();

for (int i = 1; i <= columnCount; i++) {

System.out.print(resultMetaData.getColumnLabel(i) + '\t');

}

public static class Map extends

Mapper<LongWritable, HCatRecord, IntWritable, IntWritable> { int age;

@Override

protected void map(

public static class Reduce extends Reducer<IntWritable, IntWritable, IntWritable, HCatRecord> {

@Override

public int run(String[] args) throws Exception {

HiveConf.setLoadMetastoreConfig(true);

Configuration conf = getConf();

@SuppressWarnings("deprecation") Job job = new Job(conf, "GroupByDemo");

HCatInputFormat.setInput(job, dbName, inputTableName);

job.setInputFormatClass(HCatInputFormat.class);

job.setJarByClass(HCatalogExample.class);

job.setMapperClass(Map.class);

job.setReducerClass(Reduce.class);

job.setMapOutputKeyClass(IntWritable.class);

job.setMapOutputValueClass(IntWritable.class);

job.setOutputKeyClass(WritableComparable.class);

job.setOutputValueClass(DefaultHCatRecord.class);

OutputJobInfo outputjobInfo = OutputJobInfo.create(dbName,outputTableName, null);

HCatOutputFormat.setOutput(job, outputjobInfo);

HCatSchema schema = outputjobInfo.getOutputSchema();

HCatOutputFormat.setSchema(job, schema);

job.setOutputFormatClass(HCatOutputFormat.class);

return (job.waitForCompletion(true) ? 0 : 1);

}

public static void main(String[] args) throws Exception { int exitCode = ToolRunner.run(new HCatalogExample(), args);

System.exit(exitCode);

}

4.4 调测程序

4.4.1 在 Windows 中调测程序

4.4.1.1 JDBC 客户端运行及结果查询 JDBC 客户端的命令行形式运行

步骤1 运行样例。

依照准备JDBC客户端开发环境中导入和修改样例后,并从集群的任一Master节点的路 径“/opt/client/Hive/config/hiveclient.properties”下获取“hiveclient.properties”

文件,并放置到样例工程的conf下,即“hive-examples/conf”,即可在开发环境中

(例如Eclipse中),右击“JDBCExample.java”,单击“Run as > Java Application”运行对应的应用程序工程。

说明

使用windows访问MRS集群来操作Hive,有如下两种方式。

● 申请一台windows的ECS访问MRS集群操作Hive,此种方式是通过连接zookeeper动态获取 HiveServer的地址然后来操作Hive,具有高可用性。

● 使用本机访问MRS集群操作Hive,由于本机与MRS集群的网络不通,只能通过直连 HiveServer的方式操作Hive。

方法一:申请一台windows的ECS访问MRS集群操作Hive。在安装开发环境后可直接运行样例代 码。申请ECS访问MRS集群的步骤如下。

1. 在“现有集群”列表中,单击已创建的集群名称。

记录集群的“可用分区”、“虚拟私有云”、“集群控制台地址”,以及Master节点的“默 认安全组”。

2. 在弹性云服务管理控制台,创建一个新的弹性云服务器。

弹性云服务器的“可用分区”、“虚拟私有云”、“安全组”,需要和待访问集群的配置相 同。

选择一个Windows系统的公共镜像。

其他配置参数详细信息,请参见“弹性云服务器 > 快速入门 > 购买并登录Windows弹性云 服务器”

方法二:使用本机访问MRS集群操作Hive。在安装开发环境后并完成以下步骤后再运行样例代 码。

1. 为MRS集群中要使用Hive服务的HiveServer节点绑定弹性公网IP,绑定弹性公网IP步骤如 下。

1. 在虚拟私有云管理控制台,申请一个弹性IP地址,并与弹性云服务器绑定。

具体请参见“虚拟私有云 > 用户指南 > 弹性公网IP > 为弹性云服务器申请和绑定弹性公 网IP”。

2. 为MRS集群开放安全组规则。

在集群Master节点和Core节点的安全组添加安全组规则使弹性云服务器可以访问集群,

若集群为安全集群则需要同时将UDP的21731、21732端口和TCP的21730、21731、

21732及Hive的HiveServer实例端口和ZooKeeper服务的端口添加在安全组的入方向规则 中。请参见“虚拟私有云 > 用户指南 > 安全性 > 安全组 > 添加安全组规则”。

2. 修改导入的“hiveclient.properties”文件,使得“zk.quorum”参数对应于绑定的 HiveServer的弹性公网IP及ZooKeeper端口,并修改样例代码中对连接JDBC时URL的拼接。

详情请参见样例程序指导中直连HiveServer的方式。

3. 修改导入样例的krb5.conf中"kdc","admin_server",“kpasswd_server”,“kdc_listen”,

“kadmind_listen”和“kpasswd_listen”六个参数的ip(单master的集群没有后面三个参数 不必修改),使其对应于KrbServer服务中对应的弹性公网IP(由于普通集群未启用kerberos 功能,可跳过此步骤)。并将修改后的krb5.conf和user.keytab文件放置到样例工程的conf目 录下。

步骤2 查看结果。

查看样例代码中的HiveQL所查询出的结果,运行成功结果会有如下信息。

JDBC客户端运行及结果查看。

Create table success!

_c00

Delete table success!

----结束

4.4.2 在 Linux 中调测程序

4.4.2.1 JDBC 客户端运行及结果查看

步骤1 执行mvn package 打出jar包,在工程目录target目录下获取,比如:hive-examples-1.0.jar。

步骤2 在运行调测环境上创建一个目录作为运行目录,如“/opt/hive_examples”(Linux环 境),并在该目录下创建子目录“conf”。

将步骤1导出的hive-examples-1.0.jar拷贝到“/opt/hive_examples”下。

将客户端下的配置文件拷贝到“conf”下,开启Kerberos认证的安全集群下把从步骤5 获取的user.keytab和krb5.conf拷贝到的/opt/hive_examples/conf下,未开启Kerberos 认证集群可不必拷贝user.keytab和krb5.conf文件。复制${HIVE_HOME}/../config/

hiveclient.properties文件到/opt/hive_examples/conf目录下。

cd /opt/hive_examples/conf

cp /opt/client/Hive/config/hiveclient.properties .

步骤3 准备样例程序相关依赖jar包。

在调测环境上创建一个目录作为存放依赖jar包的目录,如"/opt/hive_examples/

lib"(Linux环境),将${HIVE_HOME}/lib/下面的包全部复制到该目录下,然后删除里面 的derby-10.10.2.0.jar(jar包版本号以实际为准)。

mkdir /opt/hive_examples/lib

cp ${HIVE_HOME}/lib/* /opt/hive_examples/lib rm -f /opt/hive_examples/lib/derby-10.10.2.0.jar

步骤4 在Linux环境下执行如下命令运行样例程序。

chmod +x /opt/hive_examples -R cd /opt/hive_examples

source /opt/client/bigdata_env

java -cp .:hive-examples-1.0.jar:/opt/hive_examples/conf:/opt/hive_examples/lib/*:/opt/client/HDFS/

hadoop/lib/* com.huawei.bigdata.hive.example.ExampleMain

步骤5 在命令行终端查看样例代码中的HiveQL所查询出的结果。

Linux环境运行成功结果会有如下信息。

Create table success!

_c00

Delete table success!

----结束

4.4.2.2 HCatalog 运行及结果查看

步骤1 执行mvn package 打出jar包,在工程目录target目录下获取,比如: hive-examples-1.0.jar。

步骤2 将上一步生成的hive-examples-1.0.jar上传至运行调测环境的指定路径,例如“/opt/

hive_examples”,记作$HCAT_CLIENT,并确保已经安装好客户端。

export HCAT_CLIENT=/opt/hive_examples/

步骤3 执行以下命令用于配置环境变量信息(以客户端安装路径为/opt/client为例)。