场景:
做的项目需要功能优化,需要比较同样数据,从hive中查询和从es中查询哪个效率更高。于是需要把es中某个索引的数据全量同步到hdfs上,通过hive查询hdfs数据来比较二者效率。
第一步:前期准备+hive下载
由于hive需要查询hdfs中数据,所以首先需要进行hadoop环境的搭建,hadoop搭建流程我参考的教程如下:
Hadoop集群搭建教程(详细)_fanxin_i的博客-CSDN博客_hadoop集群搭建
而搭建hive,如果连接的是本地数据库,则还需要进行mysql的搭建。mysql的搭建流程我参考的教程如下:
linux安装mysql教程 - 番薯大大 - 博客园
而后就是进行hive的下载和搭建了,下载之前一定要确认一下hadoop和hive的对应版本,我下载的hadoop版本是2.7.7,
为了方便我这里把解压出来的文件夹重命名为了hive,方便后续操作
第二步:hive搭建
由于我是linux下部署,因此需要提前设置一下环境变量,路径:/etc/profile,添加如下代码:
export HIVE_HOME=填写hive的路径
export PATH=$PATH:$HIVE_HOME/bin
然后执行命令:source /etc/profile
也有人修改环境变量是在vim ~/.bashrc下,二者区别可以根据实际情况来
进入到hive文件夹下的conf文件夹,把所有后缀有.template的文件,都把这个后缀移除掉,然后hive-default.xml移除后缀后,需要修改名为hive-site.xml 。
编辑hive-site.xml ,现在hive-site.xml这个文件因为未去掉后缀之前是个模板文件,所以里面配置项很多,我只用到了如下几项:
<property>
<name>hive.exec.scratchdir</name>
<value>hdfs下某个路径</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>hdfs下某个路径</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://数据库地址:3306/数据库名?createDatabaseIfNotExist=true&characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value> com.mysql.cj.jdbc.Driver
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>//数据库用户名
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123</value> //数据库密码
</property>
如果要配置其他的配置项,需要把其中${system:java.io.tmpdir}都替换成真实目录,不然会报错。
修改hive-env.sh,增加如下代码:
export JAVA_HOME=jdk路径
export HADOOP_HOME=hadoop路径
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HIVE_HOME=hive路径
export HIVE_CONF_DIR=$HIVE_HOME/conf
export HIVE_AUX_JARS_PATH=$HIVE_HOME/lib
由于需要连接数据库,因此最后一步就是要下载并把mysql-connector-java的驱动jar包放入hive的lib下,注意驱动jar包版本得和数据库版本一致,我mysql版本是8,因此驱动下载的版本也得是8
第三步:hive运行及排错
进入hive文件夹下的bin目录下,运行./hive,如果运行出错,可以先去conf目录下的hive-log4j2.properties配置文件,查看property.hive.log.dir配置项,查看log打印的路径,然后去该路径下看详细日志
第四步:查询es中数据创建外部表
运行hive后,先下载jar包:elasticsearch-hadoop-2.2.0.jar。然后执行命令:
hive> add jar file:///home/hadoop/xuguokun/elasticsearch-hadoop-2.2.0.jar;
然后创建外部表:
create external table ext_table(
'id' bigint,
'title' string,
...
)
stored by 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPRORERTIES(
'es.nodes'='es地址',
'es.port'='es端口',
'es.index.auto.create'='false',
'es.resource'='es索引',
'es.nodes.warn.only'='true',
'es.net.http.auth.user'='用户名',
'es.net.http.auth.pass'='密码',
'es.index.read.missing.as.empty'='false'
);
此时,就可以通过select这个外部表来间接查询到es的数据了。
创建内部表:
create table in_table(
和外部表中字段保持一致
);
最后把外部表数据导入内部表,等着就行了
insert overwrite table in_table select * from ext_table;