Spark SQL整合Hive的使用
步骤:
- 将
$HIVE_HOME/conf/hive-site.xml
拷贝到$SPARK_HOME/conf
下 - 整合之后启动spark-shell:
$>./spark-shell --master local[2]
- 产生报错:
java.net.ConnectException: Call From hadoop001/192.168.26.131 to hadoop001:8020 failed on connection exception:
java.net.ConnectException: Connection refused;
访问不到hadoop001这台机器 - 原因分析:
我们已经将hive-site.xml
拷贝到$SPARK_HOME/conf
下来了;Hive的数据是存放在HDFS下的;所以我们想要访问,就必须先启动HDFS - 再度报错:
Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFoundException: 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.
driver找不到,还需要添加个driver的jar包 因为元数据存在MySQL中 - 再度启动:
$>./spark-shell --master local[2] --jars /opt/software/mysql-connector-java-5.1.39-bin.jar
思考:
QA1:什么时候需要启动HDFS
QA2:Metastore ==> MySQL Driver
测试对比 Spark SQL 和 Hive 的性能:
- Spark SQL:
scala>spark.sql("show tables").show //显示Hive里面的表
scala>spark.sql("select * from emp").show
scala>spark.sql("select * from emp e join dept d on e.deptno=d.deptno").show //测试join操作
- Hive:
// 由于Hive表中没有dept表,因此需要先创建dept表
hive>create table dept(
deptno int,
dname string,
loc string
)
row format delimited fields terminated by '\t';
// 加载数据到dept表
hive>load data local inpath '/home/hadoop/data/dept.txt' into table dept;
// 使用hive进行相同的join操作
hive>select * from emp e join dept d on e.deptno=d.deptno
- 测试结果:
Spark SQL的速度要比Hive的稍微要快一些
使用spark-sql 进行启动: $>./spark-sql --master local[2] --jars /opt/software/mysql-connector-java-5.1.39-bin.jar
启动成功之后并测试:
spark-sql (default)>show databases;
18/03/28 13:10:26 INFO SparkSqlParser: Parsing command: show databases
18/03/28 13:10:28 INFO HiveMetaStore: 0: get_databases: *
18/03/28 13:10:28 INFO audit: ugi=hadoop ip=unknown-ip-addr cmd=get_databases: *
18/03/28 13:10:29 INFO CodeGenerator: Code generated in 426.655397 ms
default
ruozedata
test
Time taken: 3.2 seconds, Fetched 3 row(s)
18/03/28 13:10:29 INFO CliDriver: Time taken: 3.2 seconds, Fetched 3 row(s)
default来源于hive-site.xml的配置内容:
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
所以说Hive里的东西在Spark SQL里是通用的 spark-sql (default)>select * from emp e join dept d on e.deptno=d.deptno
跑出来的结果是一样的
刚刚在Hive里创建的表,在Spark SQL中也可以使用,这就是metasotore所带来的好处:更换执行框架,也可以使用