随着数据存储和云服务的增长,数据现在以多种格式驻留在许多不同的系统中。通常,数据按其位置和对数据执行的操作以及访问数据的频率进行分类:实时性(热),不频繁(热)或存档(冷)。
下图描述了一个数据源,该数据源跟踪了多年的月度销售额。实时操作数据存储在MySQL中。进行分析和商业智能操作的数据存储在Greenplum数据库中。很少访问的存档数据驻留在AWS S3中。
当外部系统中存在多个相关数据集时,通常更有效的方法是远程连接数据库进行查询,而不是将完整数据加载到磁盘中。如上所述Greenplum的平台扩展框架(PXF) ,一个Greenplum的扩展,提供平行,高通量数据访问和联邦查询处理,提供了这种能力。
借助PXF,您可以使用Greenplum和SQL查询这些异构数据源:
And these data formats:
一次性初始化将创建PXF服务Web应用程序,并生成PXF配置文件和模板。
PXF提供了两个可用于初始化的管理命令:
pxf cluster init -初始化Greenplum数据库集群中的所有PXF服务实例
pxf init -在当前Greenplum数据库主机上初始化PXF服务实例
PXF还提供了类似的reset命令,可用于重置PXF配置。
# 指定初始化目录
PXF_CONF=/usr/local/greenplum-pxf $GPHOME/pxf/bin/pxf cluster init
所有Greenplum主机上重置PXF服务实例
$GPHOME/pxf/bin/pxf cluster reset
> psql -d <database-name> -U gpadmin
> database-name=# CREATE EXTENSION pxf
GRANT SELECT ON PROTOCOL pxf TO bill;
GRANT INSERT ON PROTOCOL pxf TO 用户名;
$GPHOME/pxf/bin/pxf cluster status
在master节点将jdbc jar包放入$PXF_CONF/lib/
路径
cp jdbc_jar.jar $PXF_CONF/lib/
配置数据库连接信息
在master节点 $PXF_CONF/servers
目录下,已有一个default文件夹,将template下的jdbc-site.xml
copy到下面。推荐在$PXF_CONF/servers
目录下新建文件夹以适应多个数据源时的配置。
mkdir $PXF_CONF/servers/db_name
cp $PXF_CONF/templates/jdbc-site.xml $PXF_CONF/servers/db_name
修改示列如下
<property>
<name>jdbc.driver</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>jdbc.url</name>
<value>jdbc:mysql://xxxip:3306/schame</value>
</property>
<property>
<name>jdbc.user</name>
<value>用户</value>
</property>
<property>
<name>jdbc.password</name>
<value>密码</value>
</property>
启动
pxf谓语推断是在sql外部表sql执行时,能够下推查询条件,减少数据传输及加快查询性能。谓语推断默认开启。
SHOW gp_external_enable_filter_pushdown;
SET gp_external_enable_filter_pushdown TO 'on';
在有错误调试时,可以打开debug。打印出更加详细的日志信息
#log4j.logger.org.greenplum.pxf=DEBUG
错误:java.lang.OutOfMemoryError: Java heap space
因为单个PXF代理(JVM)为段主机上的多个段提供服务,所F堆大小可能是限制运行时的因素。在并发工作负载和/或针对大文件的查询下,这一点将更加明显。您可能会遇到由于内存不足或Java垃圾收集器影响响应时间而导致查询挂起或失败的情况。要避免或纠正这些情况,可以尝试增加Java最大堆大小或减少Tomcat最大线程数,这取决于最适合您的系统配置的方式。您还可以选择将PXF配置为在检测到内存不足情况时执行特定的操作。
配置更新后使用pxf cluster sync 同步到其它服务器上去。配置更新后同步,同步之后再重启。
vi $PXF_CONF/conf/pxf-env.sh
如果要在OOM上配置(即关闭或重新打开)PXF服务器自动关闭功能在
pxf-env.sh``文件中找到PXF_OOM_KILL
属性.如果该设置已被注释掉,请取消注释它,然后更新该值。例如,要关闭此行为,请将值设置为false
export PXF_OOM_KILL=false
如果要配置(即打开或关闭)PXF服务器达到OOM条件时的自动堆转储PXF_OOM_DUMP_PATH
,请在pxf-env.sh
文件中找到该设置。
要打 开此行为,将PXF_OOM_DUMP_PATH
属性值设置为JVM将Java堆转储到的文件系统位置。例如,转储到名为的文件/home/gpadmin/pxfoom_segh1
:
export PXF_OOM_DUMP_PATH=/home/pxfoom_segh1
要在打开后关闭堆转储,请注释掉PXF_OOM_DUMP_PATH
属性设置:
#export PXF_OOM_DUMP_PATH=/home/pxfoom_segh1
可以减少为PXF的基础Tomcat Web应用程序配置的并发工作线程数。正在运行的线程数量的减少将防止任何PXF节点耗尽其内存,同时确保当前查询运行完成。Tomcat的默认行为是将请求排队,直到线程空闲或队列耗尽为止。
PXF的Tomcat线程的默认最大数量为200。PXF_MAX_THREADS
配置属性控制此设置。
PXF线程容量由配置文件以及是否压缩数据确定。如果计划在外部Hive数据存储中的大量文件上运行大型工作负载,或者正在读取压缩的ORC或Parquet数据,请考虑指定一个较低的PXF_MAX_THREADS
值。
PXF_MAX_THREADS
在pxf-env.sh
文件中找到设置。取消注释设置,并将其更新为所需的值。例如,要将Tomcat线程的最大数量设置为100。
export PXF_MAX_THREADS=100
将$PXF_CONF/conf/pxf-env.sh中PXF_JVM_OPTS中时间设置为对应时区。
export PXF_JVM_OPTS="<current_settings> -Duser.timezone=America/Chicago
PXF_FRAGMENTER_CACHE
在pxf-env.sh
文件中找到设置。如果该设置已被注释掉,请取消注释它,然后更新该值。例如,要关闭片段元数据缓存,将值设置为false
默认情况下启用PXF片段元数据缓存。要关闭片段元数据缓存,或在关闭后重新启用片段元数据缓存。
export PXF_FRAGMENTER_CACHE=false
create table user(
id int not null auto_increment primary key,
name varchar(64) not null);
insert into user(id,name) values(1,'xiaozhao');
insert into user(id,name) values(2,'xiaoqian');
insert into user(id,name) values(3,'xiaoshun');
insert into user(id,name) values(4,'xiaoli');
-- 建可读表,该表仅能读取数据,不能插入数据
-- pxf://test.user?PROFILE=Jdbc&SERVER=test
-- -- test.user -> schame.table
-- -- SERVER -> pxf/servers目录下的名称
CREATE EXTERNAL TABLE pxf_test_user(id int,name varchar(44))
LOCATION ('pxf://test.user?PROFILE=Jdbc&SERVER=test')
FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
select * from pxf_test_user;
-- 1 xiaozhao
-- 2 xiaoqian
-- 3 xiaoshun
-- 4 xiaoli
- 建可读表,该表仅能插入数据,不能读取数据
-- pxf://test.user?PROFILE=Jdbc&SERVER=test
-- -- test.user -> schame.table
-- -- SERVER -> pxf/servers目录下的名称
CREATE WRITABLE EXTERNAL TABLE pxf_test_user_write(id int,name varchar(44))
LOCATION ('pxf://test.user?PROFILE=Jdbc&SERVER=test')
FORMAT 'CUSTOM' (FORMATTER='pxfwritable_export');
-- 插入一条数据
insert into pxf_test_user_write values(5,'xiaozhou');
-- 一条数据插入进来
select * from pxf_test_user;
1 xiaozhao
2 xiaoqian
3 xiaoshun
4 xiaoli
5 xiaozhou
参考: