
# 通过JDBC访问Spark SQL样例程序开发思路
#### 场景说明
用户自定义JDBCServer的客户端，使用JDBC连接来进行表的创建、数据加载、查询和删除。
#### 数据规划
1. 确保以多主实例模式启动了JDBCServer服务，并至少有一个实例可连接客户端。在JDBCServer节点上分别创建"/home/data"文件，内容如下： 
   ```
   Miranda,32
   Karlie,23
   Candice,27
   ```
   
   
2. 确保其对启动JDBCServer的用户有读写权限。
3. 确保客户端classpath下有"hive-site.xml"文件，且根据实际集群情况配置所需要的参数。JDBCServer相关参数详情，请参见[Spark JDBCServer接口介绍](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_200142.html)。
 
#### 开发思路
1. 在default数据库下创建child表。
2. 把"/home/data"的数据加载进child表中。
3. 查询child表中的数据。
4. 删除child表。
 
#### 运行前置操作
安全模式下Spark Core样例代码需要读取两个文件（user.keytab、krb5.conf）。user.keytab和krb5.conf文件为安全模式下的认证文件，需要在FusionInsight Manager中下载principal用户的认证凭证，样例代码中使用的用户为：sparkuser，需要修改为准备好的开发用户。
#### 打包项目
- 将krb5.conf和user.keytab 文件上传到客户端所在服务器上。
- 通过IDEA自带的Maven工具，打包项目，生成jar包。具体操作请参考[在Linux环境中调测Spark应用](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_200130.html)。
  ![](https://support.huaweicloud.com/devg-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
  编译打包前，样例代码中的user.keytab、krb5.conf文件路径需要修改为该文件所在客户端服务器的实际路径。例如："/opt/female/user.keytab"，"/opt/female/krb5.conf"。
  
- 将打包生成的jar包上传到Spark客户端所在服务器的任意目录（例如" /opt/female/" ）下。
 
#### 运行任务
进入Spark客户端目录，使用java -cp命令运行代码（类名与文件名等请与实际代码保持一致，此处仅为示例）：
- 运行**Java** 样例代码：
  **java -cp** *$SPARK_HOME/jars/\*:$SPARK_HOME/jars/hive/\*:$SPARK_HOME/conf:/opt/female/SparkThriftServerJavaExample-1.0.jar com.huawei.bigdata.spark.examples.ThriftServerQueriesTest $SPARK_HOME/conf/hive-site.xml $SPARK_HOME/conf/spark-defaults.conf*
  
- 运行**Scala** 样例代码：
  **java -cp** *$SPARK_HOME/jars/\*:$SPARK_HOME/jars/hive/\*:$SPARK_HOME/conf:/opt/female/SparkThriftServerExample-1.0.jar com.huawei.bigdata.spark.examples.ThriftServerQueriesTest $SPARK_HOME/conf/hive-site.xml $SPARK_HOME/conf/spark-defaults.conf*
  ![](https://support.huaweicloud.com/devg-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
  集群开启ZooKeeper的SSL特性后（查看ZooKeeper服务的ssl.enabled参数），请在执行命令中添加-Dzookeeper.client.secure=true -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty两项参数：
  **java** -Dzookeeper.client.secure=true -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty**-cp** *$SPARK_HOME/jars/\*:$SPARK_HOME/jars/hive/\*:$SPARK_HOME/conf:/opt/female/SparkThriftServerJavaExample-1.0.jar com.huawei.bigdata.spark.examples.ThriftServerQueriesTest $SPARK_HOME/conf/hive-site.xml $SPARK_HOME/conf/spark-defaults.conf*
  MRS 3.6.0-LTS及之后版本，JDK 17和JDK 21下运行Java样例代码：
  ```
  export JAVA_HOME=/opt/FIclient/JDK21/jdk-21.0.8
  export PATH=$JAVA_HOME/bin:$PATH
  java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED \
  --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED \
  --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED \
  --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED --add-opens=java.base/jdk.internal.loader=ALL-UNNAMED \
  -cp $SPARK_HOME/jars/*:$SPARK_HOME/jars/hive/*:$SPARK_HOME/conf:/opt/female/SparkThriftServerJavaExample-1.0.jar com.huawei.bigdata.spark.examples.ThriftServerQueriesTest $SPARK_HOME/conf/hive-site.xml $SPARK_HOME/conf/spark-defaults.conf
  ```
  运行Scala样例代码：
  ```
  export JAVA_HOME=/opt/FIclient/JDK21/jdk-21.0.8
  export PATH=$JAVA_HOME/bin:$PATH
  java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED \
  --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED \
  --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED \
  --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED --add-opens=java.base/jdk.internal.loader=ALL-UNNAMED \
  -cp $SPARK_HOME/jars/*:$SPARK_HOME/jars/hive/*:$SPARK_HOME/conf:/opt/female/SparkThriftServerExample-1.0.jar com.huawei.bigdata.spark.examples.ThriftServerQueriesTest $SPARK_HOME/conf/hive-site.xml $SPARK_HOME/conf/spark-defaults.conf
  ```
  
 
