Spark SQL整合Hive使用

Spark SQL整合Hive的使用

步骤:

  1. $HIVE_HOME/conf/hive-site.xml拷贝到$SPARK_HOME/conf
  2. 整合之后启动spark-shell:
    $>./spark-shell --master local[2]
  3. 产生报错:
    java.net.ConnectException: Call From hadoop001/192.168.26.131 to hadoop001:8020 failed on connection exception:
    java.net.ConnectException: Connection refused;
    访问不到hadoop001这台机器
  4. 原因分析:
    我们已经将hive-site.xml拷贝到$SPARK_HOME/conf下来了;Hive的数据是存放在HDFS下的;所以我们想要访问,就必须先启动HDFS
  5. 再度报错:
    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中
  6. 再度启动:$>./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所带来的好处:更换执行框架,也可以使用

猜你喜欢

转载自blog.csdn.net/lemonzhaotao/article/details/79735643