AlexRomeo
发布于 2024-05-25 / 29 阅读
0
0

Kylin

1 介绍

Kylin是以为来自eBay(易贝)的工程师——刘杰,在2012年开发的一个开源OALP引擎,于2014年交给Apache Kylin社区进行维护。

官方站点:https://kylin.apache.org/cn/

2 为什么要学习Kylin

通过Hive去实现立方体的话,需要使用大量的SQL语句来做,Kylin除了要简化工程师的代码量外,Hive本身的性能也无法和Kylin做对比。

3 环境安装

由于环境配置过程过于复杂,配置起来相当的繁琐,不适合用于课上的环境,故此通过docker进行配置。

在安装环境之前,先将已有的虚拟机配置修改为8C8G(也可以新建)

3.1 安装Docker

安装docker的依赖库

yum install -y yum-utils device-mapper-persistent-data lvm2

配置docker的yum源,官方和阿里的

yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

修改阿里云的repo文件

sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

更新yum本地元数据

yum makecache fast

安装docker

yum install -y docker-ce-18.03.1.ce

启动docker

systemctl start docker

查看docker的状态

systemctl status docker.service

返回的信息:

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 一 2024-05-06 15:26:13 CST; 18s ago
     Docs: https://docs.docker.com
 Main PID: 1805 (dockerd)
    Tasks: 32
   Memory: 45.4M
   CGroup: /system.slice/docker.service
           ├─1805 /usr/bin/dockerd
           └─1816 docker-containerd --config /var/run/docker/containerd/containerd.toml

5月 06 15:26:13 hadoop01 dockerd[1805]: time="2024-05-06T15:26:13+08:00" level=info msg=serving... address="/var/run/docker/containerd/docker-containerd.sock" modu...inerd/grpc"
5月 06 15:26:13 hadoop01 dockerd[1805]: time="2024-05-06T15:26:13+08:00" level=info msg="containerd successfully booted in 0.006281s" module=containerd
5月 06 15:26:13 hadoop01 dockerd[1805]: time="2024-05-06T15:26:13.254352311+08:00" level=info msg="Graph migration to content-addressability took 0.00 seconds"
5月 06 15:26:13 hadoop01 dockerd[1805]: time="2024-05-06T15:26:13.260566038+08:00" level=info msg="Loading containers: start."
5月 06 15:26:13 hadoop01 dockerd[1805]: time="2024-05-06T15:26:13.470798647+08:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0...IP address"
5月 06 15:26:13 hadoop01 dockerd[1805]: time="2024-05-06T15:26:13.519107677+08:00" level=info msg="Loading containers: done."
5月 06 15:26:13 hadoop01 dockerd[1805]: time="2024-05-06T15:26:13.547452319+08:00" level=info msg="Docker daemon" commit=9ee9f40 graphdriver(s)=overlay2 version=18.03.1-ce
5月 06 15:26:13 hadoop01 dockerd[1805]: time="2024-05-06T15:26:13.547588675+08:00" level=info msg="Daemon has completed initialization"
5月 06 15:26:13 hadoop01 dockerd[1805]: time="2024-05-06T15:26:13.552569717+08:00" level=info msg="API listen on /var/run/docker.sock"
5月 06 15:26:13 hadoop01 systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.

3.2 安装Kylin

docker pull apachekylin/apache-kylin-standalone:4.0.0

命令执行后,会自动去官方网站拉去镜像,在此过程中,会受到网络的影响,所以耗时无法确定,需要耐心等待。

最后完成的信息如下:

