Drill-on-YARN之部署

简介: 1. 概要 Drill是Apache旗下的一个开源SQL查询引擎,可用于探索大数据。它的设计初衷是为了支持对大数据的高性能分析,同时支持行业标准查询语言ANSI SQL。 在Drill 1.13之前,Drill只支持独立集群部署,部署成功后每个节点上会运行一个名为Dirllbit的守护进程。

1. 概要

Drill是Apache旗下的一个开源SQL查询引擎,可用于探索大数据。它的设计初衷是为了支持对大数据的高性能分析,同时支持行业标准查询语言ANSI SQL。

在Drill 1.13之前,Drill只支持独立集群部署,部署成功后每个节点上会运行一个名为Dirllbit的守护进程。从1.13版本开始,Drill支持与YARN集成来管理资源。使用YARN后,Drill将成为一个运行在YARN上的长进程。当您启动Drill时,YARN会自动将Drill软件部署到每个节点上,避免了在每个节点上安装Drill的繁琐。除此之外,资源管理也会得到简化,因为YARN对于Drill使用的资源是敏感的。

目前所有YARN发行版都提供了内存和CPU(YARN称为“vcores”)的设置,某些发行版还提供磁盘的设置。对于内存,在把Drill部署在YARN上的时候,你会配置Drill要使用的内存,然告知YARN。此外,Drill将使用所有可用的磁盘和CPU,当然可以启用Linux cgroup来限制Drill对CPU使用的,以到匹配YARN的vcores分配。

为了方便讲解在YARN下部署Drill,先简单介绍YARN的核心概念。

2. YARN核心概念

YARN全称是Yet Another Resource Negotiator(另一种资源协调者),是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度。

2.1 核心组件

  1. ResurceManager(RM):一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。
  2. ApplicationMaster(AM):用户提交的每个应用程序均包含一个AM,主要功能包括

    • 与RM调度器协商以获取资源(以Container表示)
    • 与NM通信以启动/停止任务
    • 监控所有任务运行状态,并在任务失败时重新为任务申请资源以重启任务
  3. Container :Container是YARN中的资源抽象,它封装了某个节点上的多维资源,如CPU、内存、磁盘、络等。当AM向RM申请资源时,RM向AM返回的资源便是用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。Container是一个动态资源划分单位,是根据应用程序的需求自动生成的。
  4. NodeManager(NM) :NM是每个节点上的资源和任务管理器。一方面,它定时地向RM汇报本节点的资源使用情况和Container运行状态;另一方面,它接受并处理来自AM的Container启动/停止等各种请求。
  5. 客户端(Client):是集群中一个能向RM提交应用的实例,并且指定了执行应用所需要的AM类型。

2.2 YARN工作流程

当用户向YARN中提交一个任务后,YARN将分两个阶段运行该任务:第一阶段是启动AM。第二阶段是由AM创建任务,为它申请资源,并监控它的整个运行过程,直到运行完成。具体如下:

  1. 用户向YARN中提交任务,其中包括AM程序、启动AM的命令等。
  2. RM为该应用程序分配第一个Container,通常称为001,并与对应的NM通信,要求它在这个Container中启动应用程序的AM。
  3. AM首先RM注册,这样用户就可以直接通过RM查看任务的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
  4. AM采用轮询的方式通过RPC协议向RM申请和领取资源。
  5. 一旦AM申请到资源后,便与对应的NM通信,要求它启动任务。
  6. NM为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
  7. 各个任务通过RPC协议向AM汇报自己的状态和进度,以让AM随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
  8. 应用程序运行完成后,AM向RM注销并关闭自己。

YARN工作流程

2.3 如何编写YARN应用程序

  1. 编写客户端
  • 初始化并启动一个YarnClient
// 初始化并启动一个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);
  1. 编写ApplicationMaster(AM)
  • 初始化AMRMClient,有同步和异步可选
// 初始化AMRMClientAsync
YarnConfiguration yarnConfig = new YarnConfiguration();
AMRMClientAsync amrmClientAsync = AMRMClientAsync.createAMRMClientAsync(5000, new AMRMCallbackHandler());
amrmClientAsync.init(yarnConfig);
amrmClientAsync.start();
  • 初始化NMClient,有同步和异步可选
// 初始化NMClientAsync
YarnConfiguration yarnConfig = new YarnConfiguration();
NMClientAsync nmClientAsync = NMClientAsync.createNMClientAsync(new NMCallbackHandler());
nmClientAsync.init(yarnConfig);
nmClientAsync.start();
  • 注册ApplicationMaster(AM)
