基於 Docker 構建 Flume -- Part1

注:該文的原文爲 Using Docker with Apache Flume - Part 1,由 Alex Wilson 編寫。java

在 Unruly ,咱們使用 Apache Flume 做爲事件流架構的一部分。在源斷和 sinks 端,它使很是容易創建以及丟棄的。在個人創新時間,我嘗試創立一些 Flume 技術來得到 Docker 和集裝箱運輸的知識。docker

創建一個基礎鏡像

Docker 有鏡像的概念,在這個鏡像中咱們能運行一個容器。所以,第一步就是建立一個預安裝了 Flume 的鏡像。Flume 僅僅依賴 java(它是一個java工程),我在一個 Ubuntu 基礎鏡像的基礎上建立了它,建立它須要執行如下步驟:apache

  • 安裝 java 和 wget
  • 下載和解壓 flume 工程到 /opt/flume 目錄下
  • 設置 JAVA_HOME 和把 flume-ng 添加進 PATH

以下所作,建立一個 dockerfile :ubuntu

FROM ubuntu

# install wget + java
RUN apt-get update -q
RUN DEBIAN_FRONTEND=noninteractive apt-get install \
  -qy --no-install-recommends \
  wget openjdk-7-jre

# download and unzip Flume
RUN mkdir /opt/flume
RUN wget -qO- \
  https://archive.apache.org/dist/flume/stable/apache-flume-1.4.0-bin.tar.gz \
  | tar zxvf - -C /opt/flume --strip 1

# set environment variables
ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
ENV PATH /opt/flume/bin:$PATH

經過這個 Dockerfile 構建一個鏡像(使用 docker build -t flume .),將給咱們一個基礎鏡像,以使 Flume 容器使用。它是可用的,你能夠在 Docker index 找到它。架構

一個基礎的 Flume 拓撲

一個 Flume 拓撲由 agent 組成,它有3個核心概念:sources、channels 和 sinks。jvm

咱們從 sources 接收數據,把它放入一個或是多個的 channels ,它能被 sinks 讀取和加工。大部分的基礎拓撲由一個節點組成,咱們創建瞭如下一個由 Docker 建立的節點,使用:ui

  • 一個 NetcatSource,從一個端口讀取數據而且變成事件
  • 一個 MemoryChannel,存放在內存中的事件 buffering 。
  • 一個 LoggerSink,記錄它接收到的事件

這個拓撲的配置文件,咱們稱之爲 flume-example.conf 配置文件像以下這樣:.net

docker.sinks = logSink
docker.sources = netcatSource
docker.channels = inMemoryChannel

docker.sources.netcatSource.type = netcat
docker.sources.netcatSource.bind = 0.0.0.0
docker.sources.netcatSource.port = 44444
docker.sources.netcatSource.channels = inMemoryChannel

docker.channels.inMemoryChannel.type = memory
docker.channels.inMemoryChannel.capacity = 1000
docker.channels.inMemoryChannel.transactionCapacity = 100

docker.sinks.logSink.type = logger
docker.sinks.logSink.channel = inMemoryChannel

咱們將使用這個配置文件建立一個新容器,而且啓動 docker agent。code

FROM probablyfine/flume

ADD flume-example.conf /var/tmp/flume-example.conf

EXPOSE 44444

ENTRYPOINT [ "flume-ng", "agent",
  "-c", "/opt/flume/conf", "-f", "/var/tmp/flume-example.conf", "-n", "docker",
  "-Dflume.root.logger=INFO,console" ]

ENTRYPOINT 塊的 flume-ng 的命令將在一個啓動的容器中運行(配置文件的目錄,配置文件,和agent 名字),而且 EXPOSE 指令使得端口在運行期是可用的。NetcatSource 在監聽這個端口。事件

一旦咱們建立了這個新鏡像(咱們叫作 flume-example),咱們就能夠經過使用命令 docker run -p 444:44444 -t flume-example 啓動這個容器,p 444:44444 指令將讓容器中的 4444 端口和本機的 444 端口作映射。如今咱們能夠經過 echo foo bar baz | nc localhost 444 給它發送消息了,而後看被記錄的事件。

...
2014-05-05 19:26:13,218 (SinkRunner-PollingRunner-DefaultSinkProcessor)
  [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:70)]
  Event: { headers:{} body: 66 6F 6F 20 62 61 72 20 62 61 7A foo bar baz }
...

簡直酷斃了!如今咱們有一個工做的 Flume agent 能夠獲取和處理數據了。

下一篇文章,將展現更多的有趣的 Flume 技術,而且咱們能夠更早的把 Docker 的特性和 Flume 的創建整合起來(好比共享一個卷和只讀的掛載)。

相關文章
相關標籤/搜索