赞
踩
在一个由XCloud150、XCloud151、XCloud152、XCloud153、XCloud154 ,合计5台服务器搭建的hadoop生态圈中,部署Hive。
Hive:计算框架,本质是将HQL转化为MapReduce程序,是一个基于Hadoop的数据仓库工具,可以将结构化的数据映射为一张表,提供类sql查询功能。
hive的安装运行模式有3种,分别是内嵌模式、本地模式、远程模式。
本文档的安装说明以远程模式为例。
hive仅仅是一个客户端工具,不存在集群概念,因此安装的时候无需每台机器安装,哪个节点需要使用,就安装在哪个节点上。多个节点安装的时候,mysql的元数据库一定要相同(即要在同一个mysql同一个库上),否则各个客户端获取的数据不一致。
安装hive前,要先安装hadoop集群,hive只需要在hadoop集群的namenode节点安装即可(需要再所有namenode上安装),可以不在datanode节点上安装。
修改hive配置文件时,不需要把hadoop运行起来,但因为用到了hadoop命令,且启动hive的前提也需要hadoop正常运行,所以还是提前把hadoop运行起来。
下载地址:http://mirror.bit.edu.cn/apache/hive/
下载到/xcloud 目录下。命令:
也可在windows上下载好,再拷贝到Linux系统。
命令:
tar -zxvf apache-hive-3.1.3-bin.tar.gz |
为方便使用,将解压后的目录重命名,命令:
mv apache-hive-3.1.3-bin hive |
切换root用户,配置环境变量并生效,命令:
su vi /etc/profile source /etc/profile |
添加配置内容如下:
在hive的conf目录下,复制"hive-default.xml.template",命名为hive-site.xml。 命令:
cd /xcloud/hive/conf cp hive-default.xml.template hive-site.xml vim hive-site.xml |
配置文件有九处要修改:
1)hive元数据存放目录
搜索hive.metastore.warehouse.dir,其value值就是hive元数据在hdfs(分布式文件系统)中的存放目录。这里有两种配置方案。
方案一:可以依据配置文件中的默认配置,在hdfs(分布式文件系统)中创建相应的目录;方案二:提前在hdfs(分布式文件系统)中创建好目录,然后写入配置文件中。
这里采用方案一,配置文件中的默认配置如下:
<name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> |
依据默认配置,在hdfs(分布式文件系统)中创建相应的目录,命令如下:
hadoop fs -ls /user -- 查看/user目录 hadoop fs -mkdir /user/hive -- 创建/user/hive目录 hadoop fs -mkdir /user/hive/warehouse -- 创建/user/hive/warehouse目录 hadoop fs -chmod 777 /user/hive/warehouse -- 授权 hadoop fs -ls /user/hive -- 查看验证 |
输出:
2)MR输出目录
搜索hive.exec.scratchdir,其value指定的目录,是hive用来存储查询的不同map / reduce阶段的计划,以及存储这些阶段的中间输出。这里有两种配置方案。
方案一:依据配置文件中的默认配置,在hdfs(分布式文件系统)中创建相应的目录;方案二:提前在hdfs(分布式文件系统)中创建好目录,然后写入配置文件中。
这里采用方案一,配置文件中的默认配置如下:
<name>hive.exec.scratchdir</name> <value>/tmp/hive</value> |
依据默认配置,在hdfs(分布式文件系统)中创建相应的目录,命令如下:
hadoop fs -ls /tmp -- 查看/tmp目录 hadoop fs -mkdir /tmp/hive -- 创建/tmp/hive目录 hadoop fs -chmod 777 /tmp/hive -- 授权 |
3)临时本地目录
搜索${system:java.io.tmpdir},将其替换为hive的临时目录,这里的临时目录是“/xcloud/hive/tmp”。
注意:“/xcloud/hive/tmp”目录需手动创建。
预期替换4处,前后对比示例:
修改前 | <name>hive.downloaded.resources.dir</name> <value>${system:java.io.tmpdir}/${hive.session.id}_resources</value> |
修改后 | <name>hive.downloaded.resources.dir</name> <value>/xcloud/hive/tmp/${hive.session.id}_resources</value> |
4)用户
搜索${system:user.name},将其全部替换为root。预期替换3处,前后对比:
修改前 | <name>hive.exec.local.scratchdir</name> <value>/xcloud/hive/tmp/${system:user.name}</value> |
修改后 | <name>hive.exec.local.scratchdir</name> <value>/xcloud/hive/tmp/root</value> |
5)数据库地址
搜索javax.jdo.option.ConnectionURL,将该name对应的value修改为远程MySQL数据库的地址,前后对比:
修改前 | <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=metastore_db;create=true</value> |
修改后 | <name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://192.168.0.218:3306/hive_schema?createDatabaseIfNotExist=true&serverTimezone=GMT</value> |
6)数据库驱动
搜索javax.jdo.option.ConnectionDriverName,将该name对应的value修改为MySQL驱动类路径,前后对比:
修改前 | <name>javax.jdo.option.ConnectionDriverName</name> <value>org.apache.derby.jdbc.EmbeddedDriver</value> |
修改后 | <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> |
7)数据库登录名
搜索javax.jdo.option.ConnectionUserName,将对应的value修改为MySQL数据库登录y用户名,前后对比:
修改前 | <name>javax.jdo.option.ConnectionUserName</name> <value>APP</value> |
修改后 | <name>javax.jdo.option.ConnectionUserName</name> <value>hive_schema</value> |
8)数据库登录密码
搜索javax.jdo.option.ConnectionPassword,将对应的value修改为MySQL数据库的登录密码,前后对比:
修改前 | <name>javax.jdo.option.ConnectionPassword</name> <value>mine</value> |
修改后 | <name>javax.jdo.option.ConnectionPassword</name> <value>#######</value> |
9)模式验证
搜索hive.metastore.schema.verification,将对应的value修改为false,前后对比:
修改前 | <name>hive.metastore.schema.verification</name> <value>true</value> |
修改后 | <name>hive.metastore.schema.verification</name> <value>false</value> |
10)hive-3.1.1版本执行
搜索hive.stats.autogather,将对应的value修改为false,前后对比:
修改前 | <name>hive.stats.autogather</name> <value>true</value> |
修改后 | <name>hive.stats.autogather</name> <value>false</value> |
添加内容:
export HADOOP_HOME=/xcloud/hadoop export HIVE_CONF_DIR=/xcloud/hive/conf export HIVE_AUX_JARS_PATH=/xcloud/hive/lib |
修改后:
将mysql的驱动包放在hive安装的lib目录下。
备注:如果不添加驱动包的话,下面执行初始化的时候会抛出 Underlying cause: java.lang.ClassNotFoundException : com.mysql.jdbc.Driver 异常。
1)下载mysql驱动jar包
jar包下载:https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.22
2)上传jar包到hive的lib目录下
进入到hive的bin目录下,初始化元数据库。
前提:1)使用hadoop的guava-27.0-jre.jar替换hive的guava-19.0.jar;2)hive-site.xml文件中的特殊字符(#)已删除;3)hive-site.xml文件中,配置的数据库及用户已创建。(详情可查看问题记录中的1~3)
命令:
cd /xcloud/hive/bin schematool -dbType mysql -initSchema |
输出:
当安装模式是本地模式时,直接进入hive命令行shell,后台会自动启动metastore与hive服务,而且这两个服务还是在同一个进程中,不用手工启动,这点和远程模式是不同的。
当安装模式是远程模式时,首先需要到运行metastore的主机上启动metastore服务;其次在运行hive shell的主机上启动shell时,会同时启动hiveserver进程。
远程模式:首先启动metastore,命令“hive --service metastore &”,输出如下:
启动metastore后,再启动hive,命令“hive”,输出:
测试命令:
create database test; -- 创建test数据库 use test; -- 进入test数据库 create table tt(id int); -- 创建表 show tables; -- 查看当前数据库中的所有表 |
在hive的conf目录下,修改hive-site.xml配置。添加如下内容:
<property> <!-- hiveserver2用户名 --> <name>beeline.hs2.connection.user</name> <value>hadoop</value> </property> <property> <!-- hiveserver2密码 --> <name>beeline.hs2.connection.password</name> <value>######</value> </property> <property> <!-- hiveserver2端口 --> <name>beeline.hs2.connection.hosts</name> <value>localhost:10000</value> </property> |
修改hive.metastore.uris,添加值“thrift://XCloud150:9083”,如图:
修改hadoop的core-site.xml(本文中的绝对路径是/xcloud/hadoop/etc/hadoop)文件。在文件的配置内容后,添加如下配置:
<property> <name>hadoop.proxyuser.hadoop.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hadoop.groups</name> <value>*</value> </property> |
截图示例:
注意:1)红色框的地方,应该为hive所在主机的系统用户。2)hadoop集群,所有的节点都需要改。
在hive-env.sh文件的最后加上:
export HADOOP_OPTS="$HADOOP_OPTS -Dfile.encoding=UTF-8" |
hiveserver2启动命令:
hiveserver2 |
beeline命令:
beeline # 打开beeline命令行 !connect jdbc:hive2://192.168.0.150:10000 # 连接hive2数据库 !exit # 退出beeline |
1)后台启动命令
nohup hive --service metastore &
nohup hive
nohup hiveserver2 (如果起不来,执行nohup hive --service hiveserver2 &)
beeline
2)停止hive
查看端口(配置中,hive、hive2默认端口9083、10000)进程:
netstat -lnp|grep 9083
netstat -lnp|grep 10000
杀死进程:
kill -9 44175
输出:
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/tez/0.10.0/
下载tez的安装包后,拷贝到linux服务器,执行如下命令解压:
tar -zxvf apache-tez-0.10.0-bin.tar.gz mv apache-tez-0.10.0-bin tez-0.10.0 |
配置方案一(验证无误):
在hive的hive-env.sh(/xcloud/hive/conf下)中配置tez。配置内容如下:
export TEZ_HOME=/xcloud/tez-0.10.0 export TEZ_JARS=/xcloud/tez-0.10.0 export HIVE_AUX_JARS_PATH=$TEZ_JARS |
注意:安装hive的时候,配置了“HIVE_AUX_JARS_PATH=/xcloud/hive/lib”,此时改为了“export HIVE_AUX_JARS_PATH=$TEZ_JARS”
配置方案二(未验证):
不修改配置文件,直接将tez的jar和tez/lib下的jar,拷贝到$HIVE_HOME/lib(本文中的绝对路径即是/xcloud/hive/lib)下。
在hive的hive-site.xml配置中,搜索hive.execution.engine,将其value修改为tez。前后对比示例:
修改前 | <name>hive.execution.engine</name> <value>mr</value> |
修改后 | <name>hive.execution.engine</name> <value>tez</value> |
升级到tez-0.10.0,必须修改hive.tez的size (改为512)及vcores (改为1)。
在hive的conf(本文中的绝对路径即是/xcloud/hive/conf)目录下,创建tez-site.xml文件,配置内容如下:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <!--指定tez的在hdfs中的目录,jar的目录--> <name>tez.lib.uris</name> <value>${fs.defaultFS}/tez/tez-0.10.0,${fs.defaultFS}/tez/tez-0.10.0/lib</value> </property> <property> <!--指定tez的在hdfs中的目录,jar的目录--> <name>tez.lib.uris.classpath</name> <value>${fs.defaultFS}/tez/tez-0.10.0,${fs.defaultFS}/tez/tez-0.10.0/lib</value> </property> <!-- tez是否使用hadoop的lib,本文中对应的hadoop版本是3.2.2,若是其它版本,jar的版本可能不匹配 --> <property> <name>tez.use.cluster.hadoop-libs</name> <value>true</value> </property> <property> <name>tez.history.logging.service.class</name> <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value> </property> </configuration> |
将/xcloud/hive/conf下的tez-site.xml文件,复制到/xcloud/hadoop/etc/hadoop下(hadoop集群的每个主节都需要配置),并添加如下配置内容:
<!-- am分配的内存大小,默认1024 --> <property> <name>tez.am.resource.memory.mb</name> <value>1024</value> </property> <!-- am分配的cpu个数,默认1 --> <property> <name>tez.am.resource.cpu.vcores</name> <value>1</value> </property> <!-- 基于yarn提供的内存,分配给java进程的百分比,默认是0.8,具体大小取决于mapreduce.reduce.memory.mb和mapreduce.map.memory.mb。一般不用变即可 --> <property> <name>tez.container.max.java.heap.fraction</name> <value>0.4</value> </property> <!-- 分配的内存,默认1024 ,出现内存不够时候,设置更大点 --> <property> <name>tez.task.resource.memory.mb</name> <value>1024</value> </property> <!-- 分配的vcores 默认是1 ,一般不需要改 --> <property> <name>tez.task.resource.cpu.vcores</name> <value>1</value> </property> |
将tez上传到hdfs。命令如下:
hadoop fs -mkdir /tez -- 在hdfs的根路径下,创建tez目录 hadoop fs -put /xcloud/tez-0.10.0 /tez -- 将本地的tez上传到hdfs的/tez目录下 hadoop fs -ls /tez -- 查看验证 |
输出:
在...hive/lib目录下,将guava-19.0.jar替换为guava-27.0-jre.jar(在Hadoop中)。
删除slf4j-log4j12-1.7.10.jar
输出:
在hadoop/etc/hadoop目录下,配置tez-site.xml内容如下:
<!-- 允许Tez使用Timeline服务器进行历史记录 --> <property> <name>tez.history.logging.service.class</name> <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value> </property> <property> <name>tez.tez-ui.history-url.template</name> <value>__HISTORY_URL_BASE__?viewPath=/#/tez-app/__APPLICATION_ID__</value> </property> <!-- Tez UI的web地址,端口即是web服务器的端口,如tomcat默认为8080 --> <property> <!-- 托管tez-ui的主机访问地址,可以是集群之外的主机 --> <name>tez.tez-ui.history-url.base</name> <value>http://192.168.0.150:8080/tez-ui/</value> </property> <property> <name>tez.allow.disabled.timeline-domains</name> <value>true</value> </property> |
获取的方式有三种:
tez-ui会默认连接当前主机上的timeLineService和resourceManager。
如果托管tez-ui的主机,与运行timeLineService和resourceManager的主机不同。那么就需要手动配置timeLineService和resourceManager的UI地址。
配置方法:解压tez-ui.war,修改config/configs.env文件。去掉timeline和rm配置的注释(‘//’),并按实际情况填写地址。
修改前:
修改后:
打开tez-ui页面,如图:
参考文档:Hive1.2.1开启Jmx - 灰信网(软件开发博客聚合)
按照参考文档,在 hive 安装目录的 ...hive/conf 路径下,修改 hive-env.sh 配置文件,修改结果如下:
修改前 | export HADOOP_OPTS="$HADOOP_OPTS -Dfile.encoding=UTF-8" |
修改后 | export HADOOP_OPTS="$HADOOP_OPTS -Dfile.encoding=UTF-8 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9093" |
修改后,启动 metastore 成功,启动 hiveserver2 报错。如图:
这是因为在启动 metastore 时,已经占用了指定端口(9093)。
解决方案:
鉴于以上错误,改为单独为 hiveserver2 开启 jmx。具体做法是,撤消上述 hive-env.sh 配置文件的修改,在 hive 安装目录的 .../hive/bin目录下,修改 hive 脚本。添加内容如下:
if [[ "$SERVICE" == "hiveserver2" ]] ; then export HADOOP_CLIENT_OPTS="$HADOOP_OPTS -Dfile.encoding=UTF-8 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9093 " fi |
截图:
添加后,启动 metastore、hiveserver2成功。
验证:
在jdk安装目录的 .../jdk/bin 目录下,运行 jvisualvm.exe。打开相应界面后,在页面左侧的“远程”下,添加远程主机。如:
然后在远程主机下,添加jmx连接,如:
添加后,双击jmx连接,即可打开相应的监控页面,如:
优化原则:
hiverserver2的安全最大内存配置=250M*引擎的最大并发度,-Xmx设置成它的60%到100%都是可以的,根据部署机器的内存是否充裕,决定-Xmx的数值。我们引擎的最大并发度随集群配置的增长而增长。
测试演示的非正式上线系统:hiveserver2的内存 -Xms512m -Xmx1g。
正式上线系统:hiveserver2 的内存配置 -Xms1g -Xmx4g;metadatastore 内存配置 -Xms256m -Xmx512m。
配置流程:
在hive安装目录的 ...hive/bin目录下,修改 hive 脚本。在开启JMX的配置中,添加内存配置,如:
同理开启 metadatastore 的 jmx,以及配置内存。(待验证)
在.../hive/conf目录下,修改 hive-log4j2.properties 配置,修改日志文件的存放位置。命令:
cd /xcloud/hive/conf cp hive-log4j2.properties.template hive-log4j2.properties vim hive-log4j2.properties |
原配置:
修改后:
小版本升级,如从3.1.2升级到3.1.3,只需要将hive服务停掉,然后重新安装hive即可。因为hive的元数据已存在,所以省去了初始化的步骤,按原有配置,配好后,直接启动即可。
大版本升级,如从3.0.0升级到3.1.0,因为大版本在元数据的存储上存在差异,所以不能够按小版本的方式升级。重新安装高版本的hive后,还需要对元数据进行升级,元数据的升级脚本位于/xcloud/hive/scripts/metastore/upgrade目录下,依据元数据存储的数据库接着向下找,如
1)hive初始化元数据库报错:
解决方案:hadoop与hive的jar包版本不一致,使用hadoop的guava-27.0-jre.jar替换hive的guava-19.0.jar
2)初始化报错,hive-site.xml中有特殊字符。
删除上图中的特殊字符即可
3)初始化报错,无法连接到数据库
确认hive-site.xml配置文件中,配置的数据库、数据库用户是否存在。不存在的话,先建数据库及用户
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。