Hive On LLAP搭建&常见问题

2021-01-29 10:43:31 浏览数 (1)

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版手册,也可以免费获取专栏《数据仓库》配套的视频课程、大数据集群自动安装脚本,并获取进群交流的途径。

我所有的大数据技术内容也会优先发布到公众号中。如果对某些大数据技术有兴趣,但没有充足的时间,在群里提出,我为大家安排分享。

0 人点赞