Hive On LLAP搭建&常见问题
基本概述
Hive在2.0之后,推出一个新特性LLAP(Live Long And Process),可以显著提高查询效率。
LLAP是一个常驻于Yarn的进程,并不是一个执行引擎,它将DataNode数据预先缓存到内存中,然后交由DAG引擎进行查询、处理任务使用。部分查询、权限控制将由LLAP执行,短查询任务的结果会很快的返回。
相对于Hive 1.x,提升大约25倍的性能。
安装准备
Apache Slider安装
LLAP需要常驻于Yarn之上,所以需要提前安装Apache Slider。当然,在Hadoop 3.x中,Yarn已经支持常驻任务的运行,就不需要对Apache Slider进行安装了。
首先下载Slider,如果网速较慢,可以先从Github中下载zip包,再上传到服务器进行解压。
代码语言:javascript复制git clone https://github.com/apache/incubator-retired-slider/tree/branches/branch-0.90.2
这里将slider安装包放置到/opt/frames/目录下,然后对安装包进行解压。
因为编译过程需要maven,所以使用脚本对maven进行安装。
代码语言:javascript复制# 进入自动化脚本安装目录
cd /home/hadoop/automaticDeploy/
# 编辑frames.txt,添加maven配置
apache-maven-3.6.3-bin.tar.gz true
# 使用脚本安装maven
./systems/configureMaven.sh
# 初始化环境变量
source /etc/profile
# 查看是否安装成功
mvn --version
进入到Slider源码目录下,进行编译。
代码语言:javascript复制# 进入slider源码目录
cd apache-slider-0.90.2-incubating/
# 进行编译
mvn clean site:site site:stage package -DskipTests
解压编译后的文件。
代码语言:javascript复制mkdir /opt/app/slider/
tar -zxvf slider-assembly/target/slider-0.90.2-incubating-all.tar.gz -C /opt/app/slider/
编辑conf/slider-env,添加环境变量。
代码语言:javascript复制# 进入slider安装目录
cd /opt/app/slider/slider-0.90.2-incubating
# 编辑conf/slider-env,添加以下内容
export JAVA_HOME=${JAVA_HOME}
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop/
编辑conf/slider-client.xml,指定Zookeeper地址,Zookeeper稍后使用脚本进行安装,这里提前规定它安装到node01、node02、node03节点。
代码语言:javascript复制<property>
<name>hadoop.registry.zk.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
将Slider添加到PATH环境变量中。
代码语言:javascript复制vim /etc/profile
# 配置环境变量
export SLIDER_HOME=/opt/app/slider/slider-0.90.2-incubating
export PATH=$PATH:$SLIDER_HOME/bin
# 配置完成后,初始化环境变量
source /etc/profile
查看是否配置成功。
代码语言:javascript复制slider version
Zookeeper安装
因为Slider依赖Zookeeper,所以需要在各个节点提前进行安装。这里直接使用脚本来完成。
首先进入脚本目录,分别在node01、node02、node03中编辑frames.txt配置文件,添加zookeeper的安装信息。
代码语言:javascript复制cd /home/hadoop/automaticDeploy/
vim frames.txt
# 添加如下信息
zookeeper-3.4.10.tar.gz true node01,node02,node03
然后将zookeeper-3.4.10.tar.gz安装包上传到各节点的/opt/frames目录下,如果使用frames.zip包,则安装包已经在对应目录中。这里也可以安装其它版本,自行更改配置即可。
在node01、node02、node03上调用脚本进行一键安装。
代码语言:javascript复制/home/hadoop/automaticDeploy/hadoop/installZookeeper.sh
然后初始化环境变量即可。
代码语言:javascript复制source /etc/profile
因为启动时需要在各个节点执行启动命令,为了方便起见,使用脚本安装Zookeeper后,启动命令已经被封装为脚本zookeeper.sh,在任意一台节点执行便可以一键完成Zookeeper集群的启停:
代码语言:javascript复制# 在任意一台节点执行即可
zookeeper.sh start
环境搭建
首先编辑hive-site.xml,配置LLAP,这里hive.llap.daemon.service.hosts配置为运行在yarn上的LLAP服务名,这里可以自定义设置,但要与下一步中使用hive命令生成的LLAP环境包中的服务名一致。
代码语言:javascript复制<property>
<name>hive.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
<property>
<name>hive.execution.mode</name>
<value>llap</value>
</property>
<property>
<name>hive.llap.execution.mode</name>
<value>all</value>
</property>
<property>
<name>hive.llap.daemon.service.hosts</name>
<value>@llap_server</value>
</property>
然后,使用Hive命令生成LLAP环境包,它包含LLAP运行所需依赖、LLAP启动脚本。其中–name参数指定的便是LLAP服务名。
代码语言:javascript复制# 使用命令生成的llap环境包会存放在当前目录中
# 所以提前进入/opt/app目录,避免llap环境包生成到其它目录
cd /opt/app
# instances指定节点数量;executors指定每个节点执行器数量
# iothread指定实例的IO线程数
# size指定container内存大小
# xmx指定container JVM堆大小
hive --service llap --name llap_server
--instances 2
--cache 512m
--executors 2
--iothreads 2
--size 1024m
--xmx 512m
--loglevel INFO
--args "-XX: UseG1GC -XX: ResizeTLAB -XX: UseNUMA -XX:-ResizePLAB -XX:MaxGCPauseMillis=200"
--javaHome $JAVA_HOME
在运行前,需要在各个节点确认关闭python的ssl功能,避免因为在集群中进行https校验,而导致llap从节点无法向主节点汇报心跳而关闭。
代码语言:javascript复制vim /etc/python/cert-verification.cfg
# 确保以下参数为disable
[https]
verify=disable
然后,因为llap使用的执行引擎为tez,而当前安装的tez-0.9.1版本自带的hadoop依赖为2.7.0,集群hadoop版本为2.7.7,所以在执行SQL时会抛出异常:
代码语言:javascript复制org.apache.hadoop.tracing.SpanReceiverHost.getInstance(Lorg/apache/hadoop/conf/Configuration;)Lorg/apache/hadoop/tracing/SpanReceiverHost;
这是因为hadoop 2.7.3中更改了SpanReceiverHost.getInstance方法而导致的,所以,需要替换掉llap中的tez依赖(如果使用更高版本的tez,则不需要进行替换):
代码语言:javascript复制# 进入生成的llap目录中,这里以llap-slider-20Jan2021为例
cd llap-slider-20Jan2021/
# 解压llap依赖包
unzip llap-20Jan2021.zip -d unzipped
cd unzipped/package/files
tar -zxvf llap-20Jan2021.tar.gz
# 替换Hadoop Jar包
cd lib/tez
cp ../hadoop-common-2.7.7.jar ./
cp /opt/app/hadoop-2.7.7/share/hadoop/common/lib/hadoop-annotations-2.7.7.jar ./
cp /opt/app/hadoop-2.7.7/share/hadoop/common/lib/hadoop-auth-2.7.7.jar ./
cp /opt/app/hadoop-2.7.7/share/hadoop/hdfs/hadoop-hdfs-2.7.7.jar ./
cp /opt/app/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.7.7.jar ./
cp /opt/app/hadoop-2.7.7/share/hadoop/yarn/hadoop-yarn-api-2.7.7.jar ./
rm -rf hadoop-common-2.7.0.jar hadoop-annotations-2.7.0.jar hadoop-auth-2.7.0.jar hadoop-hdfs-2.7.0.jar hadoop-mapreduce-client-common-2.7.0.jar hadoop-yarn-api-2.7.0.jar
# 返回到llap-slider-20Jan2021/unzipped/package/files目录
cd ../../
# 删除旧的压缩包
rm -rf llap-20Jan2021.tar.gz
# 重新打包
tar -zcvf llap-20Jan2021.tar.gz *
# 删除旧的文件
rm -rf bin conf config.json lib
# 返回到llap-slider-20Jan2021/unzipped目录
cd ../../
# 将unzipped文件重新打包
zip -r llap-20Jan2021.zip *
# 拷贝到原目录中覆盖旧的zip包
rm -rf ../llap-20Jan2021.zip
cp llap-20Jan2021.zip ../
# 回到llap-slider-20Jan2021目录,删除unzipped目录
rm -rf unzipped/
在启动LLAP前,保证zookeeper已经启动,否则会报错:
代码语言:javascript复制2021-01-21 07:08:36,668 [main-SendThread(node02:2181)] WARN zookeeper.ClientCnxn - Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 811, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.7/threading.py", line 764, in run
self.__target(*self.__args, **self.__kwargs)
File "/opt/app/slider/slider-0.90.2-incubating/bin/slider.py", line 172, in print_output
(line, done) = read(src, line)
File "/opt/app/slider/slider-0.90.2-incubating/bin/slider.py", line 149, in read
o = c.decode('utf-8')
File "/usr/lib64/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe6 in position 0: unexpected end of data
最后,进入到生成的llap目录中,执行run.sh。
代码语言:javascript复制# 这里,生成的llap目录为llap-slider-20Jan2021
cd llap-slider-20Jan2021/
./run.sh
llap运行后,可以在yarn监控节点看到运行的task进程。
在各个节点上使用 jps 命令进行查看,可以找到SliderApplicationMaster进程,还有两个LlapDaemon守护进程,说明已经成功运行。
可以使用命令停止llap。
代码语言:javascript复制slider stop llap_server
也可以使用hive命令查看llap状态。
代码语言:javascript复制hive --service llapstatus --name llap_server
最后,创建表,并插入数据,看是否执行成功。
代码语言:javascript复制create table llap_test (id int ,name string);
insert into llap_test values(1, 'zs');
后话
至此,LLAP已经搭建完成,如果有帮助的,记得点赞、关注。在公众号《数舟》中,回复【10124】获取当前PDF版手册,也可以免费获取专栏《数据仓库》配套的视频课程、大数据集群自动安装脚本,并获取进群交流的途径。
我所有的大数据技术内容也会优先发布到公众号中。如果对某些大数据技术有兴趣,但没有充足的时间,在群里提出,我为大家安排分享。