Spark实战小项目,Flume+Kafka+SparkStream+Mysql

请大佬多多指教!!!!!

项目整体内容介绍

1.此文章主要帮助朋友们理解Flume-Kafka-Spark-Mysql的简单流程教学。

2.Flume作用:通俗易懂来讲就是采集数据的

3.Kafka作用:用于暂时存放Flume采集的数据,等待Spark来拿数据分析

4.大概流程主要是,准备一个文件,Flume主要是监控这个文件,一旦文件有了变化,就把最新变化的数据采集过来,又交给Kafka保管着,此时,就等待Spark了,过一段时间spark就会去kafka这里看有没有数据,有就拿走,没有就下次来,当spark拿到数据之后,就分析存入数据库。OK

Flume配置文件编写

在linux任意位置创建文件 demo.conf 文件,修改三处地方:
1.监控的文件路径
2.zookeeper的 ip
3.主题的名字

a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.type = exec
#这里后面的绑定的是Flume监控的文件,log.txt文件可以提前建立好
a1.sources.r1.command = tail -F /home/torch/BigData/log.txt
a1.sinks.k1.hdfs.writeFormat = TEXT

a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
#主题名字,这里为demo
a1.sinks.k1.kafka.topic=demo
#zookeeper的 ip
a1.sinks.k1.kafka.bootstrap.servers=localhost:9092
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

开启Zookeeper(已配环境变量)

zkServer.sh start

zookeeper的作用是辅助Kafka工作,对于这个项目,知道这些就行了

开启Kafka服务器(已配环境变量)

kafka-server-start.sh  /opt/module/kafka_2.11-2.3.1/config/server.properties 

后面是kafka服务配置文件地址

创建demo主题

kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic demo

localhost为zookeeper的ip

编写Spark代码

我的maven依赖

 <!-- Spark及Scala的版本号 -->
    <properties>
        <spark.version>2.1.0</spark.version>
        <scala.version>2.11</scala.version>
    </properties>

    <!-- Spark各个组件的依赖 -->
    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming-kafka-0-8_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming-flume_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

    </dependencies>

编写IDEA代码

import java.sql.{Connection, DriverManager, PreparedStatement}
import kafka.serializer.StringDecoder
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.kafka.KafkaUtils

object worldcount {

  //Mysql链接方法
  private def getJdbcConnection(): Connection = {

    //设置驱动包
    Class.forName("com.mysql.jdbc.Driver").newInstance()
    //设置mysql地址
    val jdbcUrl = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8"
    //设置账户密码
    val conn = DriverManager.getConnection(jdbcUrl, "root", "root")
    conn
  }

  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("worldcount").setMaster("local[2]")
    val streamingContext = new StreamingContext(sparkConf, Seconds(5))

    // 配置Kafka的broker地址
    val kafkaParams = Map[String,String]("metadata.broker.list"-> "localhost:9092")
    // 设置主题
    val topic = Set("demo")
    var ps: PreparedStatement = null
    val sql = "INSERT INTO worldcount(world,num) values(?,?)"
    // 利用KafakUtils创建DRStream
    val kafkaDStream = KafkaUtils.createDirectStream[String,String,StringDecoder,StringDecoder](streamingContext,kafkaParams,topic)
    val resultDStream = kafkaDStream.map(x => {
      val key = x._1
      val value = x._2
      (value,1)
    }).reduceByKey(_+_)
	resultDStream.print()
    resultDStream.map(x=>{
      ps = getJdbcConnection().prepareStatement(sql)
      //设置值
      ps.setString(1, x._1)
      ps.setInt(2, x._2)
      ps.executeUpdate()
      ps.close()
    }).print()
    // 开启
    streamingContext.start()
    // 等待结束
    streamingContext.awaitTermination()
  }
}

创建Mysql表

use mydb;

create table worldcount(world varchar(50),num int);

到目前为止,我们的准备工作都已经完成了

创建好Flume采集的目标文件

cd /home/torch/BigData/
vim log.txt

直接保存




:wq

启动之前编写的Flume demo.conf任务(已配)

flume-ng agent -n a1 -f /opt/module/flume/job/SparkDemo/demo.conf 

-f 后面是demo.conf的路径

启动IDEA代码

如果下面出现如图,则是启动成功,如果你有很多红色和下面TIme:xxxxxxms 交替出现,则是log4j日志没有配,不用理会,不会影响结果
在这里插入图片描述

往log.txt 文件写入内容

追加 8次 a到文件中,快速输入
在这里插入图片描述

写入成功

在这里插入图片描述

总结

