Flume+Kafka+Spark搭建与案例实操

大数据开发文档

本文档主要讲述了flume+kafka+spark的单机分布式搭建,由浅入深,介绍了常见大数据流处理流程

单机版环境搭建及相关DEMO

Flume

Flume基本介绍与架构

Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。

Flume出生日记

有很多的服务和系统

  • network devices
  • operating system
  • web servers
  • Applications

这些系统都会产生很多的日志,那么把这些日志拿出来,用来分析时非常有用的。

如何解决数据从其他的server上移动到Hadoop上?

shell cp hadoop集群上的机器上, hadoop fs -put …/ 直接拷贝日志,但是没办法监控,而cp的时效性也不好,容错负载均衡也没办法做

======>

Flume诞生了

Flume架构

Flume组成架构如图1-1,所示:

在这里插入图片描述
​ 图1-1 Flume组成架构

Agent

Agent是一个JVM进程,它以事件的形式将数据从源头送至目的,是Flume数据传输的基本单元。

Agent主要有3个部分组成,Source、Channel、Sink。

Source

Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。

Channel

Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。

Flume自带两种Channel:Memory ChannelFile Channel

Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。

File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。

Sink

Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。

Sink是完全事务性的。在从Channel批量删除数据之前,每个Sink用Channel启动一个事务。批量事件一旦成功写出到存储系统或下一个Flume Agent,Sink就利用Channel提交事务。事务一旦被提交,该Channel从自己的内部缓冲区删除事件。

Sink组件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定义。

Event

传输单元,Flume数据传输的基本单元,以事件的形式将数据从源头送至目的地。

Flume拓扑结构

Flume的拓扑结构如图1-3、1-4、1-5和1-6所示:

在这里插入图片描述

​ 图1-3 Flume Agent连接

在这里插入图片描述

​ 图1-4 单source,多channel、sink

在这里插入图片描述

​ 图1-5 Flume负载均衡

在这里插入图片描述

​ 图1-6 Flume Agent聚合

Flume安装部署

Flume的安装相对简单,但是前提是要先下好Java环境JDK,1.8以上即可,JDK安装可以查看Kafka安装流程,这里以Linux下的安装为例

Flume安装地址

安装部署

  1. 解压apache-flume-1.7.0-bin.tar.gz到/usr/local/目录下(安装包详见安装包文件夹flume文件夹下的tar.gz压缩包)
#把下载的包移动到目录
$ sudo mv apache-flume-1.7.0-bin.tar.gz /usr/local
#解压
$ sudo tar -zxvf apache-flume-1.7.0-bin.tar.gz  /usr/local/
  1. 修改apache-flume-1.7.0-bin的名称为flume
$ sudo mv apache-flume-1.7.0-bin flume
  1. 将flume/conf下的flume-env.sh.template文件修改为flume-env.sh,并配置flume-env.sh文件
$ mv flume-env.sh.template flume-env.sh

$ vi flume-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0_144(这里路径替换为本机JDK安装目录)

案例实操
  • 监控端口数据

    • 案例需求:首先,Flume监控本机44444端口,然后通过telnet工具向本机44444端口发送消息,最后Flume将监听的数据实时显示在控制台。

    • 需求分析

在这里插入图片描述

  • 实现步骤:

    • 安装telnet工具

      在/usr/local目录下创建flume-telnet文件夹。

      $ mkdir flume-telnet
      

      再将rpm软件包(xinetd-2.3.14-40.el6.x86_64.rpm、telnet-0.17-48.el6.x86_64.rpm和telnet-server-0.17-48.el6.x86_64.rpm)拷入/usr/local/flume-telnet文件夹下面。执行RPM软件包安装命令:

      $ sudo rpm -ivh xinetd-2.3.14-40.el6.x86_64.rpm
      
      $ sudo rpm -ivh telnet-0.17-48.el6.x86_64.rpm
      
      $ sudo rpm -ivh telnet-server-0.17-48.el6.x86_64.rpm
      
      
  • 判断44444端口是否被占用

    判断44444端口是否占用,如果被占用则kill掉或者更换端口

    $ sudo netstat -tunlp | grep 44444
    功能描述:netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。
    
    基本语法:netstat [选项]
    
    选项参数:
    
    -t或--tcp:显示TCP传输协议的连线状况; 
    
    -u或--udp:显示UDP传输协议的连线状况;
    
           -n或--numeric:直接使用ip地址,而不通过域名服务器; 
    
           -l或--listening:显示监控中的服务器的Socket; 
    
           -p或--programs:显示正在使用Socket的程序识别码和程序名称;
    
    
  • 创建Flume Agent配置文件flume-telnet-logger.conf

    在flume目录下创建job文件夹并进入job文件夹

    $ mkdir job
    $ cd job/	
    
  • 在job文件夹下创建Flume Agent配置文件flume-telnet-logger.conf

    $ touch flume-telnet-logger.conf
    # 如果觉得vim上手难度太大,可以使用gedit来进行编辑
    $ vim flume-telnet-logger.conf
    # 在conf文件中加入以下内容
    
    # Name the components on this agent
    
    a1.sources = r1
    
    a1.sinks = k1
    
    a1.channels = c1
    
     
    
    # Describe/configure the source
    
    a1.sources.r1.type = netcat
    
    a1.sources.r1.bind = localhost
    
    a1.sources.r1.port = 44444
    
     
    
    # Describe the sink
    
    a1.sinks.k1.type = logger
    
     
    
    # Use a channel which buffers events in memory
    
    a1.channels.c1.type = memory
    
    a1.channels.c1.capacity = 1000
    
    a1.channels.c1.transactionCapacity = 100
    
     
    
    # Bind the source and sink to the channel
    
    a1.sources.r1.channels = c1
    
    a1.sinks.k1.channel = c1
    