4.0.0: Pulling from apachekylin/apache-kylin-standalone
2d473b07cdd5: Pull complete 
420a840dbfa1: Pull complete 
53f5b18c707b: Pull complete 
4e7bcf530536: Pull complete 
0b72a391435e: Pull complete 
50b0a292a6cc: Pull complete 
961f953b1f61: Pull complete 
6b76d63844e3: Pull complete 
c42f2ce1e3c3: Pull complete 
545e34eecbb3: Pull complete 
c69e9d45594b: Pull complete 
8e79003dcad2: Pull complete 
533f278beae5: Pull complete 
71b18763d752: Pull complete 
8c5468aecb0f: Pull complete 
1044ffbcd7bd: Pull complete 
0e91243d45af: Pull complete 
4a58d841afb3: Pull complete 
2594269b8824: Pull complete 
32cede976e49: Pull complete 
43a83512c2ff: Pull complete 
8aacfe026ff7: Pull complete 
2ee975072607: Pull complete 
902d2c90f166: Pull complete 
60419e46d0e0: Pull complete 
d0766e3e2d02: Pull complete 
bea555677108: Pull complete 
f80dcbba5b8e: Pull complete 
382d7a63a75e: Pull complete 
a650cbb46a0f: Pull complete 
Digest: sha256:a52a723eb84981dd5e8082c368965af32a84972df4047643cc063562b314e97a
Status: Downloaded newer image for apachekylin/apache-kylin-standalone:4.0.0

完成之后,通过命令来查看拉去的镜像

docker images

命令执行后,返回信息如下:

REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
apachekylin/apache-kylin-standalone   4.0.0               a8a5fd0c0497        2 years ago         3.41GB

如果查询之后,发现拉去的镜像不完整、拉去镜像时出现了问题或最终的镜像文件无法使用,此时需要将该镜像删除。

docker image rm {IMAGE ID}

3.3 启动容器

docker run --name hive-dw-21s1 \
-d \
-p 7070:7070 \
-p 7080:7080 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 2181:2181 \
-p 10000:10000 \
apachekylin/apache-kylin-standalone:4.0.0

命令执行之后会返回一个信息,但该信息在不同的机器中启动,是不会相同的。

84d99a3ca1458853323a44d8a2806b81752ceaecbe9000cd7f7a508c543a38ec

查看当前docker中运行的容器命令

docker ps -a

返回的信息:

84d99a3ca145        apachekylin/apache-kylin-standalone:4.0.0   "/home/admin/entrypo…"   5 minutes ago       Up 5 minutes        0.0.0.0:2181->2181/tcp, 0.0.0.0:7070->7070/tcp, 0.0.0.0:7080->7080/tcp, 0.0.0.0:8032->8032/tcp, 0.0.0.0:8042->8042/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp   hive-dw-21s1

容器启动、停止、重启的命令

# 启动
docker start hive-dw-21s1
# 停止
docker stop hive-dw-21s1
# 重启
docker restart hive-dw-21s1

4 环境的使用

使用该环境需要进入到容器的内部。

4.1 进入容器

# docker容器可以运行系统(例如,在docker中运行centos系统),docker容器所占用的端口号与宿主机的端口是相同的,换句话说,端口不能与宿主机冲突。

# 查看容器名称,下面命令执行后,最后的内容就是容器对应的名称。
docker ps -a

# 进入容器的命令
docker exec -it 容器名称 /bin/bash

进入容器后,通过命令查看当前的进程信息是否全面

# jsp -l可以用来查看后台中的所有java信息,但其中的“sun.tools.jps.Jps”不属于大数据的进程是,它是刚刚实行的jsp命令所产生的内容,sort用于排序 -t指定分隔符,-n表示用数字大小排序-k 1表示按第一段进行排序
jps -l | sort -t " " -nk 1
# 命令返回信息如下
152 org.apache.hadoop.hdfs.server.namenode.NameNode
249 org.apache.hadoop.hdfs.server.datanode.DataNode
352 org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
415 org.apache.hadoop.yarn.server.nodemanager.NodeManager
660 org.apache.hadoop.mapreduce.v2.hs.JobHistoryServer
740 org.apache.zookeeper.server.quorum.QuorumPeerMain
9830 org.apache.catalina.startup.Bootstrap
12266 org.apache.spark.deploy.yarn.ExecutorLauncher
12784 org.apache.spark.executor.CoarseGrainedExecutorBackend
13725 sun.tools.jps.Jps

上述进程是经过排序的,从上而下说明:

前5个进程(152-660)都是属于Hadoop的进程的id

第6个进程(740)是ZooKeeper的进程id

