Greenplum PL/Container语言扩展
Greenplum PL/Container语言扩展
本节包括有关PL/Container 1.1及更高版本的以下信息:
- 关于PL/Container语言扩展
- 关于PL/Container资源管理
- PL/Container Docker镜像
- #topic_qbl_dkq_vcb
- #topic_upg110
- 卸载PL/Container
- 使用PL/Container函数
- 关于PL/Container运行PL/Python
- 关于PL/Container运行PL/R
- 配置PL/Container
- 安装Docker
- 参考
关于PL/Container语言扩展
Greenplum数据库PL/Container语言扩展(PL/Container)是一个接口,允许Greenplum数据库与Docker容器交互以在容器中执行用户定义的函数(UDF)。 Docker容器确保用户代码无法访问源主机的文件系统。 此外,容器在没有网络访问或网络访问受限的情况下启动,无法连接回Greenplum数据库或打开任何其他外部连接。 有关可用UDF语言的信息,请参阅PL/Container Docker镜像。
一般来说,Docker容器是一个Linux进程,它使用Linux内核功能(如cgroup,命名空间和联合文件系统)以托管方式运行。 Docker镜像是容器的基础。 Docker容器是Docker镜像的运行实例。 启动Docker容器时,指定Docker镜像。 Docker镜像是在主机系统上运行Docker容器时使用的根文件系统更改和执行参数的集合。 镜像没有状态,永远不会改变。 有关Docker的信息,请访问Docker网站https://www.docker.com/。
Greenplum数据库仅在第一次调用该容器中的函数时启动容器。 例如,考虑使用所有可用segment选择表数据的查询,并使用PL/Container函数对数据应用转换。 在这种情况下,Greenplum数据库将在每个segment上仅启动Docker容器一次,然后联系正在运行的容器以获取结果。
在开始查询执行的完整循环之后,执行程序向容器发送调用。 容器可能会响应容器执行的SPI-SQL查询,以从数据库中获取一些数据,并将结果返回给查询执行器。
当与其连接关闭时,容器将关闭。 当您关闭启动容器的Greenplum数据库会话时会发生这种情况。 在待机模式下运行的容器几乎不消耗CPU资源,因为它在套接字上等待。 PL/Container内存消耗取决于您在全局词典中缓存的数据量。
PL/Container语言扩展可用作开源模块。 有关该模块的信息,请参阅位于https://github.com/greenplum-db/plcontainer的GitHub存储库中的README文件。
关于PL/Container资源管理
Greenplum数据库在Docker容器中运行PL/Container用户定义的函数。 Docker容器和Greenplum数据库服务器共享相同主机上的CPU和内存资源。 在默认情况下,Greenplum数据库不知道运行PL/Container实例所消耗的资源。 在PL/Container 1.2及更高版本中,您可以使用Greenplum数据库资源组来控制运行PL/Container实例的总体CPU和内存资源使用情况,如以下部分所述。
PL/Container管理两个级别的资源使用 - 容器级别和runtime级别。 您可以使用为PL/Container runtime配置的memory_mb和cpu_share设置来控制容器级CPU和内存资源。 memory_mb控制每个容器实例可用的内存资源。 cpu_share设置标识容器与其他容器相比的CPU使用率的相对权重。 有关PL/Container配置信息,请参阅PL/Container配置文件。
默认情况下,您不能限制执行PL/Container容器实例的数量,也不能限制它们使用的内存或CPU资源总量。
使用资源组管理PL/Container资源
在PL/Container 1.2.0及更高版本中,您可以使用Greenplum数据库资源组来管理和限制PL/Container runtime中容器的总CPU和内存资源。 有关启用,配置和使用Greenplum数据库资源组的更多信息, 请参阅Greenplum数据库管理员指南中的使用资源组。
外部组件(如PL/Container)的资源组使用Linux控制组(cgroup)来管理组件级内存和CPU资源的使用。 使用资源组管理PL/Container资源时,可以配置Greenplum数据库应用于共享相同PL/Container runtime配置的所有容器实例的内存限制和CPU限制。
CREATE RESOURCE GROUP plpy_run1_rg WITH (MEMORY_AUDITOR=cgroup, CONCURRENCY=0, CPU_RATE_LIMIT=10, MEMORY_LIMIT=10);
PL/Container不使用MEMORY_SHARED_QUOTA和MEMORY_SPILL_RATIO资源组内存限制。 有关此SQL命令的详细信息,请参阅CREATE RESOURCE GROUP参考页。
SELECT groupname, groupid FROM gp_toolkit.gp_resgroup_config WHERE groupname='plpy_run1_rg'; groupname | groupid --------------+---------- plpy_run1_rg | 16391 (1 row)
plcontainer runtime-add -r python_run1 -i pivotaldata/plcontainer_python_shared:devel -l python -s resource_group_id=16391
您还可以使用plcontainer runtime-edit命令将资源组分配给PL/Container runtime。 有关plcontainer命令的信息,请参阅plcontainer实用程序。
将资源组分配给PL/Container runtime后,共享相同runtime配置的所有容器实例都受为组配置的内存和CPU的限制。 如果减小PL/Container资源组的内存限制,则在组内运行容器中执行的查询可能会因内存不足而失败。 如果在运行容器实例时删除PL/Container资源组,Greenplum数据库会终止正在运行的容器。
为PL/Container配置资源组
要使用Greenplum数据库资源组来管理PL/Container资源,必须显式配置资源组和PL/Container。
过程
执行以下过程以配置PL/Container以使用Greenplum数据库资源组进行CPU和内存资源管理:
- 如果尚未在Greenplum数据库部署中配置和启用资源组,
请按照Greenplum数据库管理员指南中的使用资源组中的说明配置cgroup并启用Greenplum数据库资源组。
Note: 如果先前已在部署中配置并启用了资源组,请确保Greenplum数据库资源组gpdb.conf cgroups配置文件包含内存{}块,如上一个链接中所述。
- 分析Greenplum数据库部署的资源使用情况。 确定要分配给PL/Container Docker容器的资源组CPU和内存资源的百分比。
- 确定如何在PL/Container runtime中分配您在上一步中确定的总PL/Container CPU和内存资源。确认:
- 您需要的PL/Container资源组的数量。
- 分配给每个资源组的内存和CPU资源的百分比。
- 资源组到PL/Container runtime分配。
- 创建您在上面的步骤中标识的PL/Container资源组。
例如,假设您选择将25% Greenplum数据库的内存和CPU资源分配给PL/Container。
如果进一步将这些资源拆分为2个资源组60/40,则以下SQL命令将创建资源组:
CREATE RESOURCE GROUP plr_run1_rg WITH (MEMORY_AUDITOR=cgroup, CONCURRENCY=0, CPU_RATE_LIMIT=15, MEMORY_LIMIT=15); CREATE RESOURCE GROUP plpy_run1_rg WITH (MEMORY_AUDITOR=cgroup, CONCURRENCY=0, CPU_RATE_LIMIT=10, MEMORY_LIMIT=10);
- 查找并记下与您创建的每个资源组关联的groupid。例如:
SELECT groupname, groupid FROM gp_toolkit.gp_resgroup_config WHERE groupname IN ('plpy_run1_rg', 'plr_run1_rg'); groupname | groupid --------------+---------- plpy_run1_rg | 16391 plr_run1_rg | 16393 (1 row)
- 将您创建的每个资源组分配给所需的PL/Container runtime配置。
如果尚未创建runtime配置,请使用plcontainer runtime-add命令。
如果runtime已存在,请使用plcontainer runtime-replace或plcontainer runtime-edit命令将资源组分配添加到runtime配置。
例如:
plcontainer runtime-add -r python_run1 -i pivotaldata/plcontainer_python_shared:devel -l python -s resource_group_id=16391 plcontainer runtime-replace -r r_run1 -i pivotaldata/plcontainer_r_shared:devel -l r -s resource_group_id=16393
有关plcontainer命令的信息,请参阅plcontainer实用程序。
PL/Container Docker镜像
PL/Python镜像和PL/R镜像可从Pivotal Network的Greenplum数据库产品下载站点获得,网址为https://network.pivotal.io/。
- 用于Python的PL/Container - 安装了Python 2.7.12的Docker镜像。
还安装了Python数据科学模块。 该模块包含一组与数据科学相关的python库。
- 用于R的PL/Container - 安装了R-3.3.3的容器的Docker镜像。
还安装了R Data Science软件包。该软件包包含一组与数据科学相关的R库。
Docker镜像tag表示PL/Container版本(例如,1.0.0)。 例如,用于Python Docker镜像的PL/Container的完整Docker镜像名称类似于pivotaldata/plc_python_shared:1.0.0。 这是默认PL/Container配置中引用的名称。 此外,您可以创建自定义Docker镜像,安装镜像并将图像添加到PL/Container配置。
前提条件
确保您的Greenplum数据库系统满足以下前提条件:
- Red Hat Enterprise Linux(RHEL)7.x(或更高版本)和CentOS 7.x(或更高版本)上的Greenplum数据库5.2.x支持PL/Container。
Note: RHEL/CentOS 6.x系统不支持PL/Container,因为这些平台不官方支持Docker。
- 这些是Docker主机操作系统的前提条件。
RHEL或CentOS 7.x - 支持的最低Linux操作系统内核版本为3.10。 RHEL 7.x和CentOS 7.x使用此内核版本。
您可以使用命令uname -r检查内核版本
Note: Red Hat提供,维护和支持的Docker版本仅在RHEL 7上可用。 Docker功能开发与RHEL7.x基础架构组件相关,用于内核,设备映射(精简配置,直接lvm),sVirt和systemd。
- Docker安装在Greenplum数据库主机(master,primary和所有standby主机)上
- 对于RHEL或CentOS 7.x - Docker 17.05
请见安装Docker。
- 在每个Greenplum数据库主机上,gpadmin用户应该是docker组的一部分,以便用户能够管理Docker镜像和容器。
安装PL/Container语言扩展
- 确保Greenplum数据库主机满足前提条件,参考前提条件。
- 从源代码构建和安装PL/Container扩展,参考 构建和安装PL/Container语言扩展.
- 安装Docker镜像并配置PL/Container,参考安装PL/Container Docker镜像。
构建和安装PL/Container语言扩展
PL/Container语言扩展可用作开源模块。 有关构建和安装作为Greenplum数据库的一部分的模块信息, 请参阅位于https://github.com/greenplum-db/plcontainer的GitHub存储库中的README文件。
安装PL/Container Docker镜像
PL/Container语言扩展包括plcontainer实用程序,该实用程序在Greenplum数据库主机上安装Docker镜像,并将配置信息添加到PL/Container配置文件。 配置信息允许PL/Container使用Docker镜像创建Docker容器。 有关plcontainer的信息,请参阅plcontainer实用程序。
PL/Container开源模块包含dockerfiles,用于构建可与PL/Container一起使用的Docker镜像。 您可以构建一个Docker镜像来运行PL/Python UDF和一个Docker镜像来运行PL/R UDF。 请参阅GitHub存储库中的dockerfiles,网址为https://github.com/greenplum-db/plcontainer。
在Greenplum数据库主机上安装Docker镜像。 此示例使用plcontainer实用程序为Python安装Docker镜像并更新PL/Container配置。 该示例假定要安装的Docker镜像位于/home/gpadmin中的文件中。
plcontainer image-add -f /home/gpadmin/plcontainer-python-images-1.0.0.tar.gz
该实用程序在Greenplum数据库主机上安装Docker镜像时显示进度信息。
使用plcontainer image-list命令在本地主机上显示已安装的Docker镜像。
plcontainer runtime-add -r plc_py -i pivotaldata/plcontainer_python_shared:devel -l python
该实用程序在更新Greenplum数据库实例上的PL/Container配置文件时显示进度信息。
您可以使用plcontainer runtime-show -r plc_py命令查看PL/Container配置信息。 您可以使用plcontainer runtime-edit命令查看PL/Container配置XML文件。
卸载PL/Container
要卸载PL/Container,请删除Docker容器和镜像,然后从Greenplum数据库中删除PL/Container支持。
删除对PL/Container的支持后,您在数据库中创建的plcontainer用户定义函数将不再起作用。
卸载Docker容器和镜像
在Greenplum数据库主机上,卸载不再需要的Docker容器和镜像。
plcontainer image-list命令列出了安装在本地Greenplum数据库主机上的Docker镜像。
plcontainer image-delete命令从所有Greenplum数据库主机中删除指定的Docker镜像。
- 命令docker ps -a列出主机上的所有容器。命令docker stop关闭容器。
- 命令docker images列出主机上的镜像。
- 命令docker rmi删除镜像。
- 命令docker rm删除容器。
删除数据库的PL/Container支持
对于不再需要PL/Container的数据库,请删除对PL/Container的支持。
PL/Container 1.1及更高版本
psql -d mytest -c 'DROP EXTENSION plcontainer cascade;'
该命令将删除plcontainer扩展并从数据库中删除PL/Container特定的函数和视图。
PL/Container 1.0
以gpadmin用户身份运行plcontainer_uninstall.sql脚本。 例如,此命令删除mytest数据库中的plcontainer语言。
psql -d mytest -f $GPHOME/share/postgresql/plcontainer/plcontainer_uninstall.sql
该脚本使用CASCADE删除plcontainer语言,以从数据库中删除PL/Container特定的函数和视图。
使用PL/Container函数
在Greenplum数据库系统的数据库中启用PL/Container时,语言plcontainer将在数据库中注册。 当您将plcontainer指定为UDF定义中的语言时,可以使用PL/Container Docker镜像支持的过程语言创建和运行用户定义的函数。
使用PL/Container的UDF定义必须包含这些项。
- UDF的第一行必须是# container: ID
- LANGUAGE属性必须是plcontainer
ID是PL/Container用于标识Docker镜像的名称。 当Greenplum数据库在主机上执行UDF时,主机上的Docker镜像用于启动运行UDF的Docker容器。 在XML配置文件plcontainer_configuration.xml中,有一个runtime XML元素, 它包含指定Docker容器启动信息的相应id XML元素。 有关PL/Container如何将ID映射到Docker镜像的信息,请参阅配置PL/Container。 有关示例UDF定义,请参阅示例。
PL/Container配置文件仅在运行PL/Container函数的每个Greenplum数据库会话中第一次调用PL/Container函数时读取。 您可以通过在会话期间对视图plcontainer_refresh_config执行SELECT命令来强制重新读取配置文件。 例如,此SELECT命令强制读取配置文件。
SELECT * FROM plcontainer_refresh_config;
gp_segment_id | plcontainer_refresh_local_config ---------------+---------------------------------- 1 | ok 0 | ok -1 | ok (3 rows)
此外,您可以通过在视图plcontainer_show_config上执行SELECT命令来显示会话中的所有配置。 例如,此SELECT命令返回PL/Container配置。
SELECT * FROM plcontainer_show_config;
INFO: plcontainer: Container 'plc_py_test' configuration INFO: plcontainer: image = 'pivotaldata/plcontainer_python_shared:devel' INFO: plcontainer: memory_mb = '1024' INFO: plcontainer: use container network = 'no' INFO: plcontainer: use container logging = 'no' INFO: plcontainer: shared directory from host '/usr/local/greenplum-db/./bin/plcontainer_clients' to container '/clientdir' INFO: plcontainer: access = readonly ... INFO: plcontainer: Container 'plc_r_example' configuration (seg0 slice3 192.168.180.45:40000 pid=3304) INFO: plcontainer: image = 'pivotaldata/plcontainer_r_without_clients:0.2' (seg0 slice3 192.168.180.45:40000 pid=3304) INFO: plcontainer: memory_mb = '1024' (seg0 slice3 192.168.180.45:40000 pid=3304) INFO: plcontainer: use container network = 'no' (seg0 slice3 192.168.180.45:40000 pid=3304) INFO: plcontainer: use container logging = 'yes' (seg0 slice3 192.168.180.45:40000 pid=3304) INFO: plcontainer: shared directory from host '/usr/local/greenplum-db/bin/plcontainer_clients' to container '/clientdir' (seg0 slice3 192.168.180.45:40000 pid=3304) INFO: plcontainer: access = readonly (seg0 slice3 192.168.180.45:40000 pid=3304) gp_segment_id | plcontainer_show_local_config ---------------+------------------------------- 0 | ok -1 | ok 1 | ok
SELECT * FROM plcontainer_containers_summary();
如果普通(非超级用户)Greenplum数据库用户运行该函数,则该函数仅显示用户创建的容器的信息。 如果Greenplum数据库超级用户运行该函数,则会显示Greenplum数据库用户创建的所有容器的信息。 这是2个容器运行时的示例输出。
SEGMENT_ID | CONTAINER_ID | UP_TIME | OWNER | MEMORY_USAGE(KB) ------------+------------------------------------------------------------------+--------------+---------+------------------ 1 | 693a6cb691f1d2881ec0160a44dae2547a0d5b799875d4ec106c09c97da422ea | Up 8 seconds | gpadmin | 12940 1 | bc9a0c04019c266f6d8269ffe35769d118bfb96ec634549b2b1bd2401ea20158 | Up 2 minutes | gpadmin | 13628 (2 rows)
示例
示例的# container行中的值plc_python_shared和plc_r_shared是plcontainer_config.xml文件中定义的id XML元素。 id元素映射到指定要启动的Docker镜像的image元素。 如果您使用不同的ID配置PL/Container,请更改# container行的值。 有关配置PL/Container和查看配置设置的信息,请参阅配置PL/Container。
CREATE OR REPLACE FUNCTION pylog100() RETURNS double precision AS $$ # container: plc_python_shared import math return math.log10(100) $$ LANGUAGE plcontainer;
CREATE OR REPLACE FUNCTION rlog100() RETURNS text AS $$ # container: plc_r_shared return(log10(100)) $$ LANGUAGE plcontainer;
如果UDF中的# container行指定了不在PL/Container配置文件中的ID, 则当您尝试执行UDF时,Greenplum数据库会返回错误。
关于PL/Container运行PL/Python
在Python语言容器中,实现了模块plpy。 该模块包含以下方法:
- plpy.execute(stmt) - 执行查询字符串stmt并将查询结果返回到字典对象列表中。为了能够访问结果字段,请确保查询返回命名字段。
- plpy.prepare(stmt[, argtypes]) - 准备查询的执行计划。如果在查询中有参数引用,则使用查询字符串和参数类型列表调用它。
- plpy.execute(plan[, argtypes]) - 执行准备好的计划。
- plpy.debug(msg) - 将DEBUG2消息发送到Greenplum数据库日志。
- plpy.log(msg) - 将LOG消息发送到Greenplum数据库日志。
- plpy.info(msg) - 将INFO消息发送到Greenplum数据库日志。
- plpy.notice(msg) - 将NOTICE消息发送到Greenplum数据库日志。
- plpy.warning(msg) - 将WARNING消息发送到Greenplum数据库日志。
- plpy.error(msg) - 将ERROR消息发送到Greenplum数据库日志。 在Greenplum数据库中引发的ERROR消息导致查询停止并回滚事务。
- plpy.fatal(msg) - 将FATAL消息发送到Greenplum数据库日志。 FATAL消息导致关闭Greenplum数据库会话并回滚事务。
- plpy.subtransaction() - 在显式子事务中管理plpy.execute调用。 有关plpy.subtransaction()的其他信息,请参阅PostgreSQL文档中的显式子事务。
如果在嵌套的Python函数调用中引发级别ERROR或FATAL的错误,则该消息包括封闭函数的列表。
- plpy.quote_literal(string) - 返回引用的字符串,用作SQL语句字符串中的字符串文字。 内嵌的单引号和反斜杠正常加倍。 quote_literal()在null输入(空输入)上返回null。 如果参数可能为null,则quote_nullable()可能更合适。
- plpy.quote_nullable(string) - 返回引用的字符串,用作SQL语句字符串中的字符串文字。 如果参数为null,则返回NULL。 内嵌的单引号和反斜杠正常加倍。
- plpy.quote_ident(string) - 返回引用的字符串,用作SQL语句字符串中的标识符。 仅在必要时添加引号(例如,如果字符串包含非标识符字符或将进行大小写折叠)。 内嵌的引号正常加倍。
从PL/Python函数返回文本时,PL/Container将Python unicode对象转换为数据库编码中的文本。 如果无法执行转换,则返回错误。
- 多维数组。
此外,Python模块有两个全局字典对象,它们在函数调用之间保留数据。 它们被命名为GD和SD。 GD用于在同一容器内运行的所有函数之间共享数据,而SD用于在每个单独函数的多个调用之间共享数据。 请注意,当容器进程位于segment或master上时,只能在同一会话中访问数据。 请注意,对于空闲会话,Greenplum数据库会终止segment进程,这意味着相关容器将被关闭,GD和SD中的数据将丢失。
有关PL/Python的信息,参考Greenplum PL/Python语言扩展。
有关plpy方法的信息,参考https://www.postgresql.org/docs/8.4/plpython-database.htm。
关于PL/Container运行PL/R
在R语言容器中,实现了模块pg.spi。 该模块包含以下方法:
- pg.spi.exec(stmt) - 执行查询字符串stmt并在R data.frame中返回查询结果。 为了能够访问结果字段,请确保您的查询返回命名字段。
- pg.spi.prepare(stmt[, argtypes]) - 准备查询的执行计划。 如果在查询中有参数引用,则使用查询字符串和参数类型列表调用它。
- pg.spi.execp(plan[, argtypes]) - 执行准备好的计划。
- pg.spi.debug(msg) - 将DEBUG2消息发送到Greenplum数据库日志。
- pg.spi.log(msg) - 将LOG消息发送到Greenplum数据库日志。
- pg.spi.info(msg) - 将INFO消息发送到Greenplum数据库日志。
- pg.spi.notice(msg) - 将NOTICE消息发送到Greenplum数据库日志。
- pg.spi.warning(msg) - 将WARNING消息发送到Greenplum数据库日志。
- pg.spi.error(msg) - 将ERROR消息发送到Greenplum数据库日志。 在Greenplum数据库中引发的ERROR消息导致查询停止并回滚事务。
- pg.spi.fatal(msg) - 将FATAL消息发送到Greenplum数据库日志。 FATAL消息导致关闭Greenplum数据库会话并回滚事务。
- 多维数组。
关于PL/R的信息,参考Greenplum PL/R 语言扩展。
关于pg.spi方法的信息,参考http://www.joeconway.com/plr/doc/plr-spi-rsupport-funcs-normal.html
配置PL/Container
Greenplum数据库实用程序plcontainer管理Greenplum数据库系统中的PL/Container配置文件。 该实用程序可确保配置文件在Greenplum数据库master和segment实例之间保持一致。
使用该实用程序进行的配置更改将应用于所有Greenplum数据库segment上的XML文件。 但是,当前运行的会话的PL/Container配置使用会话启动期间存在的配置。 要在正在运行的会话中更新PL/Container配置,请在会话中执行此命令。
SELECT * FROM plcontainer_refresh_config;
运行该命令会执行PL/Container函数,该函数会更新master和segment实例上的会话配置。
plcontainer实用程序
plcontainer实用程序安装Docker镜像并管理PL/Container配置。 该实用程序包含两组命令。
- image-*命令管理Greenplum数据库系统主机上的Docker镜像。
- runtime-*命令管理Greenplum数据库实例上的PL/Container配置文件。 您可以将Docker镜像信息添加到PL/Container配置文件,包括镜像名称,位置和共享文件夹信息。 您还可以编辑配置文件。
要将PL/Container配置为使用Docker镜像,请在所有Greenplum数据库主机上安装Docker镜像,然后将配置信息添加到PL/Container配置中。
PL/Container配置值(例如镜像名称,runtime ID,参数值和名称)区分大小写。
plcontainer语法
plcontainer [command] [-h | --help] [--verbose]
其中command是下面的其中一个。
image-add {{-f | --file} image_file} | {{-u | --URL} image_URL} image-delete {-i | --image} image_name image-list runtime-add {-r | --runtime} runtime_id {-i | --image} image_name {-l | --language} {python | r} [{-v | --volume} shared_volume [{-v| --volume} shared_volume...]] [{-s | --setting} param=value [{-s | --setting} param=value ...]] runtime-replace {-r | --runtime} runtime_id {-i | --image} image_name -l {r | python} [{-v | --volume} shared_volume [{-v | --volume} shared_volume...]] [{-s | --setting} param=value [{-s | --setting} param=value ...]] runtime-show {-r | --runtime} runtime_id runtime-delete {-r | --runtime} runtime_id runtime-edit [{-e | --editor} editor] runtime-backup {-f | --file} config_file runtime-restore {-f | --file} config_file runtime-verify
plcontainer命令和选项
- image-add location
- 在Greenplum数据库主机上安装Docker镜像。
指定主机上Docker镜像文件的位置或Docker镜像的URL。
这些是受支持的位置选项。
- {-f | --file} image_file指定包含Docker镜像的主机上的tar存档文件。 此示例指向gpadmin主目录中的镜像文件 /home/gpadmin/test_image.tar.gz
- {-u | --URL} image_URL指定Docker存储库和镜像的URL。 此示例URL指向本地Docker存储库 192.168.0.1:5000/images/mytest_plc_r:devel
- 安装Docker镜像后,使用runtime-add命令配置PL/Container以使用Docker镜像。
- image-delete {-i | --image} image_name
- 从所有Greenplum数据库主机中删除已安装的Docker镜像。 例如,指定包括tag的完整Docker镜像名称 pivotaldata/plcontainer_python_shared:1.0.0
- image-list
- 列出主机上安装的Docker镜像。 该命令仅列出本地主机上的镜像,而不是远程主机。 该命令列出了所有已安装的Docker镜像,包括使用Docker命令安装的镜像。
- runtime-add options
- 将配置信息添加到所有Greenplum数据库主机上的PL/Container配置文件中。 如果指定的runtime_id存在,则该实用程序将返回错误,并且不会添加配置信息。
- 关于PL/Container配置信息,参考PL/Container配置文件.
- 这些是支持的选项:
-
- {-i | --image} docker-image
- 必须。指定Greenplum数据库主机上安装的完整Docker镜像名称,包括tag。例如 pivotaldata/plcontainer_python:1.0.0。
- 如果未安装指定的Docker镜像,该实用程序将返回警告。
- plcontainer image-list命令显示已安装的镜像信息,包括名称和tag(存储库和tag列)。
- {-l | --language} python | r
- 必须。指定PL/Container语言类型,支持的值是python(PL/Python)和r(PL/R)。 为runtime添加配置信息时,该实用程序会根据您指定的语言向配置添加启动命令。
- Python语言的启动命令。
/clientdir/pyclient.sh
- R语言的启动命令。
/clientdir/rclient.sh
- {-r | --runtime} runtime_id
- 需要。添加runtime ID。 在PL/Container配置文件中添加runtime元素时,这是PL/Container配置文件中id元素的值。 最大长度为63字节。
- 在Greenplum数据库UDF# container行指定名称。参考示例。
- {-s | --setting} param=value
- 可选的。指定要添加到runtime配置信息的设置。您可以多次指定此选项。
该设置适用于runtime_id指定的runtime配置。
该参数是PL/Container配置文件中settings元素的XML属性。这些是有效的参数。
- cpu_share - 在runtime配置中为每个容器设置CPU限制。默认值为1024。该值是CPU使用率与其他容器的相对权重。
- memory_mb - 在runtime配置中为每个容器设置内存限制。默认值为1024。该值是一个整数,指定以MB为单位的内存量。
- resource_group_id - 将指定的资源组分配给runtime配置。 资源组限制共享此runtime配置的所有容器的CPU和内存资源总使用量。 您必须指定资源组的groupid。 有关管理PL/Container资源的信息,请参阅关于PL/Container资源管理。
- roles - 指定允许为runtime配置运行容器的Greenplum数据库角色。 您可以指定单个角色名称或逗号分隔的角色名称列表。 默认值没有限制。
-
use_container_logging - 启用或禁用容器的Docker日志记录。
值为yes(启用日志记录)或no(禁用日志记录,默认值)。
Greenplum数据库服务器配置参数log_min_messages控制日志级别。 默认日志级别为warning。 有关PL/Container日志信息的信息,请参阅备注。
- {-v | --volume} shared-volume
- 可选的。指定要绑定装载的Docker卷。您可以多次指定此选项以定义多个卷。
- 共享卷的格式:
host-dir:container-dir:[rw|ro]。
该信息作为属性存储在PL/Container配置文件中的runtime元素的shared_directory元素中。
- host-dir - 主机系统上目录的绝对路径。 Greenplum数据库管理员用户(gpadmin)必须具有对目录的适当访问权限。
- container-dir - Docker容器中目录的绝对路径。
- [rw|ro] - 从容器访问主机目录的只读或读写权限。
- 为新runtime添加配置信息时,该实用程序会添加此只读共享卷信息。
-
greenplum-home/bin/plcontainer_clients:/clientdir:ro
- 如果需要,您可以指定其他共享目录。
如果指定的container-dir与实用程序添加的相同,
或者如果指定具有相同container-dir的多个共享卷,则该实用程序将返回错误。
Warning: 允许对主机目录进行读写访问需要特殊注意事项。
- 指定对主机目录的读写访问权限时,请确保指定的主机目录具有正确的权限。
- 运行PL/Container用户定义的函数时,主机上运行的多个并发Docker容器可能会更改主机目录中的数据。 确保这些函数支持对主机目录中的数据进行多个并发访问。
- runtime-backup {-f | --file} config_file
-
将PL/Container配置文件复制到本地主机上的指定文件。
- runtime-delete {-r | --runtime} runtime_id
-
删除所有Greenplum数据库实例上PL/Container配置文件中的runtime配置信息。 如果文件中不存在指定的runtime_id,则实用程序将返回一条消息。
- runtime-edit [{-e | --editor} editor]
- 使用指定的编辑器编辑XML文件plcontainer_configuration.xml。
默认编辑器是vi。
保存文件会更新所有Greenplum数据库主机上的配置文件。 如果更新的文件中存在错误,该实用程序将返回错误并且不会更新该文件。
- runtime-replace options
-
替换所有Greenplum数据库实例上的PL/Container配置文件中的runtime配置信息。 如果runtime_id不存在,则将信息添加到配置文件中。 该实用程序将启动命令和共享目录添加到配置中。
有关命令选项和添加到配置的信息,请参阅runtime-add。
- runtime-restore {-f | --file} config_file
-
使用本地主机上指定文件的信息替换所有Greenplum数据库实例上的PL/Container配置文件plcontainer_configuration.xml中的信息。
- runtime-show [{-r | --runtime} runtime_id]
-
显示格式化的PL/Container runtime配置信息。 如果未指定runtime_id ,则显示所有runtime标识的配置。
- runtime-verify
-
使用master服务器上的配置信息检查Greenplum数据库实例上的PL/Container配置信息。 如果该实用程序发现不一致,系统将提示您使用本地副本替换远程副本。 该实用程序还执行XML验证。
- -h | --help
- 显示帮助文本。如果在没有命令的情况下指定,则显示所有plcontainer命令的帮助。如果使用命令指定,则显示该命令的帮助。
- --verbose
- 为命令启用详细日志记录。
示例
这些是管理PL/Container的常用命令的示例:
- 在所有Greenplum数据库主机上安装Docker镜像。
此示例从文件加载Docker镜像。
该实用程序在命令行上显示进度信息,因为该实用程序在所有主机上安装Docker镜像。
plcontainer image-add -f plc_newr.tar.gz
安装Docker镜像后,您可以在PL/Container配置文件中添加或更新runtime条目,以便PL/Container访问Docker镜像以启动Docker容器。
- 将容器条目添加到PL/Container配置文件中。
此示例添加PL/R runtime的配置信息,并指定内存和日志记录的共享卷和设置。
plcontainer runtime-add -r runtime2 -i test_image2:0.1 -l r \ -v /host_dir2/shared2:/container_dir2/shared2:ro \ -s memory_mb=512 -s use_container_logging=yes
该实用程序在命令行上显示进度信息,因为它将runtime配置添加到配置文件,并将更新的配置分发到所有实例。
- 在配置文件中显示给定runtime标识的特定runtime
plcontainer runtime-show -r plc_python_shared
该实用程序显示与此输出类似的配置信息。PL/Container Runtime Configuration: --------------------------------------------------------- Runtime ID: plc_python_shared Linked Docker Image: test1:latest Runtime Setting(s): Shared Directory: ---- Shared Directory From HOST '/usr/local/greenplum-db/bin/plcontainer_clients' to Container '/clientdir', access mode is 'ro' ---- Shared Directory From HOST '/home/gpadmin/share/' to Container '/opt/share', access mode is 'rw' ---------------------------------------------------------
- 在您选择的交互式编辑器中编辑配置。
此示例使用vim编辑器编辑配置文件。
plcontainer runtime-edit -e vim
保存文件时,该实用程序会在将文件分发到Greenplum数据库主机时在命令行上显示进度信息。
- 将当前的PL/Container配置保存到文件中。
此示例将文件保存到本地文件/home/gpadmin/saved_plc_config.xml
plcontainer runtime-backup -f /home/gpadmin/saved_plc_config.xml
- 使用XML文件覆盖PL/Container配置文件。
此示例使用/home/gpadmin目录中文件中的信息替换配置文件中的信息。
plcontainer runtime-restore -f /home/gpadmin/new_plcontainer_configuration.xml
该实用程序在将更新的文件分发到Greenplum数据库实例时,在命令行上显示进度信息。
PL/Container配置文件
PL/Container在所有Greenplum数据库segment的数据目录中维护配置文件plcontainer_configuration.xml。 PL/Container配置文件是XML文件。 在XML文件中,根元素configuration包含一个或多个runtime元素。 您可以在PL/Container函数定义的# container:行中指定runtime元素的id。
在XML文件中,名称(如元素和属性名称)和值区分大小写。
<?xml version="1.0" ?> <configuration> <runtime> <id>plc_python_example1</id> <image>pivotaldata/plcontainer_python_with_clients:0.1</image> <command>./pyclient</command> </runtime> <runtime> <id>plc_python_example2</id> <image>pivotaldata/plcontainer_python_without_clients:0.1</image> <command>/clientdir/pyclient.sh</command> <shared_directory access="ro" container="/clientdir" host="/usr/local/greenplum-db/bin/plcontainer_clients"/> <setting memory_mb="512"/> <setting use_container_logging="yes"/> <setting cpu_share="1024"/> <setting resource_group_id="16391"/> </runtime> <runtime> <id>plc_r_example</id> <image>pivotaldata/plcontainer_r_without_clients:0.2</image> <command>/clientdir/rclient.sh</command> <shared_directory access="ro" container="/clientdir" host="/usr/local/greenplum-db/bin/plcontainer_clients"/> <setting use_container_logging="yes"/> <setting roles="gpadmin,user1"/> </runtime> <runtime> </configuration>
这些是PL/Container配置文件中的XML元素和属性。
- configuration
- XML文件的根元素。
- runtime
- 系统中可用的每个特定容器的一个元素。 这些是configuration元素的子元素。
-
- id
- 必须。该值用于从PL/Container用户定义的函数引用Docker容器。
id值在配置中必须是唯一的。
id必须以字符或数字(a-z,A-Z或0-9)开头,并且可以包含字符,数字或字符_(下划线),.(期间),或-(破折号)。
最大长度为63字节。
id指定当PL/Container创建Docker容器以执行用户定义的函数时要使用的Docker镜像。
- image
-
必须。该值是完整的Docker镜像名称,包括镜像tag。与在Docker中启动此容器指定它们的方式相同。 配置允许有许多容器对象引用相同的镜像名称,这种方式在Docker中它们将由相同的容器表示。
例如,您可能有两个runtime元素,具有不同的id元素, plc_python_128和plc_python_256,两者都引用Docker镜像pivotaldata/plcontainer_python:1.0.0。 第一个runtime指定128MB RAM限制,第二个指定由setting元素的memory_mb属性指定的256MB限制。
- command
- 必须。该值是要在容器内部运行以在容器内启动客户端进程的命令。 在创建runtime元素时,plcontainer实用程序会根据语言(-l 选项)添加command元素。
- python语言的command元素。
<command>/clientdir/pyclient.sh</command>
- R语言的command元素。
<command>/clientdir/rclient.sh</command>
- 只有在构建自定义容器并希望在容器启动之前实现一些其他初始化逻辑时,才应修改该值。
Note: 无法使用plcontainer实用程序设置此元素。 您可以使用plcontainer runtime-edit命令更新配置文件。
- shared_directory
- 可选的。此元素为具有访问信息的容器指定共享Docker共享卷。
允许多个shared_directory元素。每个shared_directory元素指定一个共享卷。
shared_directory元素的XML属性:
- host - 主机系统上的目录位置。
- container - 容器内的目录位置。
- access - 主机目录的访问级别,可以是ro(只读)或rw(读写)。
- 创建runtime元素时,plcontainer实用程序会添加shared_directory元素。
<shared_directory access="ro" container="/clientdir" host="/usr/local/greenplum-db/bin/plcontainer_clients"/>
- 对于每个runtime元素,shared_directory元素的container属性必须是唯一的。
例如,runtime元素不能有两个带有属性container="/clientdir"的shared_directory元素。
Warning: 允许对主机目录进行读写访问需要特别考虑。
- 指定对主机目录的读写访问权限时,请确保指定的主机目录具有正确的权限。
- 运行PL/Container用户定义的函数时,主机上运行的多个并发Docker容器可能会更改主机目录中的数据。 确保这些函数支持对主机目录中的数据进行多个并发访问。
- settings
- 可选的。此元素指定Docker容器配置信息。每个setting元素都包含一个属性。
element属性指定日志记录,内存或网络信息。例如,此元素启用日志记录。
<setting use_container_logging="yes"/>
- 这些是合法属性。
- cpu_share
- 可选的。在runtime中指定每个PL/Container容器的CPU使用率。 元素的值是正整数。默认值为1024。该值是CPU使用率与其他容器的相对权重。
- 例如,与具有默认值1024的容器相比,cpu_share为2048的容器被分配了两倍的CPU切片时间。
- memory_mb="size"
- 可选的。该值指定允许每个容器使用的内存量(MB)。每个容器都以这个RAM量和两倍的交换空间开始。 容器内存消耗受主机系统cgroups配置的限制,这意味着在内存过量使用的情况下,容器由系统终止。
- resource_group_id="rg_groupid"
- 可选的。该值指定要分配给PL/Container runtime的资源组的groupid。 资源组限制共享此runtime配置的所有正在运行的容器的CPU和内存资源总使用量。 您必须指定资源组的groupid。 如果未将资源组分配给PL/Container runtime配置,则其容器实例仅受系统资源的限制。 有关管理PL/Container资源的信息,请参阅关于PL/Container资源管理。
- roles="list_of_roles"
- 可选的。该值是Greenplum数据库角色名称或以逗号分隔的角色列表。 PL/Container运行仅对列出的角色使用PL/Container runtime配置的容器。 如果未指定该属性,则任何Greenplum数据库角色都可以运行此容器runtime配置的实例。 例如,您创建一个指定plcontainer语言的UDF, 并标识具有roles属性集的# container: runtime配置。 当角色(用户)运行UDF时,PL/Container会检查角色列表,并仅在角色位于列表中时运行容器。
- use_container_logging="{yes | no}"
- 可选的。启用或禁用容器的Docker日志记录。属性值yes启用日志记录。属性值no禁用日志记录(默认值)。
- Greenplum数据库服务器配置参数log_min_messages控制PL/Container日志级别。 默认日志级别为warning。 有关PL/Container日志信息的信息,请参阅备注。
-
默认情况下,PL/Container日志信息将发送到系统服务。 在Red Hat 7或CentOS 7系统上,日志信息将发送到journald服务。 在Red Hat 6或CentOS 6系统上,日志将发送到syslogd服务。
更新PL/Container配置
您可以使用plcontainer runtime-add命令将runtime元素添加到PL/Container配置文件中。 命令选项指定runtime ID,Docker镜像和语言等信息。 您可以使用plcontainer runtime-replace命令更新现有的runtime元素。 该实用程序更新master和所有segment实例上的配置文件。
PL/Container配置文件可以包含多个runtime元素,这些元素引用由XML元素image指定的相同Docker镜像。 在示例配置文件中,runtime元素包含名为plc_python_128和plc_python_256的id元素, 两者都引用Docker容器pivotaldata/plcontainer_python:1.0.0。 第一个runtime元素定义为128MB RAM限制,第二个定义为为256MB RAM限制。
<configuration> <runtime> <id>plc_python_128</id> <image>pivotaldata/plcontainer_python:1.0.0</image> <command>./client</command> <shared_directory access="ro" container="/clientdir" host="/usr/local/gpdb/bin/plcontainer_clients"/> <setting memory_mb="128"/> </runtime> <runtime> <id>plc_python_256</id> <image>pivotaldata/plcontainer_python:1.0.0</image> <command>./client</command> <shared_directory access="ro" container="/clientdir" host="/usr/local/gpdb/bin/plcontainer_clients"/> <setting memory_mb="256"/> <setting resource_group_id="16391"/> </runtime> <configuration>
备注
- PL/Container不支持Greenplum数据库域对象。
- PL/Container在所有Greenplum数据库segment实例的数据目录中维护配置文件plcontainer_configuration.xml:master,standby master,primary和mirror。
此查询列出了Greenplum数据库系统数据目录:
SELECT hostname, datadir FROM gp_segment_configuration;
PL/Container配置文件示例位于$GPHOME/share/postgresql/plcontainer中。
- 当Greenplum数据库执行PL/Container UDF时,Query Executer(QE)进程启动Docker容器并根据需要重用它们。
经过一定的空闲时间后,QE进程退出并销毁其Docker容器。
您可以使用Greenplum数据库服务器配置参数gp_vmem_idle_resource_timeout控制空闲时间。
控制空闲时间可能有助于Docker容器重用,并避免创建和启动Docker容器的开销。
Warning: 更改gp_vmem_idle_resource_timeout值可能会因资源问题而影响性能。 该参数还控制释放除Docker容器之外的Greenplum数据库资源。
- 如果PL/Container Docker容器超过允许的最大内存量,则会终止该容器并显示内存不足警告。 在配置了Docker 1.7.1版的Red Hat 6或CentOS 6系统上,如果PL/Container Docker容器主程序(PID 1)终止,也会显示内存不足警告。
- 在某些情况下,当PL/Container在高并发环境中运行时,Docker守护程序会挂起并指示内存不足的日志条目。
即使系统似乎有足够的可用内存,也可能发生这种情况。
这个问题似乎是由两个因素共同触发的, 即PL/Container使用的Go语言(golang)运行时的激进虚拟内存需求, 以及overcommit_memory的Greenplum数据库Linux服务器内核参数设置。 该参数设置为2,不允许内存过量使用。
可能有用的解决方法是增加交换空间量并增加Linux服务器内核参数overcommit_ratio。 如果更改后问题仍然存在,则可能存在内存不足问题。 您应检查系统上的可用内存,并在需要时添加更多RAM。 您还可以降低群集负载。
- PL/Container不限制Docker基本设备大小,Docker容器的大小。
在某些情况下,Docker守护程序控制基本设备大小。
例如,如果Docker存储驱动程序是devicemapper,则Docker守护程序--storage-opt选项标志dm.basesize控制基本设备大小。
devicemapper的默认基本设备大小为10GB。
Docker命令docker info显示Docker系统信息,包括存储驱动程序。
基本设备大小显示在Docker 1.12及更高版本中。
有关Docker存储驱动程序的信息,请参阅Docker信息守护存储驱动程序。
设置Docker基本设备大小时,必须在所有Greenplum数据库主机上设置大小。
- 启用PL/Container日志记录后,可以使用Greenplum数据库服务器配置参数log_min_messages设置日志级别。
默认日志级别为warning。
该参数控制PL/Container日志级别,还控制Greenplum数据库日志级别。
- 使用setting属性use_container_logging为每个runtime ID启用或禁用PL/Container日志记录。 默认为无记录。
- PL/Container日志信息是来自Docker容器中运行的UDF的信息。 默认情况下,PL/Container日志信息将发送到系统服务。 在Red Hat 7或CentOS 7系统上,日志信息将发送到journald服务。 在Red Hat 6或CentOS 6系统上,日志信息将发送到syslogd服务。 PL/Container日志信息将发送到Docker容器运行的主机的日志文件中。
- Greenplum数据库日志信息将发送到Greenplum数据库master上的日志文件。
在测试或排除PL/Container UDF故障时,可以使用SET命令更改Greenplum数据库日志级别。 您可以在运行PL/Container UDF之前在会话中设置参数。 此示例将日志级别设置为debug1。
SET log_min_messages='debug1' ;
Note: 参数log_min_messages控制Greenplum数据库和PL/Container日志记录, 即使PL/Container UDF未运行,增加日志级别也可能影响Greenplum数据库性能。
安装Docker
要使用PL/Container,必须在所有Greenplum数据库主机系统上安装Docker。 这些说明显示了如何在CentOS 7上设置Docker服务。 在RHEL 7上安装是一个类似的过程。
- 可以访问CentOS extras存储库。
- 用户具有sudo权限或是root权限。
另请参阅CentOS的Docker站点安装说明https://docs.docker.com/engine/installation/linux/centos/。 有关Docker命令的列表,请参阅Docker引擎运行参考https://docs.docker.com/engine/reference/run/。
在CentOS 7上安装Docker
这些步骤安装docker软件包并以具有sudo权限的用户身份启动docker服务。
- 安装Docker所需的依赖项
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 更新yum cache
sudo yum makecache fast
- 安装Docker
sudo yum -y install docker-ce
- 启动Docker守护进程。
sudo systemctl start docker
- 要授予对Docker守护程序和docker命令的访问权限,请将Greenplum数据库管理员(gpadmin)分配给组docker。
sudo usermod -aG docker gpadmin
- 退出会话并再次登录以更新权限。
- 运行Docker命令以测试Docker安装。
此命令列出当前运行的Docker容器。
docker ps
sudo systemctl start docker.service
gpstop -ra
在CentOS 6上安装Docker
这些步骤安装Docker软件包并以具有sudo权限的用户身份启动docker服务。
- 安装EPEL包
sudo yum -y install epel-release
- 安装Docker
sudo yum -y install docker-io
- 创建docker组
sudo groupadd docker
- 启动Docker
sudo service docker start
- 要授予对Docker守护程序和docker命令的访问权限,请将Greenplum数据库管理员(gpadmin)分配给组docker。
sudo usermod -aG docker gpadmin
- 退出会话并再次登录以更新权限。
- 运行Docker命令以测试Docker安装。
此命令列出当前运行的Docker容器。
docker ps
sudo chkconfig docker on
gpstop -ra
参考
Docker主页https://www.docker.com/
Docker命令行接口https://docs.docker.com/engine/reference/commandline/cli/
Dockerfile参考 https://docs.docker.com/engine/reference/builder/
在Linux系统上安装Dockerhttps://docs.docker.com/engine/installation/linux/centos/
通过systemd控制和配置Dockerhttps://docs.docker.com/engine/admin/systemd/