背景与挑战
在对象存储技术呈现和遍及之前,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客户端;
2. 配置复杂、易出错
- 配置gpadmin用户的Java环境变量;
- 更改数据库参数;
- 针对每个HDFS集群,每个节点配置Hadoop core-site.xml、yarn-site.xml和hdfs-site.xml;
3. 无奈同时拜访多套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零碎的作业。