注:配置文件来源于官方手册

在这里插入图片描述

  • 先开启flume监听端口

    $ bin/flume-ng agent --conf conf/ --name a1 --conf-file job/flume-telnet-logger.conf -Dflume.root.logger=INFO,console
    
    参数说明:
    
           --conf conf/  :表示配置文件存储在conf/目录
    
           --name a1       :表示给agent起名为a1
    
           --conf-file job/flume-telnet.conf :flume本次启动读取的配置文件是在job文件夹下的flume-telnet.conf文件。
    
           -Dflume.root.logger==INFO,console :-D表示flume运行时动态修改flume.root.logger参数属性值,并将控制台日志打印级别设置为INFO级别。日志级别包括:log、info、warn、error。
    
  • 使用telnet工具向本机的44444端口发送内容

    $ telnet localhost 44444
    
  • 将A服务器上的日志实时采集到B服务器

    一般跨节点都是使用avro sink

    技术选型有两种方案:

    • exec source + memory channel + avro sink

      // Flume的关键就是写配置文件,仍然是在conf文件夹下创建配置文件
      // avro-memory-sink.conf
      
      # Name the components on this agent
      exec-memory-avro.sources = exec-source
      exec-memory-avro.sinks = arvo-sink
      exec-memory-avro.channels = memory-channel
      
      # Describe/configure the source
      exec-memory-avro.sources.exec-source.type = exec
      exec-memory-avro.sources.exec-source.command = tail -F $FLUME_HOME/logs/flume.log
      exec-memory-avro.sources.exec-source.shell = /bin/sh -c
      
      # Describe the sink
      exec-memory-avro.sinks.arvo-sink.type = avro
      exec-memory-avro.sinks.arvo-sink.hostname = localhost
      exec-memory-avro.sinks.arvo-sink.port = 44444
      
      # Use a channel which buffers events in memory
      exec-memory-avro.channels.memory-channel.type = memory
      exec-memory-avro.channels.memory-channel.capacity = 1000
      exec-memory-avro.channels.memory-channel.transactionCapacity = 100
      
      # Bind the source and sink to the channel
      exec-memory-avro.sources.exec-source.channels = memory-channel
      exec-memory-avro.sinks.arvo-sink.channel = memory-channel
      
    • avro source + memory channel + logger sink

      // avro-logger-sink.conf
      # Name the components on this agent
      avro-memory-logger.sources = avro-source
      avro-memory-logger.sinks = logger-sink
      avro-memory-logger.channels = memory-channel
      
      # Describe/configure the source
      avro-memory-logger.sources.avro-source.type = avro
      avro-memory-logger.sources.avro-source.bind = localhost
      avro-memory-logger.sources.avro-source.port = 44444
      
      # Describe the sink
      avro-memory-logger.sinks.logger-sink.type = logger
      
      # Use a channel which buffers events in memory
      avro-memory-logger.channels.memory-channel.type = memory
      avro-memory-logger.channels.memory-channel.capacity = 1000
      avro-memory-logger.channels.memory-channel.transactionCapacity = 100
      
      # Bind the source and sink to the channel
      avro-memory-logger.sources.avro-source.channels = memory-channel
      avro-memory-logger.sinks.logger-sink.channel = memory-channel
      

    接下来启动两个配置

    先启动avro-memory-logger
    
    flume-ng agent \
    
    --name avro-memory-logger \
    
    --conf $FLUME_HOME/conf \
    
    --conf-file $FLUME_HOME/conf/avro-memory-logger.conf \
    
    -Dflume.root.logger=INFO,console
    
    再启动另外一个
    
    flume-ng agent --name exec-memory-avro 
    
    --conf $FLUME_HOME/conf \
    
    --conf-file $FLUME_HOME/conf/exec-memory-avro.conf \
    
    -Dflume.root.logger=INFO,console
    
    

