sparksql 操作hive_sparkSQL来完成对Hive的操作

本文介绍了一个使用SparkSQL操作Hive时遇到的问题及解决方案。在尝试创建和查询Hive表后,程序异常终止。通过查阅资料发现是由于Hive版本过高导致的问题。解决办法是整合Spark和Hive,共享元数据库,包括修改hive-site.xml配置,启动metastore服务,复制hive-site.xml到Spark配置目录,并验证整合成功。经过这些步骤,程序运行成功并将查询结果写入了MySQL。
摘要由CSDN通过智能技术生成

接下来做的操作是:(这个操作,将程序打成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)

}

}

作业提交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加入:

hive.metastore.uris

thrift://hadoop01:9083 #在哪里启动这个进程

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

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

ps:这里需要注意一下,nohup是后台启动的,而且所有的信息都是定向输出的,这条命令使用之后,一定要检查一下这个命令是否真的执行成功了:

使用:jsp查一下是否有相应的进程启动,如果没有表示启动失败,肯定是 /home/hadoop/logs这个父目录没有创建,然后创建这个目录之后,在启动,在检查是否启动成功!!!!!!!

③将hive-site.xml复制到$SPARK_HOME/conf下(注意是每一个节点都要复制)

④测试是否成功:spark-sql,如果正确进入并且可以访问hive的表,表示spark整合hive成功!!!

之后我有将原来的程序,重新跑了一次,结果 没有报错,程序运行成功!!!

我不敢相信,我又查看了一下MySQL的表:

确认 程序成功!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值