GooseFS 是腾讯云对象存储团队最新推出的高性能、高可用以及可弹性伸缩的分布式缓存系统,依靠对象存储(Cloud Object Storage,COS)作为数据湖存储底座的成本优势,为数据湖生态中的计算应用提供统一的数据湖入口,可加速基于腾讯云对象存储的各类海量数据分析以及机器学习等任务。本文将介绍如何在腾讯云 EMR 上使用 GooseFS 加速大数据计算任务。
GooseFS 是腾讯云对象存储团队近期面向下一代云原生数据湖场景推出的存储加速利器,提供与 HDFS 对标的 Hadoop Compatible FileSystem 接口实现,可为云上的大数据计算任务提供:
- 高可靠、可弹性伸缩的分布式读写缓存服务;
- 内存级的数据本地化(Data Locality)访问性能;
- 基于 Namespace 粒度的读写缓存策略以及 Hive Table 级别预热;
- 与 HDFS 一致的 Ranger 鉴权机制;
- 对象存储 AZ 级别的加速访问与高 QPS 的元数据访问能力;以及快速部署和开箱即用等特性。
本文将基于腾讯云 EMR 介绍如何快速部署 GooseFS 用于加速云上大数据分析任务。
1
加速腾讯云 EMR 大数据计算任务
为了在腾讯云 EMR 中使用 GooseFS 加速大数据计算任务,可参考官网文档腾讯云 EMR 环境中部署和配置GooseFS(https://cloud.tencent.com/document/product/436/58513),即可开启 GooseFS 的缓存加速能力。下文将以数据仓库业务以及迭代计算场景展示 GooseFS 的加速访问能力。
2
加速基于Hive、Spark SQL
和Presto数据仓库查询业务
很多大数据客户的数据仓库类业务具备明显的冷热周期特征,例如:某大数据客户每天会定时基于数仓生成日报报表,Hive 表的分区是日期维度。
GooseFS 集成了 Hive Table 的元数据管理能力,并且提供了 Hive table & partition 粒度的数据预热特性,用户可以通过配置工作流任务来每天在闲时预热加载 table & partition 以降低峰值查询的带宽消耗,然后在数据访问高峰期提供内存级的缓存加速能力。
在热表或分区变冷以后,使用 Free 命令将其从缓存中释放掉。
| 下面,将会详细地介绍 GooseFS Table 管理能力以及预热方法。
3
GooseFS Table &
Partition 管理与预热
GooseFS Table & Partition 管理与预热能力都是通过 GooseFS 的 table 命令行来实现:
goosefs tableUsage: goosefs table [generic options] [attachdb [-o|--option <key=value>] [--db <goosefs db name>] [--ignore-sync-errors] <udb type> <udb connection uri> <udb db name>] [detachdb <db name>] [free <dbName> <tableName> [-p|--partition <partitionSpec>]] [help [<command>]] [load <dbName> <tableName> [-g|--greedy] [--replication <num>] [-p|--partition <partitionSpec>]] [ls [<db name> [<table name>]]] [stat <dbName> <tableName>] [sync <db name>] [transform <db name> <table name> [-d <definition>]] [transformStatus [<job ID>]]</code></pre></div></div><p>其中,提供 Hive DB 绑定和解绑,预热加载DB下的指定 Table & Partition。</p><p>1. 在预热 Hive DB 中的指定 Table & Partition 到 GooseFS 之前,需要先将 DB 挂载到 GooseFS 中:</p><ul class="ul-level-0"><li></li><li></li></ul><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0"> goosefs table attachdb --db test_db hive thrift://metastore_host goosefs_db_demoresponse of attachdb
2. 挂载完后,可使用 GooseFS 的命令行查看 DB 中的 Table 信息:
goosefs table ls test_db web_pageOWNER: hadoopDBNAME.TABLENAME: testdb.web_page (wp_web_page_sk bigint,wp_web_page_id string,wp_rec_start_date string,wp_rec_end_date string,wp_creation_date_sk bigint,wp_access_date_sk bigint,wp_autogen_flag string,wp_customer_sk bigint,wp_url string,wp_type string,wp_char_count int,wp_link_count int,wp_image_count int,wp_max_ad_count int,)PARTITIONED BY ()LOCATION (gfs://metastore_host:port/myiNamespace/3000/web_page)PARTITION LIST ({partitionName: web_pagelocation: gfs://metastore_host:port/myNamespace/3000/web_page})</code></pre></div></div><p>3. 然后,可预热指定 Table 到 GooseFS中,同时还可以查看 Table 预热情况:</p><ul class="ul-level-0"><li></li><li></li></ul><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0"> goosefs table load test_db web_pageAsynchronous job submitted successfully, jobId: 1615966078836
4. 预热完成后,就可以正常的执行查询任务,获得 GooseFS 的本地缓存加速性能。
GooseFS 加速性能对比
这里,我们基于标准的 TPCDS benchmark 在腾讯云 EMR 环境中对比测试了本地 HDFS 得到整个测试过程总时延。其中,GooseFS 挂载 COSN 作为其UFS,并且提前预热了测试数据集。
在相同的测试数据集本地化的程度下,GooseFS 读数据访问性能上相对 HDFS 更好。具体分 SQL case 的时延数据可参考附录。
同时,COSN 和 CHDFS 作为腾讯云上两个比较常用的大数据文件系统实现,也可作为 GooseFS 的 Under File System 使用。这里也对比测试这三个文件系统,其中 GooseFS 挂载 COSN 作为其UFS,同样提前预热的测试数据集。
从该项测试结果,也可以看出,GooseFS 在预热数据的条件下,可以显著加速腾讯云上大数据存储系统的访问性能。具体分 SQL case 的时延数据可参考附录。
4
总结
GooseFS 作为腾讯云对象存储新推出的云原生大数据存储加速器,解决了基于 COSN 以及 CHDFS 等云上存储的 Data Locality 的缺陷,提供了本地近内存级的访问性能。
同时,GooseFS 提供了 Hive Table & Partition 级别的预热能力以及缓存策略管理,能够极大地方便用户完成数据预热和访问加速。在未来,GooseFS 会元数据访问性能、本地短路读性能以及智能 Cache 方向上做更深层次的优化开发,旨在进一步加速海量数据湖应用性能。
5
附件
case100_D3_本地SATA_HDFS 和 case100_D3_本地SATA_GOOSEFS 的 TPCDS 测试结果:
SQL case | case100_D3_本地SATA-HDFS | case101_D3_本地SATA-GooseFS |
---|---|---|
29618 | 28230 | |
query1.sql | 150 | 167 |
query2.sql | 1392 | 1213 |
query3.sql | 402 | 329 |
query8.sql | 338 | 255 |
query12.sql | 280 | 252 |
query13.sql | 367 | 293 |
query15.sql | 767 | 706 |
query19.sql | 368 | 297 |
query20.sql | 503 | 441 |
query21.sql | 170 | 182 |
query22.sql | 96 | 94 |
query26.sql | 582 | 583 |
query31.sql | 1211 | 854 |
query32.sql | 929 | 670 |
query33.sql | 673 | 450 |
query34.sql | 345 | 253 |
query36.sql | 444 | 404 |
query37.sql | 473 | 396 |
query38.sql | 811 | 603 |
query39.sql | 498 | 510 |
query40.sql | 953 | 905 |
query43.sql | 328 | 252 |
query45.sql | 453 | 426 |
query46.sql | 361 | 332 |
query48.sql | 431 | 382 |
query52.sql | 345 | 239 |
query53.sql | 806 | 777 |
query55.sql | 341 | 237 |
query56.sql | 675 | 459 |
query57.sql | 2627 | 2559 |
query59.sql | 1711 | 1618 |
query60.sql | 687 | 465 |
query63.sql | 805 | 776 |
query66.sql | 433 | 430 |
query68.sql | 352 | 320 |
query70.sql | 1261 | 3961 |
query71.sql | 677 | 475 |
query73.sql | 339 | 237 |
query76.sql | 662 | 378 |
query82.sql | 758 | 688 |
query83.sql | 309 | 320 |
query86.sql | 186 | 152 |
query87.sql | 792 | 613 |
query89.sql | 809 | 776 |
query97.sql | 880 | 712 |
query98.sql | 838 | 789 |
SSD 云盘环境的 GooseFS、CHDFS 以及 COSN 的对比测试结果:
SQL case | case200_S5_SSD云盘-GooseFS | case201_S5_SSD云盘-CHDFS | case204_S5_SSD云盘-COSN |
---|---|---|---|
30353 | 36820 | 41803 | |
query1.sql | 194 | 212 | 205 |
query2.sql | 1377 | 1558 | 1921 |
query3.sql | 463 | 457 | 570 |
query8.sql | 294 | 394 | 509 |
query12.sql | 287 | 307 | 347 |
query13.sql | 307 | 668 | 814 |
query15.sql | 837 | 867 | 1074 |
query19.sql | 354 | 512 | 586 |
query20.sql | 576 | 554 | 680 |
query21.sql | 213 | 196 | 210 |
query22.sql | 111 | 109 | 107 |
query26.sql | 806 | 882 | 973 |
query31.sql | 972 | 1328 | 1817 |
query32.sql | 778 | 949 | 1453 |
query33.sql | 524 | 779 | 1049 |
query34.sql | 292 | 428 | 526 |
query36.sql | 479 | 545 | 688 |
query37.sql | 449 | 500 | 679 |
query38.sql | 691 | 868 | 1210 |
query39.sql | 695 | 565 | 654 |
query40.sql | 1098 | 1082 | 1251 |
query43.sql | 304 | 378 | 514 |
query45.sql | 506 | 568 | 628 |
query46.sql | 412 | 557 | 610 |
query48.sql | 437 | 697 | 847 |
query52.sql | 242 | 328 | 501 |
query53.sql | 946 | 899 | 1058 |
query55.sql | 244 | 351 | 485 |
query56.sql | 520 | 704 | 925 |
query57.sql | 3223 | 2914 | 3469 |
query59.sql | 1965 | 1930 | 2302 |
query60.sql | 539 | 696 | 905 |
query63.sql | 935 | 934 | 1025 |
query66.sql | 543 | 593 | 584 |
query68.sql | 380 | 570 | 578 |
query70.sql | 1430 | 4173 | 1608 |
query71.sql | 536 | 780 | 951 |
query73.sql | 282 | 384 | 547 |
query76.sql | 368 | 648 | 981 |
query82.sql | 796 | 828 | 972 |
query83.sql | 369 | 353 | 378 |
query86.sql | 163 | 184 | 219 |
query87.sql | 712 | 896 | 1038 |
query89.sql | 951 | 924 | 1050 |
query97.sql | 801 | 871 | 1213 |
query98.sql | 952 | 900 | 1092 |