
# 使用MRS Spark SQL访问DWS表
#### 应用场景
华为云提供MapReduce服务（MRS），可在云上快速构建和运营全栈云原生大数据平台。它包含HDFS、Hive、HBase、Spark等大数据组件，专为分析海量企业数据而量身定制。
Spark提供了类似SQL的Spark SQL语言，用于对结构化数据进行操作。使用Spark SQL，可以访问不同的数据库，用户可以从这些数据库中提取数据，处理并加载到不同的数据存储中。
本实践演示如何使用MRS Spark SQL访问GaussDB(DWS)数据。
#### 方案架构
Spark的应用运行架构如[图1]所示，运行流程如下所示：
1. 应用程序（Application）是作为一个进程的集合运行在集群上的，由Driver进行协调。
2. 在运行一个应用时，Driver会去连接集群管理器（Standalone、Mesos、YARN）申请运行Executor资源，并启动ExecutorBackend。然后由集群管理器在不同的应用之间调度资源。Driver同时会启动应用程序DAG调度、Stage划分、Task生成。
3. 然后Spark会把应用的代码（传递给SparkContext的JAR或者Python定义的代码）发送到Executor上。
4. 所有的Task执行完成后，用户的应用程序运行结束。
图1Spark应用运行架构   
![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002009380905.png "点击放大")
#### 约束与限制
- 本章节仅适用于MRS 3.x及之后版本。
- 为确保网络连通，GaussDB(DWS)集群需与MRS集群"可用区"、"虚拟私有云"、"安全组"配置相同。
 
#### 前提条件
- 已创建DWS集群，请参考[创建GaussDB(DWS)集群](https://support.huaweicloud.com/mgtg-dws/dws_01_0019.html)。
- 已获取连接GaussDB(DWS)数据库的IP地址、端口、数据库名称、用户名和密码。此外，操作用户必须具有GaussDB(DWS)表的读写权限。
 
#### 步骤一：创建MRS集群
1. 创建MRS集群。 创建并购买一个包含Spark组件的MRS集群，详情可参考[创建MRS集群](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0513.html)。
   
2. 如果MRS集群**开启了Kerberos认证** ，登录FusionInsight Manager页面，选择"系统 \> 权限 \> 用户"，添加一个人机用户sparkuser，用户组（hadoop、hive），主组（hadoop）。
   参考[添加Spark2x的Ranger访问权限策略](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_1860.html)章节，添加"ADD JAR操作"权限。
   如果MRS集群未开启Kerberos认证，则无需创建用户。
   
3. 安装MRS集群客户端。 安装MRS集群客户端，具体请参考[安装客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
   
 
#### 步骤二：配置MRS Spark SQL访问DWS表
1. 准备数据，在GaussDB(DWS)集群中创建数据库和表：
   
   1. 登录GaussDB(DWS)管理控制台，单击DWS集群"操作"列的"登录"。
   
   2. 登录现有GaussDB(DWS)集群的默认数据库gaussdb，执行以下命令，创建数据库"dws_test"。 **CREATE DATABASE dws_test;**
      
   
   3. 连接到创建的新数据库，执行以下命令，创建表"dws_order"。 **CREATE SCHEMA** **dws_data;**
      **CREATE TABLE dws_data.dws_order**
      **( order_id VARCHAR,**
      **order_channel VARCHAR,**
      **order_time VARCHAR,**
      **cust_code VARCHAR,**
      **pay_amount DOUBLE PRECISION,**
      **real_pay DOUBLE PRECISION );**
      
   
   4. 执行以下命令插入数据到表"dws_order"中。 **INSERT INTO dws_data.dws_order VALUES ('202306270001', 'webShop', '2023-06-27 10:00:00', 'CUST1', 1000, 1000);**
      **INSERT INTO dws_data.dws_order VALUES ('202306270002', 'webShop', '2023-06-27 11:00:00', 'CUST2', 5000, 5000);**
      
   
   5. 查询表数据，验证数据是否插入。 **SELECT \* FROM** **dws_data.dws_order;**
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001641153533.png "点击放大")
      
   
   
   
   
2. 下载GaussDB(DWS)数据库JDBC驱动并上传到MRS集群。 
   1. 登录GaussDB(DWS)管理控制台，选择左侧的"管理 \> 连接客户端"，下载JDBC驱动，如下图所示：
      图2下载JDBC驱动   
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002184926961.png "点击放大") 
   
   2. 解压，获取"gsjdbc200.jar"文件，并上传到MRS集群主Master节点，例如上传到"/tmp"目录下。
   
   3. 使用**root** 用户登录MRS集群主Master节点，执行如下命令：
      **cd** *{客户端安装目录}*
      **source bigdata_env**
      **kinit** **sparkuser** （首次认证需要修改密码，未开启Kerberos认证，则无需执行kinit命令。）
      **hdfs dfs -put /tmp/gsjdbc200.jar /tmp**
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001640990549.png "点击放大")
      
   
   
   
   
3. 在MRS Spark中创建数据源表，并访问DWS表： 
   1. 登录Spark客户端节点，执行如下命令： **cd** *客户端安装目录*
      **source ./bigdata_env**
      **kinit sparkuser**
      **spark-sql --master yarn**
      
   
   2. 执行如下命令，添加驱动程序jar： **add jar hdfs://hacluster/tmp/gsjdbc200.jar;**
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001640635145.png "点击放大")
      
   
   3. 执行如下命令，在Spark中创建数据源表，访问DWS数据： **CREATE TABLE IF NOT EXISTS spk_dws_order**
      **USING JDBC OPTIONS (**
      **'url'='jdbc:gaussdb://192.168.0.228:8000/dws_test',**
      **'driver'='com.huawei.gauss200.jdbc.Driver',**
      **'dbtable'='dws_data.dws_order',**
      **'user'='dbadmin',**
      **'password'='** *xxx* **');**
      
   
   4. 查询Spark表，验证显示的数据是否与DWS数据相同： **SELECT \* FROM spk_dws_order;**
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001591276668.png "点击放大")
      可以验证返回的数据与[步骤 1]中所示的数据相同。
      
   
   
   
   
 