在这里插入图片描述

在这里插入图片描述

一个可能因为手误出现的bug

log4j:WARN No appenders could be found for logger (org.apache.flume.lifecycle.LifecycleSupervisor).
log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

出现这个错误是因为路径没有写对

往监听的日志中输入一段字符串,可以看到我们的logger sink 已经成功接收到信息

在这里插入图片描述

上面Flume的基本流程图如下

在这里插入图片描述


Kafka

Kafka是由Apache软件基金会开发的一个开源流处理平台,由ScalaJava编写。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。其持久化层本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,[3]这使它作为企业级基础设施来处理流式数据非常有价值。此外,Kafka可以通过Kafka Connect连接到外部系统(用于数据输入/输出),并提供了Kafka Streams——一个Java流式处理

具体的架构可以查看官网的intro部分

因为在实际编程中使用kafka_2.11-0.11.00以上版本和使用以下版本的Java API 不一致,所以推荐直接参照官网的文档进行编程。

环境搭建

单机单节点

搭建说明

需要有一定的Linux操作经验,对于没有权限之类的问题要懂得通过命令解决

Kafka的安装相比Flume来说更加复杂,因为Kafka依赖于Zookeeper

环境说明:

  • os:Ubuntu 18.04
  • zookeeper:zookeeper 3.4.9
  • kafka:kafka_2.11-0.11.0.0
  • jdk:jdk 8(kafka启动需要使用到jdk)

详细说明:

一、jdk安装

jdk分为以下几种:jre、openjdk、 oracle jdk,这里我们要安装的是oracle jdk(推荐安装)

add-apt-repository ppa:webupd8team/java
apt-get update
apt-get install oracle-java8-installer
apt-get install oracle-java8-set-default

测试安装版本:

img

二、安装配置zookeeper单机模式

下载zookeeper 3.4.5,开始安装(软件包详见软件包下的kafka中的压缩包):

cd /usr/local
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz

img

等待安装成功:

img

解压:

tar -zxvf zookeeper-3.4.5.tar.gz

解压后同目录下便存在相同文件夹:

img

切换到conf目录下:

cd zookeeper-3.4.5/conf/

img

复制zoo_sample.cfg到zoo.cfg:

cp zoo_sample.cfg zoo.cfg

然后编辑zoo.cfg如下(其它不用管,默认即可):

initLimit=10
syncLimit=5
dataDir=/home/young/zookeeper/data
clientPort=2181

img

别忘了新建dataDir目录:

mkdir /home/young/zookeeper/data

为zookeeper创建环境变量,打开/etc/profile文件,并在最末尾添加如下内容:

vi /etc/profile

添加内容如下:

export ZOOKEEPER_HOME=/home/young/zookeeper
export PATH=.:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH

img

配置完成之后,切换到zookeeper/bin目录下,启动服务:

img

关闭服务:

img

这里暂时先关闭zookeeper服务,防止下面使用kafka启动时报端口占用错误。

三、安装配置kafka单机模式

下载kafka(安装包详见软件包kafka下的压缩包):

cd /usr/local
wget https://www.apache.org/dyn/closer.cgi?path=/kafka/0.11.0.0/kafka_2.11-0.11.0.0.tgz

解压:

tar -zxvf kafka_2.11-0.11.0.0.tgz

img

进入kafka/config目录下:

img

以上文件是需要修改的文件,下面一个个修改配置:

配置server.properties:

以下为修改的,其他为默认即可:

#broker.id需改成正整数,单机为1就好
broker.id=1
#指定端口号
port=9092
#localhost这一项还有其他要修改,详细见下面说明
host.name=localhost
#指定kafka的日志目录
log.dirs=/usr/local/kafka_2.11-0.11.0.0/kafka-logs
#连接zookeeper配置项,这里指定的是单机,所以只需要配置localhost,若是实际生产环境,需要在这里添加其他ip地址和端口号
zookeeper.connect=localhost:2181

