Dos formas de combinar Flume y SparkStream: tire

Hola a todos:

   Cómo flume se conecta al tirón de SparkStream,

Una breve introducción: SparkStream extrae datos de flume

---- archivo de configuración de flume flume-poll.conf

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /root/flume
a1.sources.r1.fileHeader = true

# Describe the sink
a1.sinks.k1.type = org.apache.spark.streaming.flume.sink.SparkSink
a1.sinks.k1.hostname = 192.168.17.108
a1.sinks.k1.port = 8888

# 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

 

Paso 1: primero ejecute flume en la máquina virtual

bin/flume-ng agent -n a1 -c conf/ -f conf/flume-poll.conf -Dflume.root.logger=WARN,console

Requisito previo: coloque el archivo spark-assembly-1.6.1-hadoop2.6.0.jar y spark-streaming-flume-sink_2.10-1.6.1.jar descargados en el directorio lib de flume

--- El código de cómo flume se conecta al tirón de SparkStream es el siguiente:

package SparkStream

import java.net.{InetSocketAddress}

import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.flume.FlumeUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by Administrator on 2017/10/10.
  * 功能:演示flume和sparkstreaming的结合 pull的形式
  *
  */
object FlumePullDemon {
  def main(args: Array[String]): Unit = {
    //设置日志的级别
    LoggerLevels.setStreamingLogLevels()
    val conf=new SparkConf().setAppName("FlumePullDemon").setMaster("local[2]")
    val sc=new SparkContext(conf)
    val ssc=new StreamingContext(sc,Seconds(5))
    //从flume中拉取数据  192.168.17.108 是flume的地址  ip地址可以写多个
//    val address=Seq(new InetSocketAddress("192.168.17.108",1111),new InetSocketAddress("192.168.17.109",1111))
    val address=Seq(new InetSocketAddress("192.168.17.108",8888)) // 用一个ip形式
    val flumeStream=FlumeUtils.createPollingStream(ssc,address,StorageLevel.MEMORY_ONLY_SER)

    val words=flumeStream.flatMap(x=>new String(x.event.getBody.array()).split(" ").map((_,1)))
    val result=words.reduceByKey(_+_)
    result.print()


    //启动
    ssc.start()
    // 等待结束
    ssc.awaitTermination()
  }

}

 

Paso 2: Ejecute el programa Sparkstream en la idea local. Después del funcionamiento normal, la captura de pantalla es la siguiente:

Esto significa que ss se ha estado ejecutando normalmente, porque no hay datos en el directorio monitoreado por flume, por lo que el resultado está vacío.

Cambie al directorio monitoreado por flume y cree manualmente los datos

cd /root/flume

echo "bejing huan ying ni88" >> test.log

 

Observe los resultados de ejecución de ss en esta máquina: Los resultados son los siguientes:

El resultado se muestra correctamente, la verificación está completa

Nota: 1 La dirección IP en los archivos de configuración ss y flume se refiere a la dirección de la máquina que ejecuta flume

      2 El método de extracción puede seleccionar varias direcciones de canal, solo configúrelo en Seq

  3 Después de que se ejecute el archivo por lotes actual, flume agregará COMPLETED después del nombre del archivo, por ejemplo, cambie el archivo "test.log" a "test.log.COMPLETED", que es el mismo que el método push.

4 Durante la prueba, se encuentra que flume informará el error de uso repetido del nombre de archivo. Este error es el mismo que el error encontrado cuando Flume se acopla con el método push de ss, por lo que no lo repetiré aquí.

 

 

Supongo que te gusta

Origin blog.csdn.net/zhaoxiangchong/article/details/78380190
Recomendado
Clasificación