// 注册ApplicationMaster(AM)
amrmClientAsync.registerApplicationMaster(thisHostName, 0, "");
...
  • 添加ContainerRequest
// 添加ContainerRequest
amrmClientAsync.addContainerRequest(containerRequest);
...
  • 启动容器
// 启动容器
nmClientAsync.startContainerAsync(container, containerContext);
...
  • 注销
// 注销
amrmClientAsync.unregisterApplicationMaster(appStatus, appMessage, null);

这里只是简单介绍了YARN的概念,以及如何编写YARN应用程序,详情可以参考Apache Hadoop YARN

3. Drill-on-YARN部署

3.1 Drill-on-YARN组件

  1. Drill发行包: Drill-on-YARN上传此发行包至分布式文件系统(如HDFS)。YARN下载它到每个工作节点(即是Node Manager所在的节点)
  2. Drill site目录: 一个包含Drill配置问和自定义jar包的目录。Drill-on-YARN会拷贝它至每个工作节点
  3. 配置:一个用于告知Drill-on-YARN如何管理Drill集群的配置文件。这个文件和drill本身的配置文件互相独立
  4. Drill-on-YARN client: Drill-on-YARN客户端,提供了启动、停止、监控等命令
  5. Drill Application Master (AM):用于和YARN交互,包括:请求资源、启动Drillbits等。AM还提供了web界面用于管理Drill集群
  6. Drillbit: 运行在每个节点的Drill守护进程

3.2. 部署步骤

YARN通过客户端来启动应用程序。对于Drill来说,就是Drill-on-YARN客户端了。客户端可以在任何机器上,只要该机器同时有Drill和Hadoop软件。使用YARN部署Drill时,您只需要在客户端计算机上安装Drill,Drill-on-YARN会自动部署到其它节点。需要注意的是,当你不使用YARN部署Drill时,一般会将其配置文件和自定义代码放在Drill的目录中,但是在YARN下运行时,建议所有配置和自定义代码都会放在一个名为site的目录中,勿改变Drill目录中的任何内容。

接下来详细说明部署步骤:

  1. 部署的环境

    • JDK8+
    • Zookeeper集群
    • Hadoop集群

    关于jdk、zookeeper、hadoop的部署,不做赘述了,记得设置JAVA_HOME、HADOOP_HOME

  2. 创建一个目录,用于放置下载好的Drill发行包

    export DRILL_DIR=/path/to/drill
    mkdir -p $DRILL_DIR
    cd $DRILL_DIR

    说明:执行完上面的命令后,所处的目录为/path/to/drill

  3. 下载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很重要,后面启动的时候和名字有关系

  4. 创建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 

    说明:

    • 对于自定义代码,一般都是打成jar包,放置在$DRILL_SITE/jars。比如自定义的udf,可以放在$DRILL_SITE/jars/3rdparty
    • 不要拷贝drill-override-example.conf整个文件,仅仅拷贝需要的配置,然后进行修改
  5. 修改$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
          }
      }
    }
  6. 修改$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"
    }  

    说明:

    1. 关于Drillbit资源配置中的heap和max-direct-memory,在非YARN下部署,是修改$DRILL_HOME/conf/drillenv.sh文件,但是在YARN下部署,是修改$DRILL_SITE/drill-on-yarn.conf。但是,如果你已经在drillenv.sh配置了,则drillenv.sh优先。
    2. Drillbit集群组配置,虽然是个list,但目前只支持配置一个
    3. dir-name特别说明,当你client-path解压出来的文件,目录是apache-drill-1.14.0时,不需要配置dir-name,反之如果不是,请把解压出来的文件目录名配上
    4. Web界面安全配置的auth-type支持simple和drill两种,使用simple,需要指定用户名和密码,使用drill说明用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
        }
      ]
    }
  7. 启动

    $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-on-YARN运维页面

    用户名和密码就是之前配置的drill、drill,除此之外,此页面提供了如下功能:

    1. 集群状态总览
    2. 完整的启动配置
    3. 正在运行的Drillbits列表
    4. 简单的操作来调整集群
    5. 一个展示停止的、被kill的、失败的Drillbits历史页面,可以用它来诊断问题

    至此,你已经成功的把Drill部署在YARN上面了,同样可以通过访问Drill的Web UI来执行查询测试,效果如下图:

Drill页面

Drill页面查询

4. 总结

