写点什么

HashData 与 HDFS 的高效数据交换

用户头像
HashData
关注
发布于: 2021 年 03 月 11 日
HashData与HDFS的高效数据交换

背景与挑战


在对象存储技术出现和普及之前,HDFS(Hadoop 分布式文件系统)是市场上为数不多的开源、免费、高性价比(相对于昂贵的 SAN 系统)PB 级存储系统,大量用于企业数据归档场景。同时,HDFS 之上衍生了很多针对不同技术要求的分布式计算框架,使其适用于非结构化数据的清洗规整、流式计算和机器学习等场景。另一方面,数据仓库作为主数据系统,保存着企业内部最具商业价值的历史数据,同时支撑日常的经营分析和商业决策。在很多大型机构中,这两套系统是共存的。因此,如何实现与以 HDFS 为基础的大数据平台之间的高效数据互访,是每一款现代数据仓库产品需要考虑和解决的问题。


作为业界相当领先的开源企业级数据仓库产品,Greenplum Database(下面简称 GPDB)主要提供了两种方式:PXF 和 GPHDFS。虽然二者都利用了 GPDB 的外部表功能,但是前者需要额外安装部署 PXF 服务器进程,在复杂的 IT 环境中流程繁琐、极易出错,终端用户体验不佳。所以,在初期规划和实现 HashData 数据仓库访问 HDFS 的功能时,即采用 GPHDFS 的技术路线:通过增加一种访问 HDFS 的外部表协议,让各个计算节点直连 HDFS 集群,不通过任何中间节点或者系统,大幅降低使用门槛的同时,保证两个系统之间数据交换的效率。


在进一步阐述实现细节之前,我们先简单回顾一下 GPDB 自带的 GPHDFS 在实际使用过程中面临的挑战(这是一个大型银行客户的真实反馈):


  1. 需要额外安装软件

每个节点安装 Java;

每个节点安装 Kerberos 客户端;

每个节点安装 Hadoop 客户端;


  1. 配置复杂、易出错

配置 gpadmin 用户的 Java 环境变量;

更改数据库参数;

针对每个 HDFS 集群,每个节点配置 Hadoop core-site.xml、yarn-site.xml 和 hdfs-site.xml;


  1. 无法同时访问多套 HDFS 系统

每个数据库会话只能访问一套 HDFS 系统(与环境变量设置相关), 无法同时访问多套 HDFS 系统(例如将不同 HDFS 上的数据进行关联)。

HashData 的 GPHDFS 实现


继承于 GPDB,HashData 原生支持多种外部表协议,除了上述的 GPHDFS,还包括 FILE(文件系统)、GPFDIST(文件服务器)、OSS(对象存储)等, 可用于实现数据的高速加载与卸载。下面为 GPHDFS 外部表的示意图:



技术架构层面,HashData 的 GPHDFS 实现跟 GPDB 的 GPHDFS 是一致的,更多的差异是体现在实现细节层面。首先,我们采用 C++原生实现的 libhdfs3 作为访问 HDFS 的客户端,在规避了安装、部署、配置 Java 运行环境以及 Hadoop 客户端等纷繁复杂、极易出错环节的同时,降低系统 CPU 和内存使用率。


其次,引入类似 Oracle 数据源配置文件的 gphdfs.conf 文件,将多个 HDFS 系统相关的访问信息集中起来,简化访问配置的管理;修改 HDFS 外部表定义的语法,省略大量的配置选项(放到 gphdfs.conf 文件),大幅降低用户的使用难度。因为解耦了 Hadoop 客户端(包括环境变量的配置)和 HDFS 系统的对应关系,新的 GPHDFS 能够在同一条 SQL 语句中同时访问多个 HDFS(这些 HDFS 系统可以由多个不同的 Hadoop 厂商提供)外部表,极大方便复杂大数据系统中的多源数据融合。


最后,受益于 PostgreSQL 灵活优雅的扩展框架(当然,也包括 GPDB 的外部表框架),可以轻松实现在不修改数据库内核代码的情况下以扩展插件的方式将这个新的 GPHDFS 功能放到各个开源版本的 GPDB,替换原来的实现。

应用实践


Hadoop 集群采用 Kerberos 验证情况下配置

安装 kinit(每个节点都安装):