第7个进程(9830)是Kylin的进程id

第8、9个进程(12266、12784)是Spark的进程。

第10个进程(13725)这是Java的jsp命令进程。

4.2 通过浏览器访问各项服务

测试上述的服务是否可以使用

ServerNameServerPort
Hadoopip:50070,HDFS的web访问页面
MR Historyip:8088,Hadoop的历史任务信息页面。
Kylinip:7070/kylin 注意,此处一定要在路径中写上kylin,否则无法访问。

4.3 Kylin的访问

通过web浏览器访问ip:7080/kylin之后,访问成功如下图:

image-20240513135202199

4.3.1 访问密码

账号密码
adminKYLIN

4.4 容器的的bug解决

通过浏览器访问HDFS的tmp目录时提示权限错误。错误信息如下:

Permission denied: user=dr.who, access=READ_EXECUTE, inode="/tmp":root:supergroup:drwxrwx---

解决方式

hdfs dfs -chmod 777 /tmp

启动Hiveserver2时弹出一个错误信息,如下

ls: cannot access /home/admin/spark-2.4.7-bin-hadoop2.7/lib/spark-assembly-*.jar: No such file or directory

解决方法:

修改Hive的脚本文件,文件所在路径$HIVE_HOME/bin

cd $HIVE_HOME/bin
vi hive

找到113行,此行的注释内容是# add Spark assembly jar to the classpath

将脚本原本的内容

# add Spark assembly jar to the classpath
if [[ -n "$SPARK_HOME" ]]
then
  sparkAssemblyPath=`ls ${SPARK_HOME}/lib/spark-assembly-*.jar`
  CLASSPATH="${CLASSPATH}:${sparkAssemblyPath}"
fi

修改为

# add Spark assembly jar to the classpath
if [[ -n "$SPARK_HOME" ]]
then
  sparkAssemblyPath=`ls ${SPARK_HOME}/jars/*.jar`
  CLASSPATH="${CLASSPATH}:${sparkAssemblyPath}"
fi

以上问题虽然是得到了解决,但依然容器被删除(操作失误,需要重新配置容器),所有修改好的配置就都会被重置。可以考虑将容器中的目录与宿主机进行映射。所有的文件在宿主机上,每次启动的时候指定一下该容器的目录映射即可完成配置文件的读取,即便是删除容器再创建也不会影响配置文件。

这样就需要将之前的docker启动容器的命令做个调整,下面是调整后的容器启动命令。

docker run --name hive-dw-21s1 \
-d \
-p 7070:7070 \
-p 7080:7080 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 2181:2181 \
-p 10000:10000 \
-v /home/docker_hive-dw-21s1/admin:/home/admin \
apachekylin/apache-kylin-standalone:4.0.0

可以看出来命令中新增-v参数,将宿主机(冒号前)和容器(冒号后)的目录进行了映射。

但执行此命令时,弹出一个错误,这个错误是因为docker容器启动时有一个脚本需要运行,但在宿主机的目录中未找到该脚本。

解决方法:

先不挂在目录的方式启动容器,将容器中的脚本拷贝出来。

# 停止、删除之前的容器
docker stop hive-dw-21s1
docker rm hive-dw-21s1

# 重新启动docker
docker run --name hive-dw-21s1 \
-d \
-p 7070:7070 \
-p 7080:7080 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 2181:2181 \
-p 10000:10000 \
apachekylin/apache-kylin-standalone:4.0.0

执行docker的cp命令,将容器中的文件拷贝到宿主机指定的目录中

docker cp hive-dw-21s1:/home/admin /home/docker_hive-dw-21s1/

停止、删除现有的docker容器

# 停止、删除之前的容器
docker stop hive-dw-21s1
docker rm hive-dw-21s1

运行docker命令,启动容器,并映射目录

docker run --name hive-dw-21s1 \
-d \
-p 7070:7070 \
-p 7080:7080 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 2181:2181 \
-p 10000:10000 \
-v /home/docker_hive-dw-21s1/admin:/home/admin \
apachekylin/apache-kylin-standalone:4.0.0

