Presto是我们所熟知的数据查询引擎,它本身的部署也是非常的简单。但是有时候我们可能会有这样的需求,比如需要动态的对Presto集群进行扩容,需要对集群的资源进行统一的管理。我们需要一个Presto On Yarn的解决方案。
Yarn是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。所以把Presto的应用提交到Yarn上可以帮助我们对Presto所需的资源进行统一管理,同时还可以根据业务需求对集群进行动态的容量控制。
需要注意的是Presto不像Spark那样默认就支持YARN,它需要借助于Slider才能实现Presto on Yarn。
Presto On Yarn 安装
根据官方文档整理步骤如下:
安装步骤:
-
编译presto on yarn
下载地址:https://github.com/prestodb/presto-yarn/
编译时指定presto的版本即可,如mvn clean package -Dpresto.version=0.2.13
在presto-yarn-package
的target
目录下找到presto-yarn-package-1.6-SNAPSHOT-0.213.zip
,在该压缩包下包含presto的压缩包 -
编译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
-
配置slider
将slider提交到相关机器,解压缩。需配置两个文件
slider-env.sh
和slider-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>
-
配置presto
解压presto-yarn-package
,获取其中的appConfig-default.json
和resources-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"
}
}
}
- 使用slider安装
presto on yarn
在hdfs创建/user/xxx/
目录。
执行slider package --install --name presto --package presto-yarn-package-1.6-SNAPSHOT-0.213.zip
- 启动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 固定有两种解决方案:
- 通过对机器打lable的方式,将coordinator固定到某一台机器
- presto coordinator的发现依赖于discovery server。可以将discovery server单独部署到某台机器上。连接presto时先通过discovery server获得coordinator节点的地址
通过label的方式在上面的配置上已经展示了,下面介绍单独部署discovery server的方式。
Discovery Server 单独安装
- 下载并编译
Discovery Server
:https://github.com/airlift/discovery - 部署
Discovery Server
,它的配置和presto的配置类似,需要手动创建etc文件夹和config.properties
、node.properties
、jvm.config
、log.properties
等。 - 通过
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.properties
和node.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已经部署完成了。
共同学习,写下你的评论
评论加载中...
作者其他优质文章