为了账号安全,请及时绑定邮箱和手机立即绑定

Presto On Yarn 部署示例

标签:
大数据

Presto是我们所熟知的数据查询引擎,它本身的部署也是非常的简单。但是有时候我们可能会有这样的需求,比如需要动态的对Presto集群进行扩容,需要对集群的资源进行统一的管理。我们需要一个Presto On Yarn的解决方案。

Yarn是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。所以把Presto的应用提交到Yarn上可以帮助我们对Presto所需的资源进行统一管理,同时还可以根据业务需求对集群进行动态的容量控制。

需要注意的是Presto不像Spark那样默认就支持YARN,它需要借助于Slider才能实现Presto on Yarn。

Presto On Yarn 安装

根据官方文档整理步骤如下:

安装步骤:

  1. 编译presto on yarn
    下载地址:https://github.com/prestodb/presto-yarn/
    编译时指定presto的版本即可,如mvn clean package -Dpresto.version=0.2.13
    presto-yarn-packagetarget目录下找到presto-yarn-package-1.6-SNAPSHOT-0.213.zip,在该压缩包下包含presto的压缩包

  2. 编译slider
    下载地址:https://archive.apache.org/dist/incubator/slider/
    选择最新的0.92版本,编译前需更改slider的pom文件,修改对应的java版本和hadoop版本,编译 mvn clean package -DskipTests
    slider-assembly\target目录下找到编译完成后的包slider-0.92.0-incubating-all.tar.gz

  3. 配置slider

    将slider提交到相关机器,解压缩。需配置两个文件 slider-env.shslider-client.xml

    # slider-env.sh
    
    export JAVA_HOME=${JAVA_HOME}#如果未配置环境变量需配置该属性
    export HADOOP_CONF_DIR=${HADOOP_CONF_DIR}#如果未配置环境变量需配置该属性
    
   <!-- slider-client.xml -->
   <configuration>
   
       <property>
         <name>slider.client.resource.origin</name>
         <value>conf/slider-client.xml</value>
         <description>This is just for diagnostics</description>
       </property>
   
       <property>
         <name>slider.security.protocol.acl</name>
         <value>*</value>
         <description>When security is enabled, set appropriate acl. Default value means allow everyone.</description>
       </property>
   
       <property>
         <name>slider.yarn.queue</name>
         <value/>
         <description>the name of the YARN queue to use.</description>
       </property>
   
       <property>
         <name>slider.yarn.queue.priority</name>
         <value>1</value>
         <description>the priority of the application.</description>
       </property>
   
       <property>
         <name>slider.am.login.keytab.required</name>
         <value>false</value>
         <description>Declare that a keytab must be provided.</description>
       </property>
       <!-- 这里需注意,slider默认需要zookeeper的支持。所以这里必须要填 -->
       <property>
         <name>slider.zookeeper.quorum</name>
         <value>{zookeeper.uri}</value>
       </property>
       <property>
         <name>fs.defaultFS</name>
         <value>hdfs://mycluster/</value>
       </property>
   
   </configuration>
  1. 配置presto
    解压presto-yarn-package,获取其中的appConfig-default.jsonresources-default.json。这两个配置为presto在yarn上相关的资源配置。相关配置参照官方配置说明:https://prestodb.io/presto-yarn/installation-yarn-configuration-options.html

    # appConfig-default.json
    {
      "schema": "http://example.org/specification/v2.0.0",
      "metadata": {
      },
      "global": {
        "site.global.app_user": "yarn",
        "site.global.user_group": "hadoop",
        "site.global.data_dir": "/export/data/soft/presto-yarn/data",# 需在每台节点上手动创建该目录,并对app_user赋权
        "site.global.config_dir": "/export/data/soft/presto-yarn/etc",# 需在每台节点上手动创建该目录,并对app_user赋权
        "site.global.app_name": "presto-server-0.213",
        "site.global.app_pkg_plugin": "${AGENT_WORK_ROOT}/app/definition/package/plugins/",
        "site.global.singlenode": "false",
        "site.global.coordinator_host": "${COORDINATOR_HOST}",
        "site.global.presto_query_max_memory": "3GB",# 自行指定相关配置
        "site.global.presto_query_max_memory_per_node": "600MB",
        "site.global.presto_server_port": "20770",# 指定coordinator端口
    
        "site.global.catalog": "{'tpch': ['connector.name=tpch']}",# 指定初始的catalog
        "site.global.jvm_args": "['-server', '-Xmx1024M', '-XX:+UseG1GC', '-XX:G1HeapRegionSize=32M', '-XX:+UseGCOverheadLimit', '-XX:+ExplicitGCInvokesConcurrent', '-XX:+HeapDumpOnOutOfMemoryError', '-XX:OnOutOfMemoryError=kill -9 %p']",
        "site.global.log_properties": "['com.facebook.presto=INFO']",#指定日志信息
    
        "application.def": ".slider/package/presto/presto-yarn-package-1.5-0.213.zip",#默认即可
        "java_home": "/export/data/soft/java"# 指定java home
      },
      "components": {
        "slider-appmaster": {
          "jvm.heapsize": "1024M"
        }
      }
    }
    
   # resources.json
   {
     "schema": "http://example.org/specification/v2.0.0",
     "metadata": {
     },
     "global": {
       "yarn.vcores": "1"
     },
     "components": {
       "slider-appmaster": {
       },
       "COORDINATOR": {
         "yarn.role.priority": "1",
         "yarn.component.instances": "1",# coordinator节点启动时container个数
         "yarn.component.placement.policy": "1",
         "yarn.memory": "1500",# 指定yarn分配的资源
         "yarn.label.expression": "coordinator" # 指定在yarn上的label(此处可用于固定coordinator节点,便于对外提供服务。)
       },
       "WORKER": {
         "yarn.role.priority": "2",
         "yarn.component.instances": "3",# worker节点启动时container个数,需要注意的是,两者个数不能多余集群的数量,因为需要绑定端口,多余集群数据会绑定失败而退出
         "yarn.component.placement.policy": "1",
         "yarn.memory": "1500",# 指定yarn分配的资源
         "yarn.label.expression": "worker"
       }
     }
   }
  1. 使用slider安装presto on yarn
    在hdfs创建/user/xxx/目录。
    执行slider package --install --name presto --package presto-yarn-package-1.6-SNAPSHOT-0.213.zip
  2. 启动Presto on Yarn
    slider create presto-query --template appConfig.json --resources resources.json
    在yarn的后台可见presto的application

