Greenplum pxf 连接hadoop

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Greenplum pxf 连接hadoop相关的知识,希望对你有一定的参考价值。

参考技术A 最近在搞greenplum连接hadoop,采用pxf插件。hadoop集群是kerberos认证的。

首先添加一下hadoop的参数:

$ gpconfig -c gp_hadoop_target_version -v"hdp2"

$ gpconfig -c gp_hadoop_home -v"/usr/lib/hadoop"

具体的版本参数参照官网,hadoop的home自己设定

然后配置java环境目录,每个segment节点都配置一下。这里最好每台机器都check一下。

遇到的问题:No class found一类的问题。

在greenplum-db/lib/hadoop目录下的hadoop_env.sh 文件缺少应该加载的类的配置。

在hadoop_env.sh文件中,JAVA_LIBRARY_PATH之前加上

if [ -d "/usr/hdp/2.6.1.0-129/hadoop/client" ]; then

for f in /usr/hdp/2.6.1.0-129/hadoop/client/*.jar; do

  CLASSPATH=$CLASSPATH:$f;

done

fi

其中/usr/hdp/2.6.1.0-129/是我的hadoop安装目录。

指定PXF_CONF=/usr/local/greenplum-db/pxf/conf,也可是其他目录。根据官方指导,

在这个目录下的servers/default 

加入hadoop经典的四个配置文件:

hdfs-site.xml,core-site.xml,yarn-site.xml,mapred-site.xml

当然,加入hive-site.xml,hbase-site.xml 如果需要读取hive,hbase的数据。

在/usr/local/greenplum-db/pxf/conf/conf目录下pxf-env.sh中,这个目录和第二步中的PXF_CONF设定对应,

加入对应的keytab与principal。

这里需要重点强调一下, 上面的配置对应的是segment节点 ,master节点不做要求。最好所有的配置都一样,省的出现各类问题。

我用的gp是pivolt的5.16版本,自带的hadoop版本是2.8.5,我的hadoop版本是2.7.3的,然后查询的时候,

就报错了各种NosuchMethod。最后实在没办法了,我就把gp自带的jar替换成我的hadoop版本的。

gp需要的hadoop的jar在 $你的安装目录/greenplum-db/pxf/lib/shared 这个目录下,

替换的jar有

hadoop-auth-2.7.3.2.6.1.0-129.jar

hadoop-aws-2.7.3.2.6.1.0-129.jar

hadoop-azure-2.7.3.2.6.1.0-129.jar

hadoop-azure-datalake-2.7.3.2.6.1.0-129.jar

hadoop-common-2.7.3.2.6.1.0-129.jar

hadoop-hdfs-2.7.3.2.6.1.0-129.jar

hadoop-mapreduce-client-core-2.7.3.2.6.1.0-129.jar

hadoop-yarn-api-2.7.3.2.6.1.0-129.jar

其实就是hadoop相关的,然后就可以了。

以上四步中,官方文档有第二步,第三步,第一步在网上其他教程中也能够解决。但是,第四部,官方文档中没有提及,网上的相关的资料基本上没有。pxf这个功能也是最近才发布,gp用的人比较少,更别提pxf了。作为第一个采坑,希望分享出来,帮助大家。

1.  User null does not belong to hdfs

在hive-site.xml中加入

<property>

      <name>hive.warehouse.subdir.inherit.perms</name>

      <value>false</value>

    </property>

2.ERROR: "set_ugi() not successful, Likely cause: new client talking to old server. Continuing without it" 

正在解决……

在greenplum pxf外部表中,从对象的json数组中获取元素时获取空字符串

【中文标题】在greenplum pxf外部表中,从对象的json数组中获取元素时获取空字符串【英文标题】:In greenplum pxf external table get empty string while fetching element from json array of object 【发布时间】:2020-06-12 06:16:14 【问题描述】:

通过在多行 json 表示例中使用 pxf json 插件创建外部表来访问 json 数据时

当使用以下列定义时

"coordinates.values[0]" INTEGER,

从下面的 json 中轻松获取 8 个

"coordinates":
     "type":"Point",
     "values":[
           8,
           52
     ]

但是如果我们把 json 改成这样的东西

"coordinates": 
     "type": "geoloc",
     "values":[
            
                     "latitude" : 72, 
                     "longtitue" : 80 
           
     ]

并像这样更改列定义

"coordinates.values[0].latitude" INTEGER,

获取空字符串....

【问题讨论】:

【参考方案1】:

很遗憾,PXF 中的 JSON 配置文件不支持访问数组内的 JSON 对象。但是,Greenplum 对 JSON 的支持非常好,您可以通过执行以下操作来获得相同的结果:

CREATE EXTERNAL TABLE pxf_read_json (j1 json)
LOCATION ('pxf://tmp/file.json?PROFILE=hdfs:text:multi&FILE_AS_ROW=true')
FORMAT 'CSV';

pxf_read_json 表将访问外部系统上的 JSON 文件。每个文件都被读取为多行文本文件,每个文件代表 Greenplum 上的单个表格行。然后可以如下查询外部数据:

SELECT values->>'latitude' as latitude, values->>'longtitue' as longitude
FROM pxf_read_json
JOIN LATERAL json_array_elements(j1->'coordinates'->'values') values
ON true;

通过这种方法,您仍然可以利用 PXF 的支持来访问外部系统以及利用 Greenplum 中强大的 JSON 支持。

可以在here 中找到有关将多行文本文件读入单个表格行的更多信息。有关 Greenplum 对 JSON 的支持的信息可以在 here 找到。

【讨论】:

以上是关于Greenplum pxf 连接hadoop的主要内容,如果未能解决你的问题,请参考以下文章

在greenplum pxf外部表中,从对象的json数组中获取元素时获取空字符串

PXF JSON 插件错误

[GreenPlum] -> 使用JDBC连接GreenPlum数据库

greenplum的升级与连接池pgbouncer

Greenplum 与远程 Hadoop 连接

greenplum 连接池pgbouncer的使用