Integración y Desarrollo de Flume+HBase+Kafka

 


   El contenido de hoy es para completar el desarrollo integrado de Flume+HBase+Kafka. Como se muestra en el cuadro rojo de la figura a continuación, hay dos fuentes de Flume en el nodo 1: la salida del sumidero del nodo 2 y el nodo 3. El nodo 1 realiza el preprocesamiento después de recibirlo y luego lo envía a HBase y Kafka en forma de AsyncHBaseSink (HBaseSink) y Kafka Sink para el procesamiento de datos fuera de línea y en tiempo real.

 

1. Descargue el código fuente de Flume e importe la herramienta de desarrollo Idea

  1) Descargar el código fuente apache-flume-1.7.0-src.tar.gz a la descompresión local

  2) Importar el código fuente del canal a través de la idea

  Abra la herramienta de desarrollo de ideas, seleccione Archivo—>Abrir

 

 

  Luego busque el archivo de descompresión del código fuente del canal, seleccione flume-ng-hbase-sink y haga clic en Aceptar para cargar el código fuente del módulo correspondiente.

 

 

                             

 

2. Introducción a los parámetros de la integración canal oficial y hbase

 Flume Sink -> AsyncHBaseSink en http://flume.apache.org/FlumeUserGuide.html

 

 

  Entre ellos, los atributos en negrita deben configurarse, y los demás se utilizan como parámetros de optimización. El atributo payloadColumn le dice a HBase cuántas columnas escribir en la familia de columnas columnFamily.

 

3. Descargar datos de registro y analizar

  Vaya a Sogou Labs para descargar los registros de consultas de los usuarios (este proceso se completó en la implementación anterior del entorno HBase, si tiene alguna pregunta, puede regresar y verificar:  Implementación y diseño de clústeres distribuidos HBase )

 1. Introducción

  La biblioteca de registro de consultas del motor de búsqueda está diseñada como una colección de datos de registro de consultas web que incluye algunos requisitos de consulta de páginas web del motor de búsqueda Sogou y los clics de los usuarios durante aproximadamente un mes (junio de 2008). Proporcionar un corpus de investigación de referencia para los investigadores que realizan análisis del comportamiento de los usuarios de motores de búsqueda chinos.

 2) Descripción del formato

  El formato de datos es: tiempo de acceso\ID de usuario\t[palabra de consulta]\trank de la URL en los resultados devueltos\tnúmero de secuencia en el que hizo clic el usuario\tURL en la que hizo clic el usuario

  Entre ellos, el ID de usuario se asigna automáticamente según la información de la cookie cuando el usuario utiliza el navegador para acceder al motor de búsqueda, es decir, distintas consultas introducidas por un mismo navegador corresponden a un mismo ID de usuario.

 

  Estos datos se utilizarán como datos de origen de este proyecto y se almacenarán en el Nodo 2 y el Nodo 3.

 

4. Configuración de la integración del nodo de agregación flume agent-3 y HBase

  Conecte el nodo 1 con notepad++ y cambie el nombre del archivo de configuración.

 

 

  Configurar el archivo fulme-env.sh

 

 

  Configure el archivo flume-conf.properties

 

 

  El formato de la plantilla original es desordenado, simplemente elimínelo todo e ingrese el siguiente contenido:

agent1.sources = r1
agent1.channels = kafkaC hbaseC
agent1.sinks = kafkaSink hbaseSink

agent1.sources.r1.type = avro
agent1.sources.r1.channels = hbaseC
agent1.sources.r1.bind = bigdata-pro01.kfk.com
agent1.sources.r1.port = 5555
agent1.sources.r1.threads = 5

agent1.channels.hbaseC.type = memory
agent1.channels.hbaseC.capacity = 100000
agent1.channels.hbaseC.transactionCapacity = 100000
agent1.channels.hbaseC.keep-alive = 20

agent1.sinks.hbaseSink.type = asynchbase
agent1.sinks.hbaseSink.table = weblogs
agent1.sinks.hbaseSink.columnFamily = info
agent1.sinks.hbaseSink.serializer = org.apache.flume.sink.hbase.KfkAsyncHbaseEventSerializer
agent1.sinks.hbaseSink.channel = hbaseC
agent1.sinks.hbaseSink.serializer.payloadColumn = datatime,userid,searchname,retorder,cliorder,cliurl

 

 

5. Formatee los datos de registro

 1) Reemplace la pestaña en el archivo con una coma

cat weblog.log|tr "\t" "," > weblog2.log

 

 2) Reemplace los espacios en el archivo con comas

cat weblog2.log|tr " " "," > weblog3.log

 

[kfk@bigdata-pro01 datas]$ rm -f weblog2.log
[kfk@bigdata-pro01 datas]$ rm -f weblog.log
[kfk@bigdata-pro01 datas]$ mv weblog3.log weblog.log
[kfk@bigdata-pro01 datas]$ ls
  wc.input  weblog.log

 3) Luego distribuir a los nodos 2 y 3

