spark SQL常常须要访问Hive metastore,Spark SQL能够经过Hive metastore获取Hive表的元数据。从Spark 1.4.0开始,Spark SQL只需简单的配置,就支持各版本Hive metastore的访问。注意,涉及到metastore时Spar SQL忽略了Hive的版本。Spark SQL内部将Hive反编译至Hive 1.2.1版本,Spark SQL的内部操做(serdes, UDFs, UDAFs, etc)都调用Hive 1.2.1版本的class。
html
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.19.131:3306/hivedb?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hadoop</value>
</property>
</configuration>
bin/spark-shell \
--master spark://intsmaze:7077 \
--executor-memory 512m \
--total-executor-cores 2\
--driver-class-path /home/intsmaze/mysql-connector-java-5.1.35-bin.jar
sprk on yarn模式mysql
bin/spark-shell \
--master yarn \
--executor-memory 512m \
--total-executor-cores 2\
--driver-class-path /home/intsmaze/mysql-connector-java-5.1.35-bin.jar
val rdd=sqlContext.sql("select * from default.person limit 2")//如今就能够直接使用sql语句了,只是要指定查询哪一个库的哪张表。
rdd.write.json("hdfs://192.168.19.131:9000/personresult")
import org.apache.spark.sql.hive.HiveContext
val hiveContext = new HiveContext(sc)
hiveContext.sql("select * from default.person ")
启动spark-sql时指定mysql链接驱动位置(启动spark-sql那么就和hive的操做同样,里面能够直接写sql语句进行操做)
bin/spark-sql\
--master spark://intsmaze:7077 \
--executor-memory 512m \
--total-executor-cores 3 \
--driver-class-path /home/intsmaze/mysql-connector-java-5.1.35-bin.jar
里面直接写sql语句。
select * from default.person limit 2
第一种是在${SPARK_HOME}/conf目录下的spark-defaults.conf中添加:spark.jars /intsmaze/lib/mysql-connector-java-5.1.26-bin.jar。
linux
第二种是经过添加 :spark.driver.extraClassPath /intsmaze/lib2/mysql-connector-java-5.1.26-bin.jar这种方式也能够实现添加多个依赖jar,比较方便。sql
第三种是在运行时添加 --jars /intsmaze/lib2/mysql-connector-java-5.1.26-bin.jar。shell
在spark根目录下执行:./sbin/start-thriftserver.sh 开启thrift服务器。数据库
./start-thriftserver.sh --jars /home/hadoop/mysql-connector-java-5.1.35-bin.jar --master yarn
start-thriftserver.sh 和spark-submit的用法相似,能够接受全部spark-submit的参数,而且还能够接受--hiveconf 参数。不添加任何参数表示以local方式运行,默认的监听端口为10000apache
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.6</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Test1 { public static void main(String[] args) throws SQLException { String url = "jdbc:hive2://192.168.19.131:10000/default"; try { Class.forName("org.apache.hive.jdbc.HiveDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Connection conn = DriverManager.getConnection(url,"hadoop",""); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM personlimit 10"; ResultSet res = stmt.executeQuery(sql); while(res.next()){ System.out.println("id: "+res.getInt(1)+"\tname: "+res.getString(2)+"\tage:" + res.getInt(3)); } } }
这种方式,能够在yarn的管理界面看到,会长起一个任务,该任务负责跑sql语句,可是不能并行跑sql语句,就是同时为两个用户输入的查询语句同时跑,必须等一个跑完了再跑第二个。
json
第一种方案:
将spark sql代码打包,sql语句和结果存储位置做为参数,java代码收集这些参数后,组装为命令,调用脚原本向集群提交jar包。
第二种方案:
根据Spark官网所述,Spark SQL实现了Thrift JDBC/ODBC server
最后,这篇文章好久了,一直编辑没有发布,我如今已经一年不搞spark了,专一java核心技术的研究。
服务器