由于coordinator的ip不固定,所以presto on yarn的部署还不算完成。

对于Presto on Yarn的coordinator 固定有两种解决方案:

  1. 通过对机器打lable的方式,将coordinator固定到某一台机器
  2. presto coordinator的发现依赖于discovery server。可以将discovery server单独部署到某台机器上。连接presto时先通过discovery server获得coordinator节点的地址

通过label的方式在上面的配置上已经展示了,下面介绍单独部署discovery server的方式。

Discovery Server 单独安装

  1. 下载并编译Discovery Serverhttps://github.com/airlift/discovery
  2. 部署Discovery Server,它的配置和presto的配置类似,需要手动创建etc文件夹和config.propertiesnode.propertiesjvm.configlog.properties等。
  3. 通过bin/launcher start启动 discovery server,可通过jps查看到相关进程

然后修改presto-on-yarn的配置模板, 位于目录package\templates中。有:

config.properties-COORDINATOR.j2

config.properties-WORKER.j2

node.properties.j2

queues.json.j2

其中我们需要关注config.propertiesnode.properties,该文件的生成就依赖于我们前面的appConfig.json。同样的我们也可以添加我们自定义的配置,需要更改配置读取的python文件。

示例如下:

# config.properties-COORDINATOR.j2
coordinator=true
node-scheduler.include-coordinator={{singlenode}}
discovery-server.enabled=true
http-server.http.port={{presto_server_port}}
query.max-memory={{presto_query_max_memory}}
query.max-memory-per-node={{presto_query_max_memory_per_node}}
query.queue-config-file={{conf_dir}}/queues.json
discovery.uri=http://{{discovery_host}}:{{discovery_port}} #因为我们单独提出了discovery server所以需要添加discovery相关的配置

修改package/scripts/params.py,添加新增配置文件的获取

from resource_management import *
import uuid

# server configurations
config = Script.get_config()

java8_home = config['hostLevelParams']['java_home']

app_root = config['configurations']['global']['app_root']
app_name = config['configurations']['global']['app_name']

presto_root = format("{app_root}/{app_name}")
conf_dir = default('/configurations/global/config_dir', format("{presto_root}/etc"))

catalog_dir = format("{conf_dir}/catalog")
presto_plugin_dir = format("{presto_root}/plugin")
source_plugin_dir = config['configurations']['global']['app_pkg_plugin']
addon_plugins = default('/configurations/global/plugin', '')

presto_user = config['configurations']['global']['app_user']
user_group = config['configurations']['global']['user_group']

data_dir = config['configurations']['global']['data_dir']
pid_dir = format("{data_dir}/var/run")
pid_file = format("{pid_dir}/slider_launcher.pid")
log_dir = format("{data_dir}/var/log")
log_file = format("{log_dir}/server.log")

singlenode = config['configurations']['global']['singlenode']
coordinator_host = config['configurations']['global']['coordinator_host']
presto_query_max_memory = config['configurations']['global']['presto_query_max_memory']
presto_query_max_memory_per_node = config['configurations']['global']['presto_query_max_memory_per_node']
presto_server_port = config['configurations']['global']['presto_server_port']
jvm_args = default('/configurations/global/jvm_args', '')
log_properties = default('/configurations/global/log_properties', '')

# 新增配置,对应appConfig.json中的site.global.discovery_host和site.global.discovery_port
discovery_port = config['configurations']['global']['discovery_port']
discovery_host= config['configurations']['global']['discovery_host']

node_id = uuid.uuid1()

catalog_properties = default('/configurations/global/catalog', '')
additional_config_properties=default('/configurations/global/additional_config_properties', '')
additional_node_properties=default('/configurations/global/additional_node_properties', '')

部署完成之后,我们就可以通过discover server获取presto相关的服务了。可以通过http://discover_host:discovery_port/v1/service/presto获取到presto所有的节点信息,通过内容判断是否为coordinator

Slider命令示例

基于slider部署的presto集群可以通过slider相关的命令动态的调整集群容量,获取运行状态等等。可以通过./slider命令进行查看。

# 管理 applicaiton
bin/slider status presto-query 
bin/slider start presto-query
bin/slider stop presto-query

# 查看 coordinator 部署在哪个节点,可以作为-- server 参数提供给 presto-cli 使用
bin/slider registry --name presto-query --getexp presto

# 销毁 applicaiton
bin/slider destroy presto-query --force

# 删除 presto-yarn-package
bin/slider package --delete --name PRESTO

# 动态调整 applicaiton,增加或删除 WORKER 数
bin/slider flex presto-query --component WORKER 2

到现在我们的Presto On Yarn已经部署完成了。

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消