
# Spark SQL样例程序开发思路
#### 场景说明
假定用户有某个周末网民网购停留时间的日志文本，基于某些业务要求，要求开发Spark应用程序实现如下功能：
- 统计日志文件中本周末网购停留总时间超过2个小时的女性网民信息。
- 周末两天的日志文件第一列为姓名，第二列为性别，第三列为本次停留时间，单位为分钟，分隔符为","。 log1.txt：周六网民停留日志
  ```
  LiuYang,female,20
  YuanJing,male,10
  GuoYijun,male,5
  CaiXuyu,female,50
  Liyuan,male,20
  FangBo,female,50
  LiuYang,female,20
  YuanJing,male,10
  GuoYijun,male,50
  CaiXuyu,female,50
  FangBo,female,60
  ```
  log2.txt：周日网民停留日志
  ```
  LiuYang,female,20
  YuanJing,male,10
  CaiXuyu,female,50
  FangBo,female,50
  GuoYijun,male,5
  CaiXuyu,female,50
  Liyuan,male,20
  CaiXuyu,female,50
  FangBo,female,50
  LiuYang,female,20
  YuanJing,male,10
  FangBo,female,50
  GuoYijun,male,50
  CaiXuyu,female,50
  FangBo,female,60
  ```
  
 
#### 数据规划
首先需要把原日志文件放置在HDFS系统里。
1. 本地新建两个文本文件input_data1.txt和input_data2.txt，将log1.txt中的内容复制保存到input_data1.txt，将log2.txt中的内容复制保存到input_data2.txt。
2. 在HDFS客户端上建立一个文件夹，"/tmp/input"，并上传input_data1.txt，input_data2.txt到此目录，命令如下：
   1. 在HDFS客户端，执行如下命令获取安全认证。 cd */opt/hadoopclient*
      **source bigdata_env**
      kinit *\<用于认证的业务用户\>*
      
   
   2. 在Linux系统HDFS客户端使用命令*hadoop fs -mkdir /tmp/input*（hdfs dfs命令有同样的作用），创建对应目录。
   
   3. 进入到HDFS客户端下的"/tmp/input"目录，在Linux系统HDFS客户端使用命令*hadoop fs -put* *input_data1.txt /tmp/input* 和*hadoop fs -put* *input_data2.txt /tmp/input*，上传数据文件。
    
 
#### 开发思路
统计日志文件中本周末网购停留总时间超过2个小时的女性网民信息。
主要分为四个部分：
- 创建表，将日志文件数据导入到表中。
- 筛选女性网民，提取上网时间数据信息。
- 汇总每个女性上网总时间。
- 筛选出停留时间大于两个小时的女性网民信息。
 
#### 运行前置操作
安全模式下Spark Core样例代码需要读取两个文件（user.keytab、krb5.conf）。user.keytab和krb5.conf文件为安全模式下的认证文件，需要在FusionInsight Manager中下载principal用户的认证凭证，样例代码中使用的用户为：sparkuser，需要修改为准备好的开发用户。
#### 打包项目
1. 将user.keytab、krb5.conf 两个文件上传客户端所在服务器上。

2. 通过IDEA自带的Maven工具，打包项目，生成jar包。具体操作请参考[在Linux环境中编包并运行Spark程序](https://support.huaweicloud.com/devg3-mrs/mrs_07_200130.html)。
   ![](https://support.huaweicloud.com/devg3-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 编译打包前，样例代码中的user.keytab、krb5.conf文件路径需要修改为该文件所在客户端服务器的实际路径。例如："/opt/female/user.keytab"，"/opt/female/krb5.conf"。
   
   - 运行Python样例代码无需通过Maven打包，只需要上传user.keytab、krb5.conf 文件到客户端所在服务器上。
     
3. 将打包生成的jar包上传到Spark客户端所在服务器的任意目录（例如" /opt/female/" ）下。
 
#### 运行任务
进入Spark客户端目录，调用bin/spark-submit脚本运行代码，运行命令分别如下（类名与文件名等请与实际代码保持一致，此处仅为示例）：
- 运行**Scala** 和**Java** 样例程序
  **bin/spark-submit --class** *com.huawei.bigdata.spark.examples.FemaleInfoCollection* **-** **-master yarn --deploy-mode client** */opt/female/SparkSqlScalaExample-1.0.jar \<inputPath\>*
  其中，\<inputPath\>指HDFS文件系统中input的路径。
  
- 运行**Python** 样例程序
  ![](https://support.huaweicloud.com/devg3-mrs/public_sys-resources/note_3.0-zh-cn.png)
  - 由于Python样例代码中未给出认证信息，请在执行应用程序时通过配置项"--keytab"和"--principal"指定认证信息。
   
  **bin/spark-submit --master yarn --deploy-mode client --keytab /opt/FIclient/user.keytab --principal sparkuser** */opt/female/SparkPythonExample/* *SparkSQLPythonExample.py* *\<inputPath\>*
  其中，\<inputPath\>指HDFS文件系统中input的路径。
  
 