yum install krb5-libs krb5-workstation
复制代码


配置 krb5.conf(每个节点配置):

[realms] HADOOP.COM = { admin_server = host1 kdc = host1  kdc = host2 }
复制代码


拷贝 kerberos 的认证用户的 keytab 文件到每个节点:

gpscp -f hostfile user.keytab =:/home/gpadmin/key_tab/ 
复制代码


配置 gphdfs.conf 文件(每个节点都配置):


hadoop_cluster1:hdfs_namenode_host: pac_cluster_master hdfs_namenode_port: 9000hdfs_auth_method: kerberos krb_principal: gpadmin/hdw-68212b9b-master0@GPADMINCLUSTER2.COM krb_principal_keytab: /home/gpadmin/hadoop.keytab hadoop_rpc_protection: privacy is_ha_supported: truedfs.nameservices: myclusterdfs.ha.namenodes.mycluster: nn1,nn2 dfs.namenode.rpc-address.mycluster.nn1: 192.168.111.70:8020 dfs.namenode.rpc-address.mycluster.nn2: 192.168.111.71:8020 dfs.namenode.http-address.mycluster.nn1: 192.168.111.70:50070 dfs.namenode.http-address.mycluster.nn2: 192.168.111.71:50070 dfs.client.failover.proxy.provider.mycluster: org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailover... hadoop_cluster2: ...
复制代码


Hadoop 集群未采用 Kerberos 验证情况下配置

配置 gphdfs.conf 文件(每个节点都配置):

hadoop_cluster1: hdfs_namenode_host: pac_cluster_master hdfs_namenode_port: 9000hdfs_auth_method: simplekrb_principal: gpadmin/hdw-68212b9b-master0@GPADMINCLUSTER2.COM krb_principal_keytab: /home/gpadmin/hadoop.keytabhadoop_rpc_protection: privacyis_ha_supported: true dfs.nameservices: mycluster dfs.ha.namenodes.mycluster: nn1,nn2  dfs.namenode.rpc-address.mycluster.nn1: 192.168.111.70:8020dfs.namenode.rpc-address.mycluster.nn2: 192.168.111.71:8020 dfs.nameno`de.http-address.mycluster.nn1: 192.168.111.70:50070 dfs.namenode.http-address.mycluster.nn2: 192.168.111.71:50070dfs.client.failover.proxy.provider.mycluster: org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailover... hadoop_cluster2: ... 
复制代码



访问 hadoop_cluster1 集群:

写入数据到 HDFS:

CREATE WRITABLE EXTERNAL TABLE ext_w_t1(id int,name text) LOCATION(‘gphdfs://tmp/test1/ hdfs_cluster_name=hadoop_cluster1’) format ‘csv’; INSERT INTO ext_w_t1 VALUES(1,'hashdata'); 
复制代码


读取 HDFS 数据:

CREATE READABLE EXTERNAL TABLE ext_r_t1(id int,name text) LOCATION(‘gphdfs://tmp/test1/ hdfs_cluster_name=hadoop_cluster1’) format ‘csv’; SELECT * FROM ext_r_t1; 
复制代码

要访问 hadoop_cluster2 集群,需要在创建的外部表时,设置 hdfs_cluster_name=hadoop_cluster2。

HashData GPHDFS 落地使用情况


2019 年之前,作为 GPDB 全球使用规模最大、场景最复杂、负载最高的客户,某大型国有银行在 x86 物理服务器上运行着数十套各个版本的 GPDB 集群,以及由单一厂商提供的 Hadoop 集群。2019 年开始,随着大数据云平台项目的实施,该客户开始逐步将大数据分析业务迁移到云化 Hadoop 和云端数据仓库系统(HashData 数据仓库)。到目前为止,已上线 20 多套 HashData 计算集群,以及数套至少由两家不同厂商提供的 Hadoop 集群。通过使用 HashData 提供的新 GPHDFS 功能,客户可以实现每天在近百个 MPP 生产集群(包括原有的 GPDB 集群和新的 HashData 集群)方便、敏捷和高效地完成数千个访问多套 HDFS 系统的作业。


用户头像

HashData

关注

还未添加个人签名 2021.03.10 加入

云原生企业级数据仓库

评论

发布
暂无评论
HashData与HDFS的高效数据交换