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为例)。