[kfk@bigdata-pro01 datas]$ scp weblog.log bigdata-pro02.kfk.com:/opt/datas/
weblog.log                                                                                                                 100%  145MB  72.5MB/s   00:02   
[kfk@bigdata-pro01 datas]$ scp weblog.log bigdata-pro03.kfk.com:/opt/datas/
weblog.log

 

6. Diseño y desarrollo del programa SinkHBase personalizado

 1) Imitar SimpleAsyncHbaseEventSerializer para personalizar la clase de implementación de KfkAsyncHbaseEventSerializer, solo modifique el código.

 

@Override
    public List getActions() {
        List actions = new ArrayList();
        if (payloadColumn != null) {
            byte[] rowKey;
            try {
                /*---------------------------代码修改开始---------------------------------*/
                //解析列字段
                String[] columns = new String(this.payloadColumn).split(",");
                //解析flume采集过来的每行的值
                String[] values = new String(this.payload).split(",");
                for(int i=0;i < columns.length;i++){
                    byte[] colColumn = columns[i].getBytes();
                    byte[] colValue = values[i].getBytes(Charsets.UTF_8);

                    //数据校验:字段和值是否对应
                    if(colColumn.length != colValue.length) break;
                    //时间
                    String datetime = values[0].toString();
                    //用户id
                    String userid = values[1].toString();
                    //根据业务自定义Rowkey
                    rowKey = SimpleRowKeyGenerator.getKfkRowKey(userid,datetime);
                    //插入数据
                    PutRequest putRequest =  new PutRequest(table, rowKey, cf,
                            colColumn, colValue);
                    actions.add(putRequest);
                /*---------------------------代码修改结束---------------------------------*/
                }
            } catch (Exception e) {
                throw new FlumeException("Could not get row key!", e);
            }
        }
        return actions;
    }

 

 

 2) En la clase SimpleRowKeyGenerator, personalice el método de generación de Rowkey según el negocio específico

/**
   * 自定义Rowkey
   * @param userid
   * @param datetime
   * @return
   * @throws UnsupportedEncodingException
   */

  public static byte[] getKfkRowKey(String userid,String datetime)throws UnsupportedEncodingException {
    return (userid + datetime + String.valueOf(System.currentTimeMillis())).getBytes("UTF8");
  }

 

7. Personaliza el compilador para hacer un paquete jar

 1) En la herramienta de ideas, seleccione Archivo—>ProjectStructrue

 

 

 2) Seleccione Artefactos a la izquierda, luego haga clic en el signo + a la derecha y finalmente seleccione JAR—>Desde módulos con dependencias

 

 

 3) Luego haga clic en Aceptar directamente

 

 

 4) Luego haga clic en aplicar, ok a su vez

 

 

 6) Haga clic en compilar para compilar y se empaquetará automáticamente en un paquete jar

 

 

 

 7) Vaya al directorio del proyecto y busque el paquete jar que acaba de crear

 

 

 8) Reemplace el nombre del paquete con el nombre del paquete flume-ng-hbase-sink-1.7.0.jar que viene con flume, y luego cárguelo en el directorio flume/lib para sobrescribir el paquete jar original.

 

 

8. Configuración del nodo de agregación de canales integrado con Kafka

Continúe agregando el siguiente contenido   al archivo flume-conf.properties :

#*****************flume+Kafka***********************
agent1.channels.kafkaC.type = memory
agent1.channels.kafkaC.capacity = 100000
agent1.channels.kafkaC.transactionCapacity = 100000
agent1.channels.kafkaC.keep-alive = 20

agent1.sinks.kafkaSink.channel = kafkaC
agent1.sinks.kafkaSink.type = org.apache.flume.sink.kafka.KafkaSink
agent1.sinks.kafkaSink.brokerList = bigdata-pro01.kfk.com:9092,bigdata-pro02.kfk.com:9092,bigdata-pro03.kfk.com:9092
agent1.sinks.kafkaSink.topic = test
agent1.sinks.kafkaSink.zookeeperConnect = bigdata-pro01.kfk.com:2181,bigdata-pro02.kfk.com:2181,bigdata-pro03.kfk.com:2181
agent1.sinks.kafkaSink.requiredAcks = 1
agent1.sinks.kafkaSink.batchSize = 1
agent1.sinks.kafkaSink.serializer.class = kafka.serializer.StringEncoder

 


 

 Lo anterior es el contenido principal de esta sección que el blogger les presentó. Este es el propio proceso de aprendizaje del blogger. Espero que pueda brindarles alguna orientación. Si es útil, espero que puedan apoyarlo. Si no es útil a ti también espero perdonar, y por favor señalar cualquier error. Si lo espera con ansias, puede seguir al blogger para obtener la actualización lo antes posible, ¡gracias! Al mismo tiempo, la reimpresión también es bienvenida, pero la dirección original debe marcarse en la posición obvia de la publicación del blog, ¡y el derecho de interpretación pertenece al bloguero!

Supongo que te gusta

Origin blog.csdn.net/py_123456/article/details/83587120
Recomendado
Clasificación