img

配置zookeeper.properties:

#数据目录
dataDir=/usr/local/kafka_2.11-0.11.0.0/zookeeper/data
#客户端端口
clientPort=2181
host.name=localhost

img

配置producer.properties:

zookeeper.connect=localhost:2181

img

配置consumer.properties:

zookeeper.connect=localhost:2181

img

最后还需要拷贝几个jar文件到kafka的libs目录,分别是zookeeper-xxxx.jar、log4j-xxxx.jar、slf4j-simple-xxxx.jar,最后如下:

img

四、kafka的使用

启动zookeeper服务:

bin/zookeeper-server-start.sh config/zookeeper.properties

img

img

新开一个窗口启动kafka服务:

bin/kafka-server-start.sh config/server.properties

img

img

至此单机服务搭建已经全部完成

单机多节点

对于单机单节点只需要使用一个配置文件来启动即可,那么对于单机多节点,只需要建立多个配置文件,并且启动即可。比如我们需要有三个节点。

在这里插入图片描述

然后我们的每个server properies里面的端口以及ID要不一致

server-1.properties

在这里插入图片描述

server-2.properties

在这里插入图片描述

server-3.properties

在这里插入图片描述

当然其对应的log对应目录也要修改,这个就不多说了

然后在控制台启动

> bin/kafka-server-start.sh config/server-1.properties &
> bin/kafka-server-start.sh config/server-2.properties &
> bin/kafka-server-start.sh config/server-3.properties &

通过jps -m 能看到三个kafka即可(可能以普通用户看不到相应的进程,只是因为没给到权限,可以给权限或者直接sudo su切换到超级用户)

Kafka控制台的一些命令操作

控制台中我们可以通过命令建立topic,并且开启一个消费者一个生产者来模拟通信,这些在官网的quickstart中都有详尽的描述

[外链图片转存失败(img-cCfCODtn-1569486879029)(../%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%9C%80%E7%BB%88%E7%89%88%E6%96%87%E6%A1%A3/kafka%E5%AD%A6%E4%B9%A0/producer.png)]

在这里插入图片描述

通过我们的一个叫topic的标签,我们建立了一个生产者和一个消费者,可以明显看到消费者接收到了生产者的消息。其他比较常用的命令,比如describe等可以自行探索。

Java API控制Kafka

接下来会说一个简单的在Java中使用Kafka小例子

这里都是基于2.11_0.11.0.0.0版本以及之后的编程来说明,更低版本相应的API有些许变化,低版本中很多函数已经被替代和废除。

基本配置

  • 首先在Idea中建立一个新的Maven项目,这里我们选择一个achetype:scala-archetype-simple

在这里插入图片描述

  • 接下来我们把Maven文件配置好,并且auto import dependencies,这里如果没有选择auto import,我们可以在Pom.xml右键找到maven选项里面有一个reload

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.test.spark</groupId>
      <artifactId>spark streaming</artifactId>
      <version>
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python爬虫是一种用于抓取网页数据的程序,它可以通过发送HTTP请求并解析HTML内容来提取所需的数据。通过使用Python库如BeautifulSoup和Scrapy,我们可以编写爬虫来自动化数据收集和提取。 Flume是一个分布式的、可靠的、可扩展的日志收集、聚合和传输系统。它可以从多个源采集实时数据,并将其传输到其他处理系统中,如Hadoop和SparkKafka是一个高吞吐量的分布式数据流平台,它允许以实时方式收集、处理和存储数据流。它被广泛用于大数据和流处理应用中,包括实时推荐、日志处理和事件驱动的架构。 Spark Streaming是Apache Spark的一个子项目,它允许在实时流数据中进行高效的流处理。Spark Streaming可以与Kafka等数据源集成,以实时的方式处理来自不同源的数据,并进行转换、分析和存储。 MySQL是一种关系型数据库管理系统,它被广泛用于存储和管理结构化数据。在上述技术栈中,MySQL可以被用作存储爬虫抓取的数据、Kafka传输的数据和Spark Streaming处理的数据。 ECharts是一种用于数据可视化的JavaScript图表库,它可以将数据转化为图表和图形,使数据更易于理解和分析。 综上所述,以上提到的技术可以结合使用来构建一个完整的实时数据处理和可视化系统。Python爬虫用于抓取实时数据,Flume用于收集和传输数据,Kafka用于数据流处理,Spark Streaming用于实时分析,MySQL用于数据存储,最后使用ECharts将数据可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值