SparkSql由Core、Catalyst、Hive、Hive-thriftserver组成
ThriftServer是一个JDBC/ODBC接口,用户可以通过JDBC/ODBC连接ThriftServer来访问SparkSQL的数据。
Thriftserver启动时会启动一个sparkSql application。
通过JDBC/ODBC连接到该server的客户端会共享该server的程序资源,不同的客户端和用户能共享数据。
Thriftserver启动还会启动一个侦听器,等待客户端的连接和提交查询。
连接步骤:(spark和hive不在同一个节点的情况下)
1.在运行Spark thrift server中需要使用到HiveMetastore,故需要在Spark中添加其uris。具体方法:先将hive的hive-site.xml的文件复制到$SPARK_HOME/conf目录下,之后再添加一些配置:
//连接远端hive的metestone元数据的uirs(这个配置在hive的hive-site中也需要配一下,开启元数据信息的时候就不用指定端口号了)
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.252.145:9083</value>
<description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
</property>
//启动spark-thriftserver服务的节点IP地址
<property>
<name>hive.server2.thrift.bind.host</name>
<value>192.168.252.147</value>
<description>Bind host on which to run the HiveServer2 Thrift servic e.</description>
</property>
//spark-thriftserver的端口号,不配的话默认是10000,Hiveserver2默认也是监听10000端口,为了避免冲突,需要修改sparkthriftserver的端口
<property>
<name>hive.server2.thrift.port</name>
<value>10001</value>
<description>Port number of HiveServer2 Thrift interface when hive.server2.transport.mode is 'binary'.</description>
</property>
//spark-thriftserver工作的最小线程数,默认为5
<property>
<name>hive.server2.thrift.min.worker.threads</name>
<value>5</value>
<description>Minimum number of Thrift worker threads</description>
</property>
//spark-thriftserver工作的最大线程数,默认是500
<property>
<name>hive.server2.thrift.max.worker.threads</name>
<value>500</value>
<description>Maximum number of Thrift worker threads</description>
</property>
//设置成false则,yarn作业获取到的hiveserver2用户都为hive用户
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
2.开启hive的元数据服务hive --service metastore &(在连接之前必须开启这个,并且不能关闭)
3.将mysql的连接驱动jar包mysql-connector-java放到spark的jars目录下
4.启动Thriftserver , 把thriftserver运行在我们的集群上
sbin/start-thriftserver.sh(这里启动的时候可以设定各种参数)
5.编写JDBC方式访问Hive数据库
<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>3.1.2</version>
</dependency>
public class JDBC_SparkSQL {
public static void main(String[] args) throws SQLException {
String url = "jdbc:hive2://192.168.252.147:10001/default";
try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Connection conn = DriverManager.getConnection(url, "root", "");
Statement stmt = conn.createStatement();
String sql = "select name,cost from business order by cost";
ResultSet res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(1)+res.getString(2));
}
res.close();
stmt.close();
conn.close();
}
}
项目的数据存在HDFS上得和hive有关联,操作如下:
创建表时通过Location指定加载数据路径,建表时指定路径,它可以自动去加载数据到表里。(不用load,也不用移动数据)。建外部表删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
例:
create external table if not exists student(
id int, name string
)
row format delimited fields terminated by ‘\t’
location ‘/user/hive/warehouse/student’;
这里创建表可以在客户端也可以用Java的api。