1 PXF插件
PXF要求您在主机上运行Tomcat。Tomcat保留端口8005、8080和8009。请确保其他服务使用的端口不是8005。防止在启动 PXF 服务时发生端口冲突。
1.1 目录结构
目录 | 描述 |
/usr/lib/pxf | PXF库目录 |
/etc/pxf/conf | PXF配置目录。此目录包含pxf-public.classpath和pxf-private.classpath配置文件 |
/var/pxf/pxf-service | PXF服务实例所在目录 |
/var/log/pxf | 此目录包括pxf-service.log和所有与 Tomca相关的日志, 包括catalina.out。日志由拥有用户:组pxf:pxf。其他用户是读取权限。 |
/var/run/pxf/catalina.pid | PXF Tomcat容器 PID文件,存储进程号 |
1.2 手动安装
如果使用Ambari安装和管理HAWQ群集, 则不需要遵循以下手动安装步骤。
(1)安装PXF软件,包括PXF 服务、所有PXF插件、HDFS、HBase、Hive、JDBC、JSON:
$ sudo yum install -y pxf
以这种方式安装 PXF:
◎安装所需版本的apache-tomcat
◎创建一个/etc/pxf/pxf-n.n.n目录,添加软链接/etc/pxf到此目录
◎设置PXF服务配置文件/etc/pxf
◎创建一个/usr/lib/pxf-n.n.n目录,添加软链接/usr/lib/pxf到此目录
◎复制 PXF 服务JAR文件pxf-service-n.n.n.jar到/usr/lib/pxf-n.n.n/
◎将每个PXF插件的JAR文件复制到/usr/lib/pxf-n.n.n/
◎在/usr/lib/pxf-n.n.n中创建相关软链接pxf-xxx.jar
(2)初始化PXF服务
$ sudo service pxf-service init
(3)启动PXF服务
$ sudo service pxf-service start
额外的pxf-service命令选项包括stop、restart和status
(4)如果选择使用 HBase 插件, 请执行以下配置:
a. 将PXF HBase插件JAR文件添加到HBase CLASSPATH通过更新HBASE_CLASSPATH,HBase 配置文件中的环境变量设置/etc/hbase/conf/hbase-env.sh:
export HBASE_CLASSPATH=${HBASE_CLASSPATH}:/usr/lib/pxf/pxf-hbase.jar
b.更新HBase配置后, 重启HBase服务。
在HBase主节点上:
su -l hbase -c "/usr/hdp/current/hbase-master/bin/hbase-daemon.sh restart master; sleep 25"
c.在HBase Region Server节点上:
$ su -l hbase -c "/usr/hdp/current/hbase-regionserver/bin/hbase-daemon.sh restart regionserver"
2 配置PXF
对PXF配置文件进行任何更改后 (如pxf-profiles.xml添加自定义配置文件), 将更改分发到安装了PXF的所有节点, 然后重启所有节点上的PXF服务。
2.1 设置Java类路径
PXF服务的类路径是在插件安装过程中设置的。管理员只应在添加新的PXF连接器时对其进行修改。类路径定义在两个文件中:
1. /etc/pxf/conf/pxf-private.classpath–包含运行 PXF 服务所需的所有资源, 包括 pxf-hdfs、pxf-hbase 和 pxf-hive插件。此文件不能编辑或删除。
2. /etc/pxf/conf/pxf-public.classpath–应在此处添加插件jar文件和自定义插件和自定义配置文件的任何从属 jar文件。类路径资源应该每行定义一个。通配符可以在资源的名称中使用, 但不能用于完整路径。
更改类路径文件后,必须重新启动PXF服务。
2.2 为PXF服务设置JVM命令行选项
在/var/pxf/pxf-service/bin/setenv.sh文件中,每个PXF服务实例都可以添加或修改PXF服务的JVM命令行选项:
目前,JVM_OPTS参数设置为最大Java heap size和thread stack size的以下值:
JVM_OPTS="-Xmx512M -Xss256K"
添加或修改JVM命令行选项后, 必须重启PXF服务。
3 访问HDFS文件数据
3.1 HDFS文件格式
PXF HDFS 插件支持读取以下文件格式:
1)Text File—逗号分隔值 (. csv) 或带分隔符的格式纯文本文件
2)Avro—JSON 定义的基于schema的数据序列化格式
PXF HDFS插件包括以下profiles以支持上面列出的格式:
1)HdfsTextSimple—单行文本文件
2)HdfsTextMulti—带有嵌入式换行的多行文本文件
3)Avro—Avro文件
如果发现预定义的PXF HDFS profile不满足您的需要, 则可以选择从现有HDFS序列化和反序列化类创建自定义HDFS profile。
3.2 查询外部HDFS数据
PXF HDFS插件支持HdfsTextSimple, HdfsTextMulti和Avro profiles.
使用以下语法创建表示HDFS数据的HAWQ外部表:
CREATE EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )LOCATION ('pxf://<host>[:<port>]/<path-to-hdfs-file>
?PROFILE=HdfsTextSimple|HdfsTextMulti|Avro[&<custom-option>=<value>[...]]')FORMAT '[TEXT|CSV|CUSTOM]' (<formatting-properties>);
下表描述创建外部表使用指定HDFS插件的关键字和值。
关键字 | 值 |
<host> | PXF主机。虽然<host>可以识别任何PXF代理节点, 但请使用HDFS NameNode, 因为它在运行的HDFS 群集中是可用的。如果启用了HDFS高可用性HA, <host> 必须标识为HDFS NameService。 |
<port> | PXF端口。如果省略<port>, PXF假设<host>标识为高可用性的HDFS Nameservice 并连接到由pxf_service_port服务器配置参数值。默认值为51200。 |
<path-to-hdfs-file> | HDFS 文件路径。 |
PROFILE | PROFILE关键字必须指定为HdfsTextSimple、HdfsTextMulti或Avro其中的一个值 |
<custom-option> | 与特定PROFILE对应的定制选项。 |
FORMAT ’TEXT’ | 当< path-to-hdfs-file >引用纯文本分隔文件,使用'TEXT' FORMAT带HdfsTextSimple profile。 |
FORMAT 'CSV’ | 当<path-to-hdfs-file>引用逗号分隔值的文件,使用'CSV' FORMAT带HdfsTextSimple和HdfsTextMulti profiles。 |
FORMAT 'CUSTOM’ | Avro文件使用该关键字。Avro 'CUSTOM'格式只支持内建的(formatter='pxfwritable_import')格式属性。 |
<formatting-properties> | 与特定PROFILE对应的格式属性。 |
注意: 创建PXF外部表时,在FORMAT规范中不能使用HEADER选项。
3.3 示例
3.3.1 使用HdfsTextSimple Profile
当读取纯文本分隔或. csv 文件时, 每个行都是单个记录时,使用HdfsTextSimple。支持的<formatting-properties>是delimiter,用来指定文件中每条记录的字段分隔符。
执行以下步骤创建示例数据文件, 将文件复制到HDFS, 并使用HdfsTextSimple profile创建PXF外部表以查询数据:
1. 为 PXF 示例数据文件创建一个 HDFS 目录:
$ su - hdfs
$ hdfs dfs -mkdir -p /data/pxf_examples
$ hdfs dfs -chown -R gpadmin:gpadmin /data/pxf_examples
2. 创建一个带分隔符的纯文本数据文件, 名为pxf_hdfs_simple.txt:
$ echo 'Prague,Jan,101,4875.33
Rome,Mar,87,1557.39
Bangalore,May,317,8936.99
Beijing,Jul,411,11600.67' > /tmp/pxf_hdfs_simple.txt
注意使用逗号,以分隔四个数据字段。
3. 将文件上传到HDFS:
$ hdfs dfs -put /tmp/pxf_hdfs_simple.txt /data/pxf_examples/
4. 显示存储在HDFS中pxf_hdfs_simple.txt文件的内容:
$ hdfs dfs -cat /data/pxf_examples/pxf_hdfs_simple.txt
5. 使用该HdfsTextSimple profile创建pxf_hdfs_simple.txt文件查询数据的HAWQ外部表。
$ exit
$ su - gpadmin
$ psql -d postgres
gpadmin=# CREATE EXTERNAL TABLE pxf_hdfs_textsimple(location text, month text, num_orders int, total_sales float8) LOCATION ('pxf://namenode:51200/data/pxf_examples/pxf_hdfs_simple.txt?PROFILE=HdfsTextSimple') FORMAT 'TEXT' (delimiter=E',');
gpadmin=# SELECT * FROM pxf_hdfs_textsimple;
location | month | num_orders | total_sales
---------------+-------+------------+-------------
Prague | Jan | 101 | 4875.33
Rome | Mar | 87 | 1557.39
Bangalore | May | 317 | 8936.99
Beijing | Jul | 411 | 11600.67
(4 rows)
6. 创建第二个外部表pxf_hdfs_simple.txt, 这一次使用CSV FORMAT:
gpadmin=# CREATE EXTERNAL TABLE pxf_hdfs_textsimple_csv(location text, month text, num_orders int, total_sales float8) LOCATION ('pxf://namenode:51200/data/pxf_examples/pxf_hdfs_simple.txt?PROFILE=HdfsTextSimple') FORMAT 'CSV';
gpadmin=# SELECT * FROM pxf_hdfs_textsimple_csv;
当指定FORMAT 'CSV'时,因为逗号是默认分隔符, 可以不需要delimiter说明。
3.3.2 使用HdfsTextMulti Profile
读取纯文本文件时带分隔符的单行或多行记录 (包括嵌入 (带引号) 换行符) ,请使用HdfsTextMulti进行特殊处理。简单说就是数据中含有换行符时使用HdfsTextMulti
执行以下步骤以创建示例数据文件, 将文件复制到HDFS, 并使用HdfsTextMulti profile创建 PXF 外部表以查询数据:
1. 创建带分隔符的纯文本文件:
$ vi /tmp/pxf_hdfs_multi.txt
2. 将以下数据复制/粘贴到pxf_hdfs_multi.txt:
"4627 Star Rd.
San Francisco, CA 94107":Sept:2017
"113 Moon St.
San Diego, CA 92093":Jan:2018
"51 Belt Ct.
Denver, CO 90123":Dec:2016
"93114 Radial Rd.
Chicago, IL 60605":Jul:2017
"7301 Brookview Ave.
Columbus, OH 43213":Dec:2018
使用冒号:作为分隔符来分隔三个字段。还请注意第一个 (地址) 字段引号,而且第一个字段中含有换行符
3. 将文件上传到HDFS:
$ su - hdfs
$ hdfs dfs -put /tmp/pxf_hdfs_multi.txt /data/pxf_examples/
4. 使用HdfsTextMulti profile创建pxf_hdfs_multi.txt文件查询数据的外部表。指定冒号:作为字段分隔符
gpadmin=# CREATE EXTERNAL TABLE pxf_hdfs_textmulti(address text, month text, year int) LOCATION ('pxf://namenode:51200/data/pxf_examples/pxf_hdfs_multi.txt?PROFILE=HdfsTextMulti') FORMAT 'CSV' (delimiter=E':');
5. 查询该pxf_hdfs_textmulti表:
gpadmin=# SELECT * FROM pxf_hdfs_textmulti;
address | month | year
--------------------------+-------+------
4627 Star Rd. | Sept | 2017
San Francisco, CA 94107
113 Moon St. | Jan | 2018
San Diego, CA 92093
51 Belt Ct. | Dec | 2016
Denver, CO 90123
93114 Radial Rd. | Jul | 2017
Chicago, IL 60605
7301 Brookview Ave. | Dec | 2018
Columbus, OH 43213
(5 rows)
3.3.3 Avro Profile
Apache Avro是一个数据序列化框架, 数据以紧凑的二进制格式序列化。
Avro指定在JSON中定义数据类型。Avro格式文件具有独立的架构, 也在JSON中定义。Avro模式及其数据都是完全自我描述的。
具体可参考链接:
https://hdb.docs.pivotal.io/230/hawq/pxf/HDFSFileDataPXF.html
3.3.4 启用HA模式下访问HDFS数据
要访问高可用性HDFS群集中的外部HDFS数据, 请更改CREATE EXTERNAL TABLE LOCATION子句使用<HA-nameservice>而不是<host>[:<port>]。
gpadmin=# CREATE EXTERNAL TABLE <table_name> ( <column_name> <data_type> [, ...] | LIKE <other_table> ) LOCATION ('pxf://<HA-nameservice>/<path-to-hdfs-file>?PROFILE=HdfsTextSimple|HdfsTextMulti|Avro[&<custom-option>=<value>[...]]') FORMAT '[TEXT|CSV|CUSTOM]' (<formatting-properties>);
当高可用的HDFS群集还原为单个NameNode配置时, 则相反。在这种情况下, 任何指定<HA-nameservice> 的表定义都应使用 <host>[:<port>]语法。

本文详细介绍了如何使用PXF插件在Greenplum数据库中访问HDFS文件数据,包括PXF的安装、配置,以及如何配置Java类路径和JVM选项。特别讨论了访问HDFS文件的HdfsTextSimple、HdfsTextMulti和Avro Profile,并提供了多个示例展示如何创建外部表查询HDFS数据。
&spm=1001.2101.3001.5002&articleId=79656777&d=1&t=3&u=b084ced216e245da81e52307ddaf98e5)
2550

被折叠的 条评论
为什么被折叠?



