sparkSQL来完成对Hive的操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sparkSQL来完成对Hive的操作相关的知识,希望对你有一定的参考价值。

接下来做的操作是:(这个操作,将程序打成jar包到集群中运行)
(1)编写spark程序在线上的hive中创建表并导入数据
(2)查询hive中的数据
(3)将查询结果保存到mysql
代码:

object SparkSqlTest {
    def main(args: Array[String]): Unit = {
        //屏蔽多余的日志
        Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN)
        Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
        Logger.getLogger("org.project-spark").setLevel(Level.WARN)
        //构建编程入口
        val conf: SparkConf = new SparkConf()
        conf.setAppName("SparkSqlTest")
        val spark: SparkSession = SparkSession.builder().config(conf)
            .enableHiveSupport()  //这句话表示支持hive
            .getOrCreate()

        //创建sqlcontext对象
        val sqlContext: SQLContext = spark.sqlContext
        //创建sparkContext
        val sc: SparkContext = spark.sparkContext

        //创建数据库
        var sql=
            """
              |create database if not exists `test`
            """.stripMargin
        spark.sql(sql)

        //使用当前创建的数据库
        sql=
            """
              |use `test`
            """.stripMargin
        spark.sql(sql)

        //创建hive表
        sql=
            """
              |create table if not exists `test`.`teacher_basic`(
              |name string,
              |age int,
              |married boolean,
              |children int
              |) row format delimited
              |fields terminated by ‘,‘
            """.stripMargin
        spark.sql(sql)

        //加载数据
        sql=
            """
              |load data local inpath ‘file:///home/hadoop/teacher_info.txt‘
              |into table `test`.`teacher_basic`
            """.stripMargin
        spark.sql(sql)

        //执行查询操作
        sql=
            """
              |select * from `test`.`teacher_basic`
            """.stripMargin
        val hiveDF=spark.sql(sql)
        val url="jdbc:mysql://localhost:3306/test"
        val table_name="teacher_basic"
        val pro=new Properties()
        pro.put("password","123456")
        pro.put("user","root")
        hiveDF.write.mode(SaveMode.Append).jdbc(url,table_name,pro)
    }
}

打jar包到集群中运行:http://blog.51cto.com/14048416/2337760

作业提交shell:

spark-submit --class com.zy.sql.SparkSqlTest --master yarn --deploy-mode cluster --driver-memory 512M --executor-memory 512M --total-executor-cores 1 file:////home/hadoop/SparkSqlTest-1.0-SNAPSHOT.jar 

然后满怀期待的等待着success,不幸的是,当程序运行到一半的时候异常终止了:
我查看了一下打印的日志:
技术分享图片
我上网查了好多资料,都说是hive的版本过高,what? I‘not why!!
然后想了想,我在集群中,使用spark的程序,去在hive表中进行操作,那么是不是spark需要和hive整合一下啊,然后我又上网查了spark如何整合hive,总的来说就是将hive的元数据库共享出去,让spark可以访问。
具体操作
①在hive的hive-site.xml加入:

<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop01:9083</value>   #在哪里启动这个进程
</property>

②在相应的节点上启动在hive-site.xml中配置的进程

nohup hive --service metastore 1>/home/hadoop/logs/hive_thriftserver.log 2>&1 &

③将hive-site.xml复制到$SPARK_HOME/conf下(注意是每一个节点都要复制)
④测试是否成功:spark-sql,如果正确进入并且可以访问hive的表,表示spark整合hive成功!!!


之后我有将原来的程序,重新跑了一次,结果 没有报错,程序运行成功!!!
我不敢相信,我又查看了一下MySQL的表:
技术分享图片
确认 程序成功!!!!!!

以上是关于sparkSQL来完成对Hive的操作的主要内容,如果未能解决你的问题,请参考以下文章

HIVE_SQL转SparkSQL 简单示例

黑猴子的家:Spark on hive 与 hive on spark 的区别

求问怎么设置sparksql读取hive的数据库

SparkSql之DataFrame操作

3.sparkSQL整合Hive

大数据之Spark:Spark SQL