致辞,bug解决。

4.5 启动Hive

进入到Hive的bin目录中,执行命令启动HiveServer。

cd $HIVE_HOME/bin
./hiveserver2 &

4.5.1 beeline连接脚本

先启动HiveServer2

通过beeline客户端连接HiveServer,但beeline客户端连接服务端的时候每次都需要写很多参数,非常不方便,故此通过写个脚本的方式进行。

#!/bin/bash
# 开发场景中,是不允许将账号、密码当做明文写在脚本中的。

# 现在是在学习环境中,为了方便,将账号和密码存放到了脚本中。
hive_u=root
hive_p='Root23!@#'

cmd=`echo "sh beeline -u 'jdbc:hive2://localhost:10000' -n $hive_u -p $hive_p"`

if [ $# -eq 1 ];then
    if [ -f "$1" ] && [[ "$1" == *.sql ]];then
        #sh beeline -u 'jdbc:hive2://localhost:10000' -n root -p 'Bcu@123!@#' -f **.sql
        $cmd -f "$1"
        
    elif [ -d "$1" ];then
        echo "$1" is a Directory
        
    else
        $cmd -e "$1"
    fi
elif [ $# -ne 1 ];then
    echo "脚本参数只能是一个,且仅支持字符串或sql文件"
    read -p "未能提供正确的参数,是否仅执行beeline进入客户端操作? (yes/no): " choice
    case "$choice" in 
        yes|Yes|YES|y|Y)
            $cmd
            ;;
        no|No|NO|n|N)
            echo "未执行任何操作。"
            ;;
        *)
            echo "无效的选择。"
            ;;
    esac
fi

4.6 使用Docker环境中的Hive

通过脚本创建库

创建库

CREATE DATABASE test;

编写sql文件,创建表(名称自定义,如emp.sql)

USE test;

