大数据IMF传奇行动绝密课程第100-101课:使用Spark Streaming+Spark SQL+Kafka+FileSystem综合案例

使用Spark Streaming+Spark SQL+Kafka+FileSystem综合案例

1、项目分析流程图
2、项目代码实战

大数据IMF传奇行动绝密课程第100-101课:使用Spark Streaming+Spark SQL+Kafka+FileSystem综合案例_第1张图片

Flume sink到Kafka需要一个jar包支持
https://github.com/beyondj2ee/flumeng-kafka-plugin/tree/master/flumeng-kafka-plugin

编辑flume-conf.properties

#配置sink
agent1.sinks.sink1.type=org.apache.flume.plugins.KafkaSink
agent1.sinks.sink1.metadata.broker.list=Master:9092,Worker1:9092,Worker2.9092
agent1.sinks.sink1.partition.key=0
agent1.sinks.sink1.partitioner.class=org.apache.flume.plugins.SinglePartition
agent1.sinks.sink1.serializer.class=kafka.serializer.StringEncoder
agent1.sinks.sink1.request.requiredacks=0
agent1.sinks.sink1.max.message.size=1000000
agent1.sinks.sink1.producer.type=sync
agent1.sinks.sink1.custom.encoding=UTF-8
agent1.sinks.sink1.custom.topic.name=HelloKafka
agent1.sinks.sink1.channel= channel1

Kafka也可以监控文件夹,但为什么要用Flume?Kafka只能接收json格式的文件
数据来源?
互联网:电商、社交网络等的网站和App程序
传统行业:金融、电信、医疗、农业、生产制造行业;
例如说:在京东上进行广告的推送,当我们点击广告的时候,此时肯定有日志记录Log发送回到Server中,或者说我们使用Android,iOS等中的App,都会设置有数据记录的关键点(埋点)
如果是网站,经典的方式是通过JS透过Ajax把日志穿回到服务器上,如果是移动App等一般是通过Socket,其他的传感器或者工业设备可以通过自己的通信协议把数据传回到服务器端

为了应对高并发访问,一般采用Nginx等作为Server前段,Server的分布式集群来做负载均衡

Tomcat、Apache、WebLogic作为Server后端

Server中接收到请求路由后一般都会对每个请求在文件中写一条Log

Logs Cluster可以专门设置日志服务器集群,所有的Server和J2EE类型的业务逻辑在执行过程中产生的日志信息都可以在后台同步到日志服务器集群中

Server中接收到请求路由后一般都会对每个请求在文件中写一条Log,可以自动配置Server写日志

企业中一般都会有Crontab等定时工具来通过日志整理工具来把当天的日志采集、合并和初步的处理形成一份日志文件,然后发送到Flume监控目录中

当Flume发现有新的日志文件进来的时候会按照配置把数据通过Channel来Sink到目的地,这里是Sink到Kafka集群中

HDFS:
1、使用MapReduce作业对数据进行出不清洗,并写入新的HDFS文件中。
2、清洗后的数据一般导入到Hive数据仓库中,可以采用分区表
3、通过Hive中的SQL,在数据仓库的基础上,进行ETL,此时的ETL会把原始的数据生成很多张目标的table

企业生产环境下,Spark数据都是来自Hive

一个小例子

package com.tom.spark.sparkstreaming

import org.apache.commons.codec.StringDecoder
import org.apache.spark.SparkConf
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Durations, Seconds, StreamingContext}

/**
  * 使用Scala开发集群运行的Spark来实现在线热搜词
  */
case class MessageItem(name: String, age: Int)

object SparkStreamingFromKafkaFlume2Hive {
  def main(args: Array[String]): Unit = {

    if(args.length < 2) {
      System.err.println("Please input your kafka broker list and topics to consume")
      System.exit(1)
    }
    val conf = new SparkConf().setAppName("SparkStreamingFromKafkaFlume2Hive").setMaster("local[2]")

    val ssc = new StreamingContext(conf, Durations.seconds(5))

    val Array(brokers, topics) = args
    val kafkaParams = Map[String, String]("metadata.broker.list" -> brokers)
    val topicsParams = topics.split(",").toSet

    KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicsParams)
      .map(_._2.split(",")).foreachRDD(rdd => {
      val hiveContext = new HiveContext(rdd.sparkContext)

      import hiveContext.implicits._
      rdd.map(record => MessageItem(record(0).trim,record(1).trim.toInt)).toDF().registerTempTable("temp")
      hiveContext.sql("SELECT count(*) FROM temp").show()
    })

    // Flume会作为Kafka的Producer把数据写入到Kafka供本程序消费
    ssc.start()
    ssc.awaitTermination()
  }
}

你可能感兴趣的:(Spark,Streaming)