spark streaming和spark SQL整合使用出现的问题

问题描述:

在spark streaming的foreachrdd中使用spark session获取hive中的数据时,只会显示一个default库

解决方法:

1、在resources中放入集群中的core-site.xml、hdfs-site.xml、hive-site.xml
2、修改代码
之前的代码:

@transient        
val sparkConf = new SparkConf()
        .setAppName("REPORT_SYSTEM")
        .setMaster("local[*]")
        .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
        //反压
        .set("spark.streaming.backpressure.enabled", "true")
        //限制每次作业中每个 Kafka 分区最多读取的记录条数
        .set("spark.streaming.kafka.maxRatePerPartition", "100")
        
val ssc = new StreamingContext(sparkConf, Seconds(60))
...
DStream.foreachRDD(rdd => {
    if (!rdd.isEmpty()) {
        SQLContextSingleton.getInstance(rdd.sparkContext.getConf).sql("show databases").show()
    }
})
...
ssc.start()
ssc.awaitTermination()



object SQLContextSingleton {
    @transient
    private var instance: SparkSession = _
    def getInstance(sparkConf: SparkConf): SparkSession = {
        if (instance == null) {
            instance = SparkSession.builder()
                    .config(sparkConf)
                    .config("hive.metastore.uris", "thrift://localhost:9083")
                    .config("spark.sql.warehouse.dir", GlobalConfigUtil.hdfsHosts + "/user/hive2/warehouse")
                    .config("hive.metastore.warehouse.dir", GlobalConfigUtil.hdfsHosts + "/user/hive2/warehouse")
                    .enableHiveSupport()
                    .getOrCreate()
        }
        instance
    }
}

修改之后的代码:

@transient        
val sparkConf = new SparkConf()
        .setAppName("REPORT_SYSTEM")
        .setMaster("local[*]")
        .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
        //反压
        .set("spark.streaming.backpressure.enabled", "true")
        //限制每次作业中每个 Kafka 分区最多读取的记录条数
        .set("spark.streaming.kafka.maxRatePerPartition", "100")

val spark: SparkSession = SparkSession.builder()
        .enableHiveSupport()
        .config(sparkConf)
        .config("hive.metastore.uris", "thrift://localhost:9083")
        .getOrCreate()

@transientval
sc = spark.sparkContext
sc.setLogLevel("WARN")
val ssc = new StreamingContext(sc, Seconds(60))

...
DStream.foreachRDD(rdd => {
    if (!rdd.isEmpty()) {
        spark.sql("show databases").show()
    }
})
...
ssc.start()
ssc.awaitTermination()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值