Drill是Apache旗下的一个开源SQL查询引擎,可用于探索大数据。它的设计初衷是为了支持对大数据的高性能分析,同时支持行业标准查询语言ANSI SQL。html
在Drill 1.13以前,Drill只支持独立集群部署,部署成功后每一个节点上会运行一个名为Dirllbit的守护进程。从1.13版本开始,Drill支持与YARN集成来管理资源。使用YARN后,Drill将成为一个运行在YARN上的长进程。当您启动Drill时,YARN会自动将Drill软件部署到每一个节点上,避免了在每一个节点上安装Drill的繁琐。除此以外,资源管理也会获得简化,由于YARN对于Drill使用的资源是敏感的。java
目前全部YARN发行版都提供了内存和CPU(YARN称为“vcores”)的设置,某些发行版还提供磁盘的设置。对于内存,在把Drill部署在YARN上的时候,你会配置Drill要使用的内存,然告知YARN。此外,Drill将使用全部可用的磁盘和CPU,固然能够启用Linux cgroup来限制Drill对CPU使用的,以到匹配YARN的vcores分配。node
为了方便讲解在YARN下部署Drill,先简单介绍YARN的核心概念。web
YARN全称是Yet Another Resource Negotiator(另外一种资源协调者),是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度。apache
当用户向YARN中提交一个任务后,YARN将分两个阶段运行该任务:第一阶段是启动AM。第二阶段是由AM建立任务,为它申请资源,并监控它的整个运行过程,直到运行完成。具体以下:json
// 初始化并启动一个YarnClient Configuration yarnConfig = new YarnConfiguration(getConf()); YarnClient client = YarnClient.createYarnClient(); client.init(yarnConfig); client.start(); ...
// 建立一个应用程序 YarnClientApplication app = client.createApplication(); GetNewApplicationResponse appResponse = app.getNewApplicationResponse(); ...
// 设置应用程序提交上下文 ApplicationSubmissionContext appContext = app.getApplicationSubmissionContext(); appContext.setApplicationId(appResponse.getApplicationId()); appContext.setApplicationName(config.getProperty("app.name")); appContext.setApplicationType(config.getProperty("app.type")); ... // 设置am container启动上下文 ContainerLaunchContext amContainer = Records.newRecord(ContainerLaunchContext.class); amContainer.setLocalResources(amLocalResources); amContainer.setEnvironment(amEnvironment); amContainer.setCommands(Collections.singletonList(amCommand.toString())); ...
// 提交应用程序 client.submitApplication(appContext);
// 初始化AMRMClientAsync YarnConfiguration yarnConfig = new YarnConfiguration(); AMRMClientAsync amrmClientAsync = AMRMClientAsync.createAMRMClientAsync(5000, new AMRMCallbackHandler()); amrmClientAsync.init(yarnConfig); amrmClientAsync.start();
// 初始化NMClientAsync YarnConfiguration yarnConfig = new YarnConfiguration(); NMClientAsync nmClientAsync = NMClientAsync.createNMClientAsync(new NMCallbackHandler()); nmClientAsync.init(yarnConfig); nmClientAsync.start();
// 注册ApplicationMaster(AM) amrmClientAsync.registerApplicationMaster(thisHostName, 0, ""); ...
// 添加ContainerRequest amrmClientAsync.addContainerRequest(containerRequest); ...
// 启动容器 nmClientAsync.startContainerAsync(container, containerContext); ...
// 注销 amrmClientAsync.unregisterApplicationMaster(appStatus, appMessage, null);
这里只是简单介绍了YARN的概念,以及如何编写YARN应用程序,详情能够参考Apache Hadoop YARN安全
YARN经过客户端来启动应用程序。对于Drill来讲,就是Drill-on-YARN客户端了。客户端能够在任何机器上,只要该机器同时有Drill和Hadoop软件。使用YARN部署Drill时,您只须要在客户端计算机上安装Drill,Drill-on-YARN会自动部署到其它节点。须要注意的是,当你不使用YARN部署Drill时,通常会将其配置文件和自定义代码放在Drill的目录中,可是在YARN下运行时,建议全部配置和自定义代码都会放在一个名为site的目录中,勿改变Drill目录中的任何内容。bash
接下来详细说明部署步骤:app
部署的环境运维
关于jdk、zookeeper、hadoop的部署,不作赘述了,记得设置JAVA_HOME、HADOOP_HOME
建立一个目录,用于放置下载好的Drill发行包
export DRILL_DIR=/path/to/drill mkdir -p $DRILL_DIR cd $DRILL_DIR
说明:执行完上面的命令后,所处的目录为/path/to/drill
下载Drill发行包,这里使用apache-drill-1.14.0.tar.gz,下载完后解压,再次强调,目前所处的目录为/path/to/drill
export DRILL_NAME=apache-drill-1.14.0 tar -xzf $DRILL_NAME.tar.gz export DRILL_HOME=$DRILL_DIR/$DRILL_NAME
说明:DRILL_NAME很重要,后面启动的时候和名字有关系
建立site目录,并把配置文件和自定义代码放置在其中
export DRILL_SITE=$DRILL_DIR/site mkdir -p $DRILL_SITE cp $DRILL_HOME/conf/drill-override-example.conf $DRILL_SITE/drill-override.conf cp $DRILL_HOME/conf/drill-on-yarn-example.conf $DRILL_SITE/drill-on-yarn.conf cp $DRILL_HOME/conf/drillenv.sh $DRILL_SITE
说明:
修改$DRILL_SITE/drill-override.conf 通常状况下,可能须要修改的配置有:cluster-id、zk、http、rpc。此处,我只修改cluster-id和zk
drill.exec: { cluster-id: "drillbits1" zk: { connect: "11.167.47.76:2181,11.167.57.229:2181,11.167.67.151:2181", root: "drill", refresh: 500, timeout: 5000, retry: { count: 7200, delay: 500 } } }
修改$DRILL_SITE/drill-on-yarn.conf
# Drillbit资源配置 drillbit: { heap: "4G" # Java heap size max-direct-memory: "8G" memory-mb: 12288 # 单位MB,container使用的内存,通常来讲等于heap+max-direct-memory,可是建议大于这个值 vcores: 4 # cpu个数 } # Drillbit集群组配置 cluster: [ { name: "mypool" type: "basic" # 可选的有basic和labeled,basic表示在YARN集群上任意可用的container上启动drillbits;labeled在一组特定labeled的容器中启动drillbits count: 1 # 启动的YARN容器个数 } ] # 配置drill发行包所在的位置 drill-install: { client-path: "/path/to/drill/apache-drill-1.14.0.tar.gz" # dir-name: "drill" } # 设置分布式文件系统位置 dfs: { connection: "hdfs://ip:port/" dir: "/user/drill" } # Drill-on-YARN Web界面配置 drill.yarn:{ http: { port: 8048 } } # Drill-on-YARN Web界面安全配置 drill.yarn.http: { auth-type: "simple" user-name: "drill" // 注意,drill-on-yan-example.conf默认是user_name,这是错误的,要改为user-name password: "drill" }
说明:
附上完整的配置
drill.yarn: { app-name: "Drill-on-YARN" dfs: { connection: "hdfs://11.162.91.196:9000/" app-dir: "/users/drill" } yarn: { queue: "default" } drill-install: { client-path: "/home/admin/drill/apache-drill-1.14.0.tar.gz" # dir-name: "drill" # library-path: "/opt/libs" } am: { heap: "450M" memory-mb: 512 # node-label-expr: "drill-am" } http: { port: 8048 # ssl-enabled: true auth-type: "simple" user-ame: "drill" password: "drill" rest-key="" } drillbit: { heap: "3G" max-direct-memory: "1G" code-cache: "1G" memory-mb: 4096 vcores: 2 # disks: 3 classpath: "" } cluster: [ { name: "drill-group1" type: "basic" count: 3 } ] }
启动
$DRILL_HOME/bin/drill-on-yarn.sh --site $DRILL_SITE start
接下来,就会看到启动日志
Connecting to DFS... Connected. Using existing Drill archive in DFS: /users/drill/apache-drill-1.14.0.tar.gz Uploading site directory /home/admin/drill/apache-drill-1.14.0/bin/../../site to /users/drill/site.tar.gz ... Uploaded. Loading YARN Config... Loaded. Application ID: application_1533475543014_0005 Launching Drill-on-YARN....................... Tracking URL: http://dtshow011162091196.zth:8088/proxy/application_1533475543014_0005/ Application Master URL: http://11.163.210.105:8048/
从上面的命令能够看到,会首先把apache-drill-1.14.0.tar.gz和site目录打成的site.tar.gz上传至HDFS,而后加载YARN的配置,最后启动Drill
除了启动命令外,drill-on-yarn.sh还提供了status、stop、resize、clean命令,好比status
Application ID: application_1533475543014_0005 Application State: RUNNING Host: dtshow011163210105.zth/11.163.210.105 Queue: default User: admin Start Time: 2018-08-19 20:51:55 Application Name: Drill-on-YARN Tracking URL: http://dtshow011162091196.zth:8088/proxy/application_1533475543014_0005/ AM State: LIVE Target Drillbit Count: 3 Live Drillbit Count: 3 Unmanaged Drillbit Count: 0 Blacklisted Node Count: 0 Free Node Count: 0 For more information, visit: http://11.163.210.105:8048/
启动成功后,即可以访问http://11.163.210.105:8048/,效果以下图:
用户名和密码就是以前配置的drill、drill,除此以外,此页面提供了以下功能:
至此,你已经成功的把Drill部署在YARN上面了,一样能够经过访问Drill的Web UI来执行查询测试,效果以下图:
相对于独立集群部署,Drill-on-YARN简化了Drill的部署,此外也容易升级和对新功能测试。其次,YARN做为资源协调者,也相对简化了Drill的资源管理,由于在启动Drill时,YARN已经知道Drill可能会使用的资源,后续有其余任务提交到YARN集群时,会对Drill的这部分资源比较敏感,防止过分分配给其余的任务。