The Apache Hive ™ 数据仓库软件使用SQL,方便读取、写入和管理驻留在分布式存储中的大型数据集。结构可以投影到已经存储的数据上。提供了一个命令行工具和JDBC驱动程序来将用户连接到Hive。我们都知道,Hive作为数据仓库工具,传统文件数据处理大都是搭配Hadoop使用。此处将描述如何搭配Alluxio内存加速使用,让你的批处理任务速度飞起来。
本节将使用apache-hive-3.1.2与alluxio2.3|2.4结合,验证数仓功能使用。
1.Hive部署
1.1.前期准备
先下载Hive-3.2.1版本,如果你需要在Hadoop MapReduce上运行Hive(简单使用时,可以不安装hadoop),hive安装只需要在hadoop的master节点安装即可。当然也可以使用Spark SQL作为处理引擎,有关这部分将在后续章节呈现。
1.2.配置Hive
添加以下配置项到你的Hive安装目下的conf目录里的hive-env.sh文件中:
export HIVE_CONF_DIR=/appuser/apache-hive-3.1.2/conf
export HADOOP_HOME=/appuser/hadoop-3.2.1 #指向hadoop安装目录,简单使用时可不安装
#Alluxio客户端jar可以在/<PATH_TO_ALLUXIO>/client/alluxio-2.3.0-client.jar找到。
#在shell或conf/hive-env.sh中设置HIVE_AUX_JARS_PATH:
export HIVE_AUX_JARS_PATH=export HIVE_AUX_JARS_PATH=/<PATH_TO_ALLUXIO>/client/alluxio-2.3.0-client.jar:${HIVE_AUX_JARS_PATH}
添加以下配置项到你的Hive安装目下的conf目录里的hive-site.xml文件中:
1.3.Alluxio作为默认文件系统
Apache Hive使用Alluxio,只需通过一个一般的文件系统接口来替换Hadoop文件系统使用Alluxio。在这种方式下,Hive使用Alluxio作为其默认文件系统,可将它的元数据和中间结果都将存储在Alluxio上。
1.3.1.配置hive-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>alluxio://master_hostname:19998</value>
</property>
<!-- hive处理alluxio文件输出路径 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- hive 元数据存储配置为mysql -->
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://mysql_hostname:3306/hive_meta?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai</value>
<description>The JDBC connection URL.</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
<description>Drive class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hiveuser</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hivepwd123</value>
</property>
<property>
<name>alluxio.user.file.writetype.default</name>
<value>ASYNC_THROUGH</value>
<description />
</property>
</configuration>
1.3.2.guava版本一致性
在/appuser/apache-hive-3.1.2/lib与/appuser/hadoop-3.2.1/share/hadoop/common/lib目录,要保证guava jar包版本一致,如果不一致,使用高版本替代低版本。
1.3.3.alluxio创建目录和授权
在Alluxio中为Hive创建相应数据处理输出目录:
./bin/alluxio fs mkdir /tmp
./bin/alluxio fs mkdir /user/hive/warehouse
./bin/alluxio fs chmod 775 /tmp
./bin/alluxio fs chmod 775 /user/hive/warehouse
1.4.hive启动
1.4.1.初始化元数据
此处,mysql数据库使用8.1版本,执行如下命令初始化hive元数据;
./schematool -dbType mysql -initSchema --verbose
1.4.2.启用服务
执行hive服务启动命令:./hive --service metastore &
进入控制台命令:./hive
验证是否启动成功:
hive> show databases
Time taken:0.026 seconds,Fetched:1 row(s)
1.5.使用
使用来自movielens的数据文件ml-100k.zip,解压后上传到Alluxio的ml-100k目录下,当然也可以上传到Minio或者Hdfs相同目录,让Alluxio加载到内存。
./bin/alluxio fs mkdir /ml-100k
#如果当期alluxio就是主节点,可使用命令./bin/alluxio fs copyFromLocal /path/to/ml-100k/u.user
./bin/alluxio fs copyFromLocal /path/to/ml-100k/u.user alluxio://master_hostname:port//ml-100k
在hive控制台创建表u_user:
hive> CREATE TABLE u_user (
userid INT,
age INT,
gender CHAR(1),
occupation STRING,
zipcode STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;
hive> LOAD DATA LOCAL INPATH '/path/to/ml-100k/u.user' #此处为alluxio的文件目录
OVERWRITE INTO TABLE u_user;
现在你可以在hive控制台查询创建的表数据:
hive> select * from u_user;
2.Hive thriftserver2使用
thriftserver2为hive提供多客户端连接的服务,您可以通过Java、C++、Python等不同语言客户端程序连接操作hive。
2.1.服务启用
启动服务前,先保证已经执行过(./hive --service metastore&),hive服务已经启用。
./hive --service hiveserver2 &
或者
./hive --service hiveserver2 -p 10000 &
默认端口为10000,通过命令netstat -anop|grep 10000查看端口是否处于LISTEN状态。
2.2.beeline工具client验证
需要使用服务器的用户名和密码。
> ./beeline
> !connect jdbc:hive2//hive_host Ip:10000
> #此处会提示输入服务器用户名和密码
> 以上命令可以合并(推荐):./beeline -u jdbc:hive2//hive_IP:10000 -n appuser(服务器用户名)
> show databases;
> select *from u_user;
2.3.Java客户端连接ThriftServer操作Hive数据库
引入如下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>3.1.2</version>
</dependency>
public static void main(String[] args)throw Exception{
Class.forName("org.apache.hive.jdbc.HiveDriver");
String connUrl = "jdbc:hive2://hive_hostname:10000/default";
Connection conn = DriverManager.getConnection(connUrl);
Statement sts = conn.createStatement();
ResultSet rs = sts.executeQuery("select userid,age,gender,occupation,zipcode from u_user");
while (rs.next()){
System.out.println(rs.getInteger(0) + "," + rs.getInteger(1));
}
rs.close();
sts.close();
conn.close();
}