相对于独立集群部署,Drill-on-YARN简化了Drill的部署,此外也容易升级和对新功能测试。其次,YARN作为资源协调者,也相对简化了Drill的资源管理,因为在启动Drill时,YARN已经知道Drill可能会使用的资源,后续有其他任务提交到YARN集群时,会对Drill的这部分资源比较敏感,防止过度分配给其他的任务。

目录
相关文章
|
资源调度 分布式计算 安全
YARN Capacity Scheduler容量调度器(超详细解读)
YARN Capacity Scheduler容量调度器(超详细解读)
1211 0
YARN Capacity Scheduler容量调度器(超详细解读)
|
弹性计算 黑灰产治理
阿里云服务器续费流程及续费优惠券使用介绍(2023更新)
阿里云服务器怎么续费?新老用户分别有什么优惠?目前新用户续费阿里云服务器指定ECS实例可享4.5折优惠折扣,老用户开通包年自动续费享1次6.5折,开通包月自动续费享3次7.5折,现在续费还可以领取和使用阿里云续费优惠券,本文为大家介绍一下阿里云服务器续费流程及续费过程中如何使用续费优惠券。
4401 0
阿里云服务器续费流程及续费优惠券使用介绍(2023更新)
|
存储 Cloud Native 数据库
云原生多模数据库Lindorm权威指南|从入门到精通(持续更新 v2021.2)
Lindorm是阿里云发布的业界首款云原生多模数据库,支持宽表、时序、文件等多种类型海量数据的低成本存储、检索与分析,兼容HBase/Cassandra、OpenTSDB、Solr、SQL、HDFS等多种开源标准接口,希望通过本指南,可以给开发者给更多的了解和使用指导,本文将持续更新
10189 2
云原生多模数据库Lindorm权威指南|从入门到精通(持续更新 v2021.2)
|
移动开发 JavaScript 前端开发
性能优化之使用vue-worker插件(基于Web Worker)开启多线程运算提高效率
性能优化之使用vue-worker插件(基于Web Worker)开启多线程运算提高效率
30261 1
|
11月前
|
人工智能 自然语言处理 测试技术
GPT-4 API 接口调用及价格分析
对开发者来说,GPT-4最激动人心的是API接口同步发布。我今天获得了API访问权限,本文将跟大家分享GPT-4 API接口的使用以及大家关心的价格分析。
9507 1
GPT-4 API 接口调用及价格分析
|
Cloud Native 安全 自动驾驶
全新升级!《云原生架构白皮书 2022 版》重磅发布
今年,《云原生架构白皮书2022版》正式上线,相较于2020年版本,本次内容新增数十家企业实战经验合集,同时在云原生产品矩阵中,新增多个核心产品家族,如容器产品家族、微服务产品家族、云原生技术中台 CNStack 产品家族等,更加一站式助力企业数字化转型。
7104 1
全新升级!《云原生架构白皮书 2022 版》重磅发布
|
人工智能 缓存 Kubernetes
Kubernetes在AI/大数据领域的 最新进展与大规模实践
根据在[CNCC 2022开源分布式云原生系统技术发展](https://ccf.org.cn/cncc2022/schedule_d_4075)论坛的演讲整理。 ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/08cde176-d1d3-49ae-a1f7-cc025d3f06f3.png) 在云计算技术快速发展的过
1116 0
Kubernetes在AI/大数据领域的最新进展与大规模实践
|
编解码 移动开发 JavaScript
Vite 与 Vue Cli 对比 - 尤雨溪: Vite 会取代 vue-cli 吗?
尤雨溪在发布 Vite 之后写了一条推,感觉不会在用 webpack 了(Vue-cli 基于 Webpack 开发,并配置了 Webpack 打包规则),Sean 是 Webpack 核心开发者,会一些中文,在尤大这条下面直接感叹。Vue-cli 一直是 Vue 2 默认官方脚手架工具,Vue-cli 基于 Webpack 开发。Vue 3 发布后,尤大同时发布了 Vite ,那么 Vue 3 同时有两个前端打包工具 Vite 和 Vue CLI,那么他们俩应该怎么选呢?
2552 0
|
消息中间件 分布式计算 资源调度
hadoop集群部署(yarn)
伴随着各大互联网公司开源自己的大数据框架,大数据处理领域的框架已经比较完善。到现在所谓大数据的框架已经用过habase(后来换成了elasticsearch)、zookeeper、kafka、storm,根据项目计划,接下来还要使用spark。
436 0

相关实验场景

更多