• 3.sparkSQL整合Hive


      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。

    原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6618841.html

      Spark SQL和hive共用一套元数据库

      Spark SQL自己也可创建元数据库,并不一定要依赖hive创建元数据库,所以不需要一定启动hive,只要有元数据库,Spark SQL就可以使用。但是如果要像hive一样持久化文件与表的关系就要使用hive,当然可以不启动hive程序使用spark提供的HiveContext类即可。
     
      1.将hive的hive-site.xml拷贝到放入$SPARK-HOME/conf目录下,里面配置的是Hive metastore元数据存放在数据库的位置,当然如果数据库不存在,我们可以定义一个数据库,然后程序在spark集群运行的时候就会自动创建对应的元数据库。
    <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>
    
     
    2.如果hdfs配置了高可用,则还要把hadoop集群中的hdfs-site.xml和core-site.xml文件拷贝到spark/conf文件夹下面。
     
    3.启动spark-shell时指定mysql连接驱动位置
     
    spark集群模式
    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模式

    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
     
    4.执行sql语句
     
      使用sqlContext.sql调用HQL
      val rdd=sqlContext.sql("select * from default.person limit 2")//现在就可以直接使用sql语句了,只是要指定查询哪个库的哪张表。
      rdd.write.json("hdfs://192.168.19.131:9000/personresult")
    
     
      使用org.apache.spark.sql.hive.HiveContext
    import org.apache.spark.sql.hive.HiveContext
    val hiveContext = new HiveContext(sc)
    hiveContext.sql("select * from default.person ")
    
     
    5.使用sprk-sql命令启动shell模式
      启动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 sql如何向元数据中添加数据?因为元数据库中只是存放表对应数据在hdfs的地址,并没有存放表的数据信息,spark sql可以创建表,但是无法向表中添加数据比如insert语句。注意与把DF数据存储到数据库不是一个概念。
     
    6.Thrift JDBC/ODBC server
     
       Spark SQL实现Thrift JDBC/ODBC server,这就意味着我们可以像HIVE那样通过JDBC远程连接Spark SQL发送SQL语句并执行。在这之前需要先将${HIVE_HOME}/conf/hive-site.xml 拷贝到${SPARK_HOME}/conf目录下,由于我的hive配置了元数据信息存储在MySQL中,所以Spark在访问这些元数据信息时需要mysql连接驱动的支持。
     
    添加驱动的方式有三种:

      第一种是在${SPARK_HOME}/conf目录下的spark-defaults.conf中添加:spark.jars /intsmaze/lib/mysql-connector-java-5.1.26-bin.jar。

      第二种是通过添加 :spark.driver.extraClassPath /intsmaze/lib2/mysql-connector-java-5.1.26-bin.jar这种方式也可以实现添加多个依赖jar,比较方便。

      第三种是在运行时添加 --jars /intsmaze/lib2/mysql-connector-java-5.1.26-bin.jar。

    启动thrift

      在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方式运行,默认的监听端口为10000

    用beeline测试

    在spark根目录下执行:
    ./bin/beeline
    连接 JDBC/ODBC server
    beeline> !connect jdbc:hive2://localhost:10000
    连接后会提示输入用户名和密码,用户名可以填当前登陆的linux用户名,密码为空即可。
     

    在java代码中用jdbc连接

    接下来打开eclipse用jdbc连接hiveserver2,连接hive的步骤同样如此。
    在pom.xml添加以下依赖:
     <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>  
    
     
    驱动:org.apache.hive.jdbc.HiveDriver
    url:jdbc:hive2://192.168.19.131:10000/default
    用户名:hadoop (启动thriftserver的linux用户名)
    密码:“”(默认密码为空)
     
    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)+"	name: "+res.getString(2)+"	age:" + res.getInt(3));  
            }  
        }  
    } 
    

    这种方式,可以在yarn的管理界面看到,会长起一个任务,该任务负责跑sql语句,但是不能并行跑sql语句,就是同时为两个用户输入的查询语句同时跑,必须等一个跑完了再跑第二个。

    spark sql可视化

    第一种方案:
    将spark sql代码打包,sql语句和结果存储位置作为参数,java代码收集这些参数后,组装为命令,调用脚本来向集群提交jar包。

    第二种方案:
    根据Spark官网所述,Spark SQL实现了Thrift JDBC/ODBC server

    最后,这篇文章很久了,一直编辑没有发布,我现在已经一年不搞spark了,专注java核心技术的研究。

     
  • 相关阅读:
    Springboot整合Thymeleaf,Thymeleaf页面引入静态资源
    SpringBoot 使用thymeleaf 跳转页面时,总是提示404找不到页面
    项目报错:jdbcUrl is required with driverClassName.
    Springboot配置拦截器无法跳转登录页面
    查看 SELinux状态及关闭SELinux
    Solaris平台,如何通过端口号快速查看PID(进程)
    getApplicationContext()、getBasecontext()、getApplication() 、getParent()
    android工程下不能运行java main程序的解决办法
    SDCardUtils
    BaseAdapter
  • 原文地址:https://www.cnblogs.com/intsmaze/p/6618841.html
Copyright © 2020-2023  润新知