只能一次写一个单词,如果需要请自行修改Spark代码。

  • 8
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: flume是一个数据采集工具,可以将数据从不同的数据源采集到kafka中。kafka是一个分布式消息队列,可以将数据进行缓存和分发。sparkstream是一个流处理框架,可以对实时数据进行处理和分析。hbase是一个分布式的NoSQL数据库,可以存储海量的结构化数据。mysql是一个关系型数据库,可以存储结构化数据。hive是一个数据仓库工具,可以将结构化数据进行查询和分析。 在这个架构中,flume将数据采集到kafka中,sparkstreamkafka中读取数据进行实时处理和分析,处理后的数据可以存储到hbase中。同时,mysql可以作为一个数据源,将数据导入到hive中进行分析。hbase和hive之间可以通过HBaseStorageHandler实现映射,将hbase中的数据映射到hive中进行查询和分析。 ### 回答2: FlumeKafkaSpark Streaming、HBase、MySQL和Hive都是大数据处理和分析中常见的工具和技术。这些工具和技术可以协同工作以实现更高效、更精确的数据分析和处理。下面将从多角度分析这些工具之间的映射关系。 1. 数据采集和传输 FlumeKafka是主要的数据采集和传输工具。Flume通常用于将数据从不同来源采集到HDFS或HBase等目标位置。Kafka则更适用于构建大规模的分布式消息流平台。Kafka可以接收来自多个来源的数据,然后在进行处理之前将其传输到队列中。这些工具都可以与HBase和MySQL等数据存储系统合作使用。 2. 实时数据处理 Spark Streaming则是实时数据处理和分析的主要技术。Spark Streaming可以将KafkaFlume和其他来源的数据进行实时处理和分析,可以将结果直接存储到HBase或MySQL中。 3. 数据存储 MySQL和Hive是两个不同的SQL引擎。MySQL可以作为一种关系型数据库管理系统(RDBMS),可以在大多数情况下有效地存储结构化数据。Hive则可以将数据存储在Hadoop集群的HDFS中,并生成一个结构化查询语言(SQL)接口,允许开发人员和数据科学家方便地访问Hadoop中的数据。因此,Hive更适合非结构化或半结构化数据存储。 HBase则可以作为一个高性能、分布式的NoSQL数据库,专门用于在Hadoop集群上存储大数据和实时数据。因此,HBase比MySQL更适合存储半结构化和非结构化数据。 4. 数据映射 Hadoop和Hive之间的映射是首选的方式之一。Hive提供了一个SQL界面,允许数据科学家和开发人员访问和处理存储在Hadoop集群上的数据。因此,在Hive中创建的表会自动映射到Hadoop集群上的HDFS文件中。 HBase则局限于存储半结构化和非结构化数据,可以使用Hive和Apache Phoenix来更方便地访问和操作HBase数据。Apache Phoenix提供了一个SQL界面,允许开发人员和数据科学家使用标准SQL来访问和操作HBase数据。 因此,FlumeKafkaSpark Streaming、HBase、MySQL和Hive之间的映射关系可以根据实际需求进行不同的组合。例如,FlumeKafka可以协同工作,将数据传输到Hadoop集群上的HDFS或HBase中进行存储。Spark Streaming可以实时处理来自Hadoop集群上的HDFS、HBase或Kafka的数据。MySQL和Hive可以作为SQL引擎,提供方便的接口用于访问Hadoop集群的数据。HBase作为一个高性能、分布式的NoSQL数据库,可以在Hadoop集群上有效地处理半结构化和非结构化数据。 ### 回答3: flumekafkasparkstream、hbase、mysql和hive是在大数据生态系统中非常重要和流行的一些工具和技术。它们都具有独特的功能和用途,并广泛用于大规模数据处理和分析。 在这些工具和技术之间建立映射是非常重要的,因为它们可以协同工作并发挥其最大潜力。尤其是在大规模数据处理和分析方面,正确的工具和技术映射可以帮助我们更好地管理和处理海量数据。 flume是一个日志采集和处理系统,可以从数据源收集数据并将其传输到目标位置,如hbase、hive或Kafkaflumekafka之间的映射通常用于处理数据流,其中flume作为生产者将日志数据发送到kafka,然后消费者可以使用sparkstream或其他工具将这些数据进行处理和分析。 kafka是一个分布式流处理平台,它可以处理大量数据流并实现实时数据处理。kafka和hbase之间的映射通常是将kafka作为数据来源,然后将数据写入hbase进行存储和管理。此外,可以使用hive或其他工具对hbase中存储的数据进行查询和分析。 sparkstream是一个实时流处理引擎,它可以处理来自kafkaflume等数据源的实时数据流。与hbase和mysql之间的映射通常是,sparkstream可以从这些存储系统中读取数据并对其进行处理和分析,并将结果存储回这些存储系统中。 hbase是一个分布式NoSQL数据库,它可以存储大量非结构化和半结构化数据。与hive之间的映射通常是,hive可以使用hbase表中存储的数据进行查询和分析,而hbase则提供了一个高可靠性的数据存储和管理系统。 mysql是一个关系型数据库管理系统,常用于较小的数据集合。(In 300 words) 总之,这些工具和技术都是互相关联的,在大数据生态系统中扮演着重要角色。正确的映射可以使它们协同工作,并处理大规模数据集的难题。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值