
# 使用HetuEngine跨源跨域访问数据源
#### HetuEngine跨源功能简介
出于管理和信息收集的需要，企业内部会存储海量数据，包括数目众多的各种数据库、数据仓库等，此时会面临数据源种类繁多、数据集结构化混合、相关数据存放分散等困境，导致跨源查询开发成本高，跨源复杂查询耗时长。
HetuEngine提供了统一标准SQL实现跨源协同分析，简化跨源分析操作。
图1HetuEngine跨源功能示意   
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001910116308.png "点击放大")
#### 跨源关键技术和优势
- 计算下推：在通过HetuEngine进行跨源协同分析时，为了提升访问效率，HetuEngine从如下所示维度增强了计算下推的能力。
  - Basic Pushed Down类型：Predicate、Projection、Sub-query、Limit。
  
  - Aggregation Pushed Down类型：Group by、Order by、Count、Sum、Min、Max。
  
  - Operator Pushed Down类型：\<, \>、Like、or。
   
 
- 多源异构：协同分析既支持Hive、GaussDB、ClickHouse等结构化数据源，也支持HBase、Elasticsearch等非结构化数据源。
- 全局元数据：对于非结构化数据源HBase，提供映射表方式将非结构化SCHEMA映射成结构化SCHEMA，实现HetuEngine对HBase的无差别SQL访问；对于数据源信息，提供全局管理。
- 全局权限控制：数据源的权限均可通过HetuEngine开放给Ranger集中管理，统一控制。
#### 跨源功能使用指导
HetuEngine能够支持多种数据源的快速联合查询并提供可视化的数据源配置、管理页面，可通过HSConsole界面快速添加如下数据源，配置数据源前请先参考[HetuEngine交互查询引擎概述](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2315.html)：
- [添加Hive数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2348.html)
- [添加Hudi数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2363.html)
- [添加ClickHouse数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24146.html)
- [添加GAUSSDB数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2351.html)
- [添加HBase数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2349.html)
- [添加跨集群HetuEngine数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1719.html)
- [添加IoTDB数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24743.html)
- [添加MySQL数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_249154.html)
- [添加Oracle数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300406.html)
- [添加GBase数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300409.html)
- [添加Iceberg数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300611.html)
 
#### 使用跨源协同分析流程
1. 参考[快速使用HetuEngine访问Hive数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1711.html)登录HetuEngine客户端。
2. 注册Hive、HBase、GaussDB A等数据源。
   ```
   hetuengine> show catalogs;
     Catalog  
   ----------  
   dws                
   hive         
   hive_dg
   hbase
   system       
   systemremote 
   (6 rows)
   ```
   
3. 编写SQL进行跨源协同分析。
   ```
   select * from hive_dg.schema1.table1 t1 join hbase.schema3.table3 t2 join dws.schema02.table4 t3 on t1.name = t2.item and t2.id = t3.cardNo;
   ```
   
 
#### HetuEngine跨域功能简介
HetuEngine提供统一标准SQL对分布于多个地域（或数据中心）的多种数据源实现高效访问，屏蔽数据在结构、存储及地域上的差异，实现数据与应用的解耦。
图2HetuEngine跨域功能示意   
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001944035521.png "点击放大")
#### 跨域关键技术和优势
- 无单点瓶颈：HSFabric可进行水平扩展，多通道并行传输，速率最大化，跨地域延迟不再成为瓶颈。
- 更好地计算资源利用：将数据压缩，序列化的任务下推到Worker并行计算。
- 高效序列化：优化数据序列化格式，同等数据量级下，更低的数据传输量。
- 流式传输：基于HTTP 2.0 stream，保证HTTP协议通用性的同时，减少大量数据传输中RPC重复调用。
- 断点续传：防止数据传输过程中连接异常断开后重传大量数据。
- 流量管控：支持按地区限制数据传输所占用的网络带宽，避免在跨地域有限带宽场景下因流量独占而影响其他业务的正常使用。
 
#### 跨域功能使用指导
前提条件：
- 确保本端和远端集群的数据节点上分别部署至少一个HSFabric实例。
- 确保本端和远端集群的HSFabric实例所在节点的网络互通。
操作步骤：
1. 开放本域数据源。通过创建Virtual Schema方式来对远端访问请求屏蔽本域的物理数据源的真实Schema信息、实例信息，远端使用Virtual Schema名称即可访问本域对应的数据源。 
   ```
   CREATE VIRTUAL SCHEMA hive01.vschema01 WITH (
     catalog = 'hive01',
     schema = 'ins1'
   );
   ```
   
   
2. 参考[添加跨集群HetuEngine数据源](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1719.html)，在远端HetuEngine上注册"HetuEngine"类型数据源，添加本域HetuEngine。
3. 使用跨域协同分析。 
   1. 在远端HetuEngine上开放hive1.ins2数据源。
      ```
      CREATE VIRTUAL SCHEMA hive1.vins2 WITH (
        catalog = 'hive1',
        schema = 'ins2'
      );
      ```
      
   
   2. 在本域HetuEngine上注册Hive、GaussDB A和HetuEngine数据源。
      ```
      hetuengine> show catalogs;
        Catalog  
      ----------  
      dws        
      hetuengine_dc          
      hive         
      hive_dg
      system       
      systemremote 
      (6 rows)
      ```
      
   
   3. 在本域HetuEngine上进行跨源协同分析。
      ```
      select * from hive_dg.schema1.table1 t1 join hetuengine_dc.vins2.table3 t2 join dws.schema02.table4 t3 on t1.name = t2.item and t2.id = t3.cardNo;
      ```
      
   
   
   
   
 
