hive运行环境构建在hadoop运行环境的基础之上,为用户提供了一种用sql编写mapreduce分布式作业的方式。从写程序的角度看hive与mysql的区别几乎没有,几乎一致:都采用数据库和表对数据进行建模;都采用sql对数据进行操作;既支持直接通过命令行执行sql也支持jdbc等方式执行sql;最重要的不同有两点:hive不支持建立索引,但可以通过分区起到类似索引加速的作用;hive表里面的数据只能整体或者按分区覆写而不支持行级别更新。hive和mysql的区别更多的是在底层技术上,底层技术的不同又直接决定了两者面向的上层应用场景的不同。具体的hive和mysql的区别如下表所示:
底层技术 | 应用场景 | |||||
存储 | 索引 | 计算 | 实时写入 | 实时查询 | 海量大数据 | |
mysql | 本地存储 | 支持索引 | 本地执行引擎 | 支持 | 支持 | 不支持 |
hive | hdfs分布式存储 | 不支持索引,但支持按字段取值分区:比如按日期字段分区,数据会按照日期划分到不同的存储目录 | mapreduce分布式计算引擎 | 不支持,仅支持表级别或者分区级别的整体覆写 | 不支持,查询需要执行分布式作业,所以实时性较差 | 存储和运算都是分布式的天然支持含量大数据 |
hive的出现是为了降低原生mapreduce任务编写的复杂度,提高批处理分布式计算作业的开发效率。hive运行环境通过如下图所示组件与hadoop集群进行交互来达到这个目的:
1,用户接口组件:提供CLI(命令行)、JDBC、WebUI等三种用户交互方式。
2,元数据组件:主要提供hive数据库、表以及分区到hadoop分布式存储路径映射关系的管理。
3,Driver组件:接收用户接口组件提交的sql,访问元数据组件进行必要的检查比如数据库表和分区是否存在等,校验通过之后通过解释器将sql转换成java代码,然后通过编译器将java代码编译成java字节码,再通过优化器对java字节码进行优化形成最终的mapreduce任务,最后通过执行器把mapreduce任务提交到hadoop集群执行,并把执行的结果返回给用户接口组件。
从上图所示的交互方式可以看出,Hive运行环境可以独立于hadoop集群进行部署,根据元数据组件部署方式的不同,hive运行环境有如下三种部署方式:
hive运行环境部署方式 | 元数据组件 | 备注 | |
元数据服务 | 元数据存储 | ||
内嵌模式 | 内嵌元数据服务 | 内嵌数据库服务derby | 在1个进程内包含整个hive运行环境 |
本地模式 | 内嵌元数据服务 | 独立数据库服务mysql | 元数据存储独立到1个数据库服务进程中,在2个进程中包含整个hive运行环境 |
远程模式 | 独立元数据服务metastore | 独立数据库服务mysql | 再增加1个独立的metastore进程,代理对数据库服务的访问,在3个进程中包含整个hive运行环境 |
在正式介绍每种模式的部署方法之前,我们首先需要知道如何选择与hadoop集群兼容的hive版本,并准备好hive安装包。通过hive官网http://hive.apache.org/downloads.html,可以看到各hive版本兼容的hadoop版本,我们部署的hadoop集群是2.8.5,所以可以选择hive2.3.8。
首先介绍内嵌模式的部署方式。
步骤一:在hadoop集群局域网内选择一个ip,部署一个和集群节点相同配置的虚拟节点
docker run -d –privileged -h hive_emb –name hive_emb –net hadoopnet –ip 172.18.0.6 hadoop:v1.0 /usr/sbin/init
步骤二:登录刚部署的虚拟节点下载安装包
登录节点:docker exec -it hive_emb bash
备注:这里推荐先在宿主机上下载好安装包,然后通过docker cp apache-hive-2.3.8-bin.tar.gz hive_emb:/apps的方式拷贝的容器中,这样不用每次重新安装都需要下载一遍
步骤三:解压安装包并配置环境变量
解压安装包:tar -xvzf apache-hive-2.3.8-bin.tar.gz
配置环境变量:echo ‘export HIVE_HOME=/apps/apache-hive-2.3.8-bin
export PATH=$HIVE_HOME/bin:$PATH’ >> ~/.bashrc
使环境变量生效:source ~/.bashrc
步骤四:修改hive配置文件:包括hive-env.sh和hive-site.xml
进入配置目录:cd /apps/apache-hive-2.3.8-bin/conf/
配置hive-env.sh:cp hive-env.sh.template hive-env.sh && vim hive-env.sh,添加
HADOOP_HOME=/apps/hadoop-2.8.5
配置hive-site.xml:cp hive-default.xml.template /apps/apache-hive-2.3.8-bin/conf/hive-site.xml && vim hive-site.xml,整体替换为
<configuration>
<!–Hive中所有数据存储在HDFS上的路径–>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!–连接本地Derby的Url–>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
</property>
<!–连接Derby的驱动包–>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<!—元数据服务是否存放在本地,true代表存放在本地–>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
</configuration>
步骤五:初始化元数据库
schematool -dbType derby -initSchema
备注:执行完之后会在当前目录下看到数据库文件夹metastore_db
步骤六:验证是否搭建成功
启动hive命令行:hive
执行建表命令:create table test_table(id int);
查看表是否存在:show tables;
退出hive命令行:exit;
确认hdfs存在表目录:hadoop fs -ls /user/hive/warehouse/test_table
向表里面写入3条测试数据:echo -e “1\n2\n3” | hadoop fs -put -f – /user/hive/warehouse/test_table/d1
执行hive查询命令:hive -e “select sum(id) from test_table”,会在hadoop集群上执行分布式运算,最终输出6表示成功
再来介绍本地模式的部署方式。本地模式相对内嵌模式需要多部署1个数据库进程,数据库进程可以和hive部署到一台机器上,也可以部署在不同的机器上,我们采用部署到不同机器上。
步骤一:在hadoop集群局域网内选择一个ip,部署一个和集群节点相同配置的虚拟节点,用于部署mysql服务
启动虚拟节点:docker run -d –privileged -h mysql –name mysql –net hadoopnet –ip 172.18.0.7 hadoop:v1.0 /usr/sbin/init
登录虚拟节点:docker exec -it mysql bash
安装mysql源:rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
安装mysql服务:yum -y install mysql-server
启动mysql服务:systemctl start mysqld.service
开机mysql自启:systemctl enable mysqld.service
授权所有ip可以通过root用户采用123456密码链接mysql:mysql -e “use mysql;grant all privileges on *.* to ‘root’@’%’ identified by ‘123456’ with grant option;flush privileges;”
步骤二:在hadoop集群局域网内选择一个ip,部署一个和集群节点相同配置的虚拟节点,用于安装hive运行环境
启动虚拟节点:docker run -d –privileged -h hive_local –name hive_local –net hadoopnet –ip 172.18.0.8 hadoop:v1.0 /usr/sbin/init
拷贝宿主机上的安装包到虚拟节点:docker cp apache-hive-2.3.8-bin.tar.gz hive_local:/apps
登录虚拟节点:docker exec -it hive_local bash
解压安装包:cd /apps && tar -xvzf apache-hive-2.3.8-bin.tar.gz
配置环境变量:echo ‘export HIVE_HOME=/apps/apache-hive-2.3.8-bin
export PATH=$HIVE_HOME/bin:$PATH’ >> ~/.bashrc
使环境变量生效:source ~/.bashrc
进入配置目录:cd /apps/apache-hive-2.3.8-bin/conf/
配置hive-env.sh:cp hive-env.sh.template hive-env.sh && vim hive-env.sh,添加
HADOOP_HOME=/apps/hadoop-2.8.5
配置hive-site.xml:cp hive-default.xml.template /apps/apache-hive-2.3.8-bin/conf/hive-site.xml && vim hive-site.xml,整体替换为
<configuration>
<!– hive和metastore服务是否在同一个节点 –>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<!–mysql的数据库url–>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://mysql:3306/hive_remote?createDatabaseIfNotExist=true</value>
</property>
<!–连接mysql的驱动包–>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!–hive存放元数据的数据库的用户名–>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!–hive存放元数据的数据库的密码–>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
</configuration>
下载mysql jdbc驱动包:wget http://ftp.ntu.edu.tw/MySQL/Downloads/Connector-J/mysql-connector-java-5.1.49.zip
解压缩并放到hive的lib目录中:unzip mysql-connector-java-5.1.49.zip && mv mysql-connector-java-5.1.49/mysql-connector-java-5.1.49-bin.jar /apps/apache-hive-2.3.8-bin/lib
初始化元数据库:schematool -dbType mysql -initSchema
备注:执行完之后会在mysql数据库中创建hive_remote数据库。
步骤三:验证是否搭建成功
启动hive命令行:hive
执行建表命令:create table test_table(id int);
查看表是否存在:show tables;
退出hive命令行:exit;
确认hdfs存在表目录:hadoop fs -ls /user/hive/warehouse/test_table
向表里面写入3条测试数据:echo -e “1\n2\n3” | hadoop fs -put -f – /user/hive/warehouse/test_table/d1
执行hive查询命令:hive -e “select sum(id) from test_table”,会在hadoop集群上执行分布式运算,最终输出6表示成功。
最后介绍远程模式的部署方式。在本地模式的基础上再做两件事即可,一个是在已经部署好hive环境的节点hive_local上面,启动一个专门维护元数据库的服务metastore,另一个是再启动一个节点部署最终给终端用户使用的hive运行环境。下面分步介绍搭建过程:
步骤一:启动metastore服务
登录hive_local节点:docker exec -it hive_local bash
启动metastore服务:nohup hive –service metastore > metastore.log 2>&1 &
步骤二:在hadoop集群局域网内选择一个ip,部署一个和集群节点相同配置的虚拟节点,用于安装最终给终端用户使用的hive运行环境
启动虚拟节点:docker run -d –privileged -h hive_remote –name hive_remote –net hadoopnet –ip 172.18.0.9 hadoop:v1.0 /usr/sbin/init
拷贝宿主机上的安装包到虚拟节点:docker cp apache-hive-2.3.8-bin.tar.gz hive_remote:/apps
登录虚拟节点:docker exec -it hive_remote bash
解压安装包:cd /apps && tar -xvzf apache-hive-2.3.8-bin.tar.gz
配置环境变量:echo ‘export HIVE_HOME=/apps/apache-hive-2.3.8-bin
export PATH=$HIVE_HOME/bin:$PATH’ >> ~/.bashrc
使环境变量生效:source ~/.bashrc
进入配置目录:cd /apps/apache-hive-2.3.8-bin/conf/
配置hive-env.sh:cp hive-env.sh.template hive-env.sh && vim hive-env.sh,添加
HADOOP_HOME=/apps/hadoop-2.8.5
配置hive-site.xml:cp hive-default.xml.template /apps/apache-hive-2.3.8-bin/conf/hive-site.xml && vim hive-site.xml,整体替换为
<configuration>
<!– Hive文件HDFS存放路径 –>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!– hive和metastore服务是否在同一个节点 –>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<!–metastore服务器的url,idea等外部可以通过metastore服务连接到hive,此处ip为部署metastore服务节点的ip–>
<property>
<name>hive.metastore.uris</name>
<value>thrift://172.18.0.8:9083</value>
</property>
</configuration>
步骤三:验证是否搭建成功
启动hive命令行:hive
查看表是否存在:show tables;
执行hive查询命令:select sum(id) from test_table;会在hadoop集群上执行分布式运算,最终输出6表示成功
退出hive命令行:exit; 至此,我们介绍完hive三种运行环境的搭建方式,下面简要总结一下这三种模式的区别和联系。内嵌模式元数据组件、用户接口组件以及Driver组件都在同一个进程内,不支持多个hive命令同时执行,因此只适合调试或者实验环境使用。本地模式三个组件依然在同一个进程内,只不过元数据组件里面负责存储元数据的数据库不再内嵌,而是独立出来单独部署一个进程,一般采用mysql数据库,这种模式能很好地支持多个hive命令同时执行,但是无法支持jdbc以及webUI等访问方式。远程模式把Driver和元数据这两个组件通过metastore服务暴露出去,不仅可以支持CLI访问,也支持jdbc和webUI等访问模式,是工业界使用比较普遍的部署模式。