操作Hive可以直接通过hive命令进入Hive client直接连接HDFS、Yarn进行数据分析以及处理,但是这种方式既不安全也不规范。因此,才有了Beeline,Beeline需要提前与ThriftServer连接,然后进行安全验证,间接的与HDFS、Yarn建立连接,实现解耦。
由于Beeline默认链接hiveserver2的时候也不需要用户名、密码,因此默认方式也是不安全的,但是我们可以设置hiveserver2用户名、密码。
在hive-site.xml配置文件中设置用户名、密码:
hive.server2.authentication
CUSTOM
hive.jdbc_passwd.auth.zhangsan
123456789
hive.server2.custom.authentication.class
com.hpe.hive.authoriz.UserPasswdAuth
用户自定义代码进行登录验证:
package com.hpe.hive.authoriz;
import javax.security.sasl.AuthenticationException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hive.service.auth.PasswdAuthenticationProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserPasswdAuth implements PasswdAuthenticationProvider {
Logger logger = LoggerFactory.getLogger(UserPasswdAuth.class);
private static final String USER_PASSWD_AUTH_PREFIX = "hive.jdbc_passwd.auth.%s";
private Configuration conf = null;
@Override
public void Authenticate(String userName, String passwd) throws AuthenticationException {
logger.info("user: " + userName + " try login.");
String passwdConf = getConf().get(String.format(USER_PASSWD_AUTH_PREFIX, userName));
if (passwdConf == null) {
String message = "沒有发现密码 " + userName;
logger.info(message);
throw new AuthenticationException(message);
}
if (!passwd.equals(passwdConf)) {
String message = "用户名密码不匹配" + userName;
throw new AuthenticationException(message);
}
}
public Configuration getConf() {
if (conf == null) {
this.conf = new Configuration(new HiveConf());
}
return conf;
}
public void setConf(Configuration conf) {
this.conf = conf;
}
}
链接Beenline的两种方式:
第一种链接方式:
./beeline -u jdbc:hive2://node01:10000/test -n zhangsan -p123456789
第二种链接方式:
./beeline
!connect jdbc:hive2://node01:10000/test
输入用户名
输入密码
JDBC链接Hive与Beenline链接Hive一样,也是链接hiveserver2服务,链接成功才能操作Hive,为了安全JDBC链接Hive的时候也需要用户名和密码。
package com.hpe.hive.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ConnectHive {
public static String driverName = "org.apache.hive.jdbc.HiveDriver";
public static void main(String[] args) {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String url = "jdbc:hive2://node01:10000";
String userName = "zhangsan";
String passwd = "123456789";
Connection conn = null;
try {
conn = DriverManager.getConnection(url, userName, passwd);
Statement statement = conn.createStatement();
String sql = "select * from test.logtbl limit 10";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + "-" + resultSet.getString(2));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
把Hive SQL当作MapReduce来进行优化。但是查询本表字段、对本表字段进行过滤的SQL语句不会转化成MapReduce来执行。
Hive运行方式:
set hive.exec.mode.local.auto=true;
但是得满足以下条件才能使用本地模式:
set hive.exec.parallel=true;
set hive.mapred.mode=strict;
开启严格模式distribute by column sort by column asc|desc
来进行指定排序。Map joinset hive.auto.convert.join = true;
该参数为true时,Hive自动对左边的表统计数据量,如果是小表就加入内存,即对小表使用Map join相关配置参数:
设置combinerset hive.map.aggr=true;
开启在Map端额聚合。
相关的配置参数:
Map数量相关的参数:
Reduce数量相关的参数
适用场景:
1、小文件个数过多
2、task个数过多
通过set mapred.job.reuse.jvm.num.tasks=n;
来设置(n为task插槽个数)
缺点:
设置开启之后,task插槽会一直占用资源,不论是否有task运行,直到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源。