CREATE EXTERNAL TABLE IF NOT EXISTS kylin_dept(
    deptno int,
    dname string,
    loc int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

CREATE EXTERNAL TABLE IF NOT EXISTS kylin_emp(
    empno int,
    ename string,
    job string,
    mgr int,
    hiredate string,
    sal double,
    comm double,
    deptno int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

4.7 编写数据文件

在宿主机的admin目录下创建一个目录

admin目录为docker的容器映射的目录,如果未使用映射的方式启动的话,可以直接在容器中创建

mkdir emp_kylin

在刚刚创建好的目录下,创建两个数据文件

dept.txt

10,ACCOUNTING,1700
20,RESEARCH,1800
30,SALES,1900
40,OPERATIONS,1700

emp.txt

7369,SMITH,CLERK,7902,1980-12-17,800.00,0.00,20
7499,ALLEN,SALESMAN,7698,1981-2-20,1600.00,300.00,30
7521,WARD,SALESMAN,7698,1981-2-22,1250.00,500.00,30
7566,JONES,MANAGER,7839,1981-4-2,2975.00,0.00,20
7654,MARTIN,SALESMAN,7698,1981-9-28,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,1981-5-1,2850.00,0.00,30
7782,CLARK,MANAGER,7839,1981-6-9,2450.00,0.00,10
7788,SCOTT,ANALYST,7566,1987-4-19,3000.00,0.00,20
7839,KING,PRESIDENT,,1981-11-17,5000.00,0.00,10
7844,TURNER,SALESMAN,7698,1981-9-8,1500.00,0.00,30
7876,ADAMS,CLERK,7788,1987-5-23,1100.00,0.00,20
7900,JAMES,CLERK,7698,1981-12-3,950.00,0.00,30
7902,FORD,ANALYST,7566,1981-12-3,3000.00,0.00,20
7934,MILLER,CLERK,7782,1982-1-23,1300.00,0.00,10

容器与主机映射目录之后,在容器中能够直接识别。

如果没有对目录进行映射的话,且数据文件又创建到了宿主机中,那么可以考虑通过命令的方式将数据从宿主机中拷贝到容器中

# 下面的文件存储路径(/root/data/)需要自行进行替换
docker /root/data/emp_kylin hive-dw-21s1:/home/admin

4.8 导入数据

LOAD DATA LOCAL INPATH '/home/admin/emp_kylin/dept.txt' OVERWRITE INTO TABLE test.kylin_dept;
LOAD DATA LOCAL INPATH '/home/admin/emp_kylin/emp.txt' OVERWRITE INTO TABLE test.kylin_emp;

4.9 查询数据

select * from kylin_emp;

可以发现查询速度比hive快了很多。

5 课外知识:

有关docker中对镜像的导入导出操作,很多时候镜像从官方下载镜像的速度非常的慢,可以选择一台可以进行缓存的服务器进行pull镜像,完成之后再打包分发或单独提供下载,如下:

其中导入镜像的访问有两种可,--input的方式或使用<符号的方式都可以。

#将镜像导出
docker save apachekylin/apache-kylin-standalone:4.0.0 > /root/docker-images/kylin-standalone.tar

#导入镜像文件
docker load --input /root/docker-images/kylin-standalone.tar

#通过符号的方式来导入
docker load < /root/docker-images/kylin-standalone.tar

5.1 镜像导出

# 导出镜像时会进行打包,如果镜像过大会出现“卡死”的现象(实际上还在运行)
docker save apachekylin/apache-kylin-standalone > /root/kylin-standalone.tar

# 完成之后,在指定的目录下就会产生一个文件。

5.2 通过符号链接的方式导入镜像的反馈信息:

docker load < /root/kylin-standalone.tar 
8ed396224095: Loading layer [==================================================>]   2.56kB/2.56kB
eba49c640d64: Loading layer [==================================================>]  190.5MB/190.5MB
d3be38b85c75: Loading layer [==================================================>]  1.057GB/1.057GB
858b4d1d1d29: Loading layer [==================================================>]  10.77MB/10.77MB
b57f4bb1794e: Loading layer [==================================================>]  6.144kB/6.144kB
c90cf4330587: Loading layer [==================================================>]  198.6MB/198.6MB
be959babe1cf: Loading layer [==================================================>]  377.5MB/377.5MB
9e97c7ce7af6: Loading layer [==================================================>]  681.1MB/681.1MB
7bb2c2d7b45f: Loading layer [==================================================>]  16.38kB/16.38kB
d51dc1a07934: Loading layer [==================================================>]  110.4MB/110.4MB
607953807863: Loading layer [==================================================>]  5.632kB/5.632kB
fb25c2b706c1: Loading layer [==================================================>]  6.144kB/6.144kB
c91aeeaf3e91: Loading layer [==================================================>]  275.3MB/275.3MB
032a5836be03: Loading layer [==================================================>]  849.9kB/849.9kB
4b02d77263af: Loading layer [==================================================>]  261.1kB/261.1kB
125be519a546: Loading layer [==================================================>]  11.26kB/11.26kB
7d3a97cff3a3: Loading layer [==================================================>]  62.53MB/62.53MB
183591354b3d: Loading layer [==================================================>]  40.21MB/40.21MB
713a6a8976ab: Loading layer [==================================================>]  5.632kB/5.632kB
701680a92622: Loading layer [==================================================>]  224.5MB/224.5MB
fe64d1df0fee: Loading layer [==================================================>]  3.584kB/3.584kB
1845fd0b1adb: Loading layer [==================================================>]  13.82kB/13.82kB
33e345ed349c: Loading layer [==================================================>]  19.97kB/19.97kB
28d5f3f74f59: Loading layer [==================================================>]  3.584kB/3.584kB
0b58bcbda7ff: Loading layer [==================================================>]  18.43kB/18.43kB
05041c432fbc: Loading layer [==================================================>]  849.9kB/849.9kB
5f5da0de75b6: Loading layer [==================================================>]   5.12kB/5.12kB
9dc421f4436d: Loading layer [==================================================>]  6.656kB/6.656kB
d2893b4db3c4: Loading layer [==================================================>]  6.656kB/6.656kB
Loaded image: apachekylin/apache-kylin-standalone:4.0.0

评论