前言
目前数据湖已成为大数据领域的最新热门话题之一,而什么是数据湖,每家数据平台和云厂商都有自己的解读。整体来看,数据湖主要的能力优势是:集中式存储原始的、海量的、多来源的、多类型的数据,支持数据的快速加工及计算。相比于传统的数据仓库,数据湖对数据有更大的包容性,支持结构化/半结构化/非结构化数据,能快速进行数据的落地和数据价值发掘。数据湖的技术体系可以分为三个子领域:数据湖存储、数据湖计算、数据湖统一元数据。
数据湖存储提供海量异构数据的存储能力,支持多类型的底层存储系统,如分布式存储 HDFS、对象存储 AWS S3、腾讯云对象存储 COS 等,除此之外,在数据湖场景中计算和存储分离,使得计算的数据本地性不复存在。因此有必要在数据湖存储和计算之间引入统一的数据缓存层。
Alluxio是一款基于云原生开源的数据编排技术,为数据计算与数据存储构建了桥梁,支持将数据从原始存储层移动到加速计算的虚拟分布式存储系统。Alluxio可为数据湖计算提供统一的数据湖存储访问入口,支持跨不同类型的底层存储并抽象出统一的数据访问命名空间,提供数据本地性、数据可访问性、数据伸缩性。
本文将对 Alluxio 底层源码进行简要分析,分上下两篇:主要包括本地环境搭建,源码项目结构,服务进程的启动流程,服务间RPC调用,Alluxio 中重点类详解,Alluxio 中 Block 底层读写流程,Alluxio Client调用流程和 Alluxio 内置的轻量级调度框架。 环境准备 本地部署
从官方下载安装版本(下载地址),以2.6.0安装为例,下载后解压安装包: 1 tar -zxvf alluxio-2.6.0-bin.tar.gz
修改基本的配置文件,
(1). 修改alluxio-site.properties,设置master地址,设置默认Alluxio root挂载点: 1 cp conf/alluxio-site.properties.template alluxio-site.properties
2 #放开注释:
3 alluxio.master.hostname=127.0.0.1
4 alluxio.master.mount.table.root.ufs=${alluxio.work.dir}/underFSStorage
2). 修改masters、workers配置对应ip,本地安装,可都设置为127.0.0.1 1 vi conf/masters
2 vi conf/workers
修改完配置后,准备启动Alluxio服务,执行如下命令操作: 1 # mount对应磁盘
2 bin/alluxio-mount.sh Mount workers
3 # 进行环境校验
4 bin/alluxio validateEnv master
5 bin/alluxio validateEnv worker
服务启动命令操作,对于所有服务操作包括:master、worker、job_master、job_worker、proxy 1 # 启动所有服务
2 bin/alluxio-start.sh all
3 # 停止所有服务
4 bin/alluxio-stop.sh all
5
6 # 启动单个服务
7 bin/alluxio-start.sh -a master
8 bin/alluxio-start.sh -a worker
9 bin/alluxio-start.sh -a job_master
10 bin/alluxio-start.sh -a job_worker
11 bin/alluxio-start.sh -a proxy
启动后服务成功,也可通过JPS查看Java进程:AlluxioMaster、AlluxioWorker、AlluxioJobMaster、AlluxioJobWorker、AlluxioProxy。
http://localhost:19999,页面查看alluxio master ui界面,默认端口:19999
http://localhost:30000,页面查看alluxio worker ui界面,默认端口:30000 IDEA调试
源码编译可参考官方说明文档:Building Alluxio From Source 1 mvn clean install -DskipTests
2 # 加速编译
3 mvn -T 2C clean install -DskipTests -Dmaven.javadoc.skip -Dfindbugs.skip -Dcheckstyle.skip -Dlicense.skip -Dskip.protoc
通过IDEA启动Alluxio各个服务进程,其核心启动类包括: AlluxioMaster:Main函数入口,设置启动运行VM Options,alluxio.logger.type=MASTER_LOGGER,RPC端口:19998,Web端口:19999; AlluxioJobMaster:Main函数入口,设置启动运行VM Options,alluxio.logger.type=JOB_MASTER_LOGGER AlluxioWorker:Main函数入口,设置启动运行VM Options,alluxio.logger.type=WORKER_LOGGER, AlluxioJobWorker:Main函数入口,设置启动运行VM Options,alluxio.logger.type=JOB_WORKER_LOGGER AlluxioProxy:Main函数入口,设置启动运行VM Options,alluxio.logger.type=PROXY_LOGGER
VM Options参数示例如下: 1 -Dalluxio.home=/code/git/java/alluxio -Dalluxio.conf.dir=/code/git/java/alluxio/conf -Dalluxio.logs.dir=/code/git/java/alluxio/logs -Dlog4j.configuration=file:/code/git/java/alluxio/conf/log4j.properties -Dorg.apache.jasper.compiler.disablejsr199=true -Djava.net.preferIPv4Stack=true -Dalluxio.logger.type=MASTER_LOGGER -Xmx2g -XX:MaxDirectMemorySize=516M
操作示例如下:
在项目根目录 logs下可查看服务启动的日志文件:
DEBUG远程调试,在alluxio-env.sh 配置环境变量,可增加如下配置属性 1 export ALLUXIO_WORKER_JAVA_OPTS=“ A L L U X I O J A V A O P T S − a g e n t l i b : j d w p = t r a n s p o r t = d t s o c k e t , s e r v e r = y , s u s p e n d = n , a d d r e s s = 6606 " 2 e x p o r t A L L U X I O M A S T E R J A V A O P T S = " ALLUXIO_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6606" 2 export ALLUXIO_MASTER_JAVA_OPTS=" ALLUXIOJAVAOPTS−agentlib:jdwp=transport=dtsocket,server=y,suspend=n,address=6606"2exportALLUXIOMASTERJAVAOPTS="ALLUXIO_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6607”
3 export ALLUXIO_USER_DEBUG_JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=6609"
如下图所示,增加远程的监控端口,监控Alluxio Worker 6606:
调用Alluxio Shell命令时开启DEBUG的输出,使用参数:-debug,示例如下: 1 bin/alluxio fs -debug ls / 项目结构
Alluxio源码的项目结构可简化如下几个核心模块:
alluxio-core:实现Alluxio系统的核心模块,其中alluxio-core-server内实现Alluxio Master、Alluxio Worker、Alluxio Proxy;alluxio-core-client定义Alluxio Clien操作;alluxio-core-transport 实现服务间RPC通信;
alluxio-job:Alluxio内部轻量级作业调度实现,alluxio-job-server内实现 Alluxio Job Master、Alluxio Job Worker;
alluxio-underfs:适配对接不同的底层存储,如hdfs、cephfs、local、s3等;
alluxio-table:实现Alluxio Catalog功能,基于table引擎读取元数据并支持关联Alluxio存储,目前catalog的底层UDB支持hive metastore和aws glue catalog;
alluxio-shell:封装Alluxio shell工具; 服务进程
Alluxio服务内部的5个核心进程:AlluxioMaster、AlluxioWorker、AlluxioProxy、AlluxioJobMaster、AlluxioJobWorker 都是基于Process(进程)接口类扩展实现的,定义组件进程的生命周期管理操作。
类图实现继承关系如下所示: AlluxioMaster 启动流程
基于JournalSystem维护Master元数据持久化信息,便于服务宕机后,从最新的Journal File恢复,详见Journal Management;
进行AlluxioMaster选举,Master选举支持两种方式:ZK、Raft(RaftJournalSystem);
基于ProcessUtils进行进程启停管理触发,执行AlluxioMasterProcess 启动