大数据开发之Spark篇----SparkSQL入门(1)

SparkSQL的基本了解

SparkSQL是个啥?

官网上都是怎么描述SparkSQL的

官网地址:http://spark.apache.org/sql/
我们先简单了解下官网是怎么描述SparkSQL这个东西的:Spark SQL is Apache Spark’s module for working with structured data. 根据官网的描述就是Spark SQL这个东西使用来处理结构化数据的。

  1. SparkSQL将SQL和Spark program结合到了一起使用
  2. 统一的数据库访问方式
  3. SparkSQL对HiveQL的支持
  4. 对JDBC和ODBC的支持

如何构建SparkSQL和Hive上元数据的联系

既然Spark只是一个计算数据的组件,那么它也就需要读取存放在其他地方的数据了。可以是HDFS,externa Data Source,Hive table等。如果是Hive上面的数据,那么我们最起码要知道这些数据的元数据吧,而Hive上面的元数据是存储在MySQL上面的,我们就要想办法来连接到这个元数据所在的地方吧。那么我们可以使用hive-site.xml这个hive的配置文件,否则我们的spark-sql就会在当前目录下创建一个metastore_db这样的一个Derby数据库来临时存储我们这次操作所产生的元数据了,同时因为Derby是单会话连接,我们没有办法在同一个目录下创建多一个metastore_db,多不方便呀。

我直接在某个目录下启动了spark-sql --master local[2] 在控制台上的日志中你会看到这么一个warning的:

18/12/27 15:08:20 WARN metastore.ObjectStore: Version information not found in metastore. hive.metastore.schema.verification is not enabled so recording the schema version 1.2.0
18/12/27 15:08:20 WARN metastore.ObjectStore: Failed to get database default, returning NoSuchObjectException

我们同时在这个目录下发现多了两个东西:
在这里插入图片描述
一个是metastore_db的文件夹和一个derby.log的日志文件。
如果我再次在相同目录下使用spark-sql --master local[2],可以看下控制台上会报错(这个错太长了,我就不贴图了),原因是当前文件夹下已经有了一个metastore_db了。
所以,我们这个时候需要将$HIVE_HOME/conf/hive-site.xml这个文件放到$SPARH_HOME/conf下面去,这样spark就能读取到metastore了。

接着我们再次使用spark-sql来启动SparkSQL,结果有报错了:
Caused by: org.datanucleus.exceptions.NucleusException: Attempt to invoke the “BONECP” plugin to create a ConnectionPool gave an error : The specified datastore driver (“com.mysql.jdbc.Driver”) was not found in the CLASSPATH. Please check your CLASSPATH specification, and the name of the driver.
这次是没有找到mysql的驱动jar包,这个问题不是很好解决嘛,把mysql的jar包放到spark上面的jars就好了。不过我在官网上:http://spark.apache.org/docs/latest/sql-data-sources-troubleshooting.html
又看到了这么一段话:
The JDBC driver class must be visible to the primordial class loader on the client session and on all executors. This is because Java’s DriverManager class does a security check that results in it ignoring all drivers not visible to the primordial class loader when one goes to open a connection. One convenient way to do this is to modify compute_classpath.sh on all worker nodes to include your driver JARs.
这里描述了JDBC的驱动jar包要对client session和所有executor可读,所以应该是可以通过一些配置属性来让driver和executor来都能读取这个驱动jar包的。
我们在$SPARK_HOME/conf/spark-default.xml里面配置两个参数:
spark.driver.extraClassPath和spark.executor.extraClassPath,这两个同时指向我们存放JDBC驱动jar包的路径。这样我们再次启动spark-sql的时候就不会报错了,我们还可以读取到Hive下的tables了。

在这个界面里面我们输入的就是SQL了,和操作Hive是很类似的。当然,在开发的过程中我们不是在这里执行的,我们是会在idea中把代码开发好了再到spark-submit上提交的。

idea上使用SparkSQL

配置pom.xml文件

我们需要在我们的项目工程下面的pom.xml里面添加对SparkSQL的依赖
groupId:org.apache.spark
artifactId:spark-sql_2.11
version:${spark.version} //指定你自己的spark版本
下载好我们需要的所有包就可以开始使用了。

SparkSQL的入口

和我们使用spark-core进行编程一样,我们都需要一个程序入口点,但是在SparkSQL里面的入口点是SparkSession这个对象作为入口点(这个对象内部已经实现了一个SparkContext,所以说只要是spark程序都是以SparkContext作为入口点的)

package sparkSQL

import org.apache.spark.sql.SparkSession

object SparkSQLApp {
  def main(args: Array[String]): Unit = {
    val ss = SparkSession.builder().master("local[2]").appName("the test of SparkSession").getOrCreate()
    // TODO...
    ss.stop()
  }

}

猜你喜欢

转载自blog.csdn.net/weixin_39702831/article/details/85287112