Adquisición de datos de canal

Módulo de adquisición de datos de canal

1. 1 enlace de procesamiento de datos

1.2 Preparación del entorno

1.2.1 Script de visualización  del proceso de clúster _ _ _

(1) Cree el script xcall.sh en el directorio /home/bigdata_admin/bin

[bigdata_admin@hadoop102  bin]$ vim xcall.sh

(2) Escriba el siguiente contenido en el guión

#! /bin/bash



for i in hadoop102 hadoop103 hadoop104

do

    echo --------- $i ----------

    ssh $i "$*"

done

(3) Modificar el permiso de ejecución del script

[bigdata_admin@hadoop102 bin ]$ chmod 777 xcall.sh

(4) Guión de inicio

[bigdata_admin@hadoop102 bin ]$ xcall.sh jps

1.2.2 Instalación de Hadoop _ _

1) Pasos de instalación

levemente

2) Experiencia en proyectos

(1) multidirectorio de almacenamiento HDFS basado en la experiencia del proyecto

No es necesario configurar el proyecto de la máquina virtual, solo tenemos un disco.

1. Estado del disco del servidor del entorno de producción

2. Configure varios directorios en el archivo hdfs-site.xml y preste atención a los derechos de acceso del disco recién montado.

La ruta donde el nodo DataNode de HDFS guarda los datos está determinada por el parámetro dfs.datanode.data.dir y su valor predeterminado es file://${hadoop.tmp.dir}/dfs/data .Si el servidor tiene varios discos, debe configurar los Los parámetros se modifican. Si el disco del servidor se muestra en la figura anterior, este parámetro debe modificarse al siguiente valor.

<property>

    <name>dfs.datanode.data.dir</name>

<value>file:///dfs/data1,file:///hd2/dfs/data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4</value>

</property>

Nota: Los discos montados en cada servidor son diferentes, por lo que la configuración de directorios múltiples de cada nodo puede ser inconsistente. Se puede configurar individualmente .

(2) Balance de datos de clúster de la experiencia del proyecto

1 Saldo de datos entre nodos

Habilite el comando de balance de datos.

start-balancer.sh -umbral 10

Para el parámetro 10, significa que la utilización del espacio en disco de cada nodo en el clúster no difiere en más del 10 %, lo que se puede ajustar según la situación real.

Detenga el comando de balance de datos.

stop-balancer.sh

2 Balance de datos entre discos

Generar un plan equilibrado (solo tenemos un disco, no se generará ningún plan).

balanceador de disco hdfs -plan hadoop103

Ejecutar un plan equilibrado.

balanceador de disco hdfs -ejecutar hadoop103.plan.json

Ver el estado de ejecución de la tarea de saldo actual.

balanceador de disco hdfs -consulta hadoop103

Cancelar la tarea de saldo.

balanceador de disco hdfs -cancel hadoop103.plan.json

(3) Ajuste de parámetros de Hadoop basado en la experiencia del proyecto

1. Ajuste de parámetros HDFS hdfs-site.xml

The number of Namenode RPC server threads that listen to requests from clients. If dfs.namenode.servicerpc-address is not configured then Namenode RPC server threads listen to requests from all nodes.

NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。

对于大集群或者有大量客户端的集群来说,通常需要增大参数dfs.namenode.handler.count的默认值10。

<property>

    <name>dfs.namenode.handler.count</name>

    <value>10</value>

</property>

dfs.namenode.handler.count=20*log(e)(ClusterSize), por ejemplo, cuando el tamaño del clúster es 8, este parámetro se establece en 41. Este valor se puede calcular mediante un código Python simple, el código es el siguiente.

[bigdata_admin@hadoop102 ~] $ pitón

Python 2.7.5 (predeterminado, 11 de abril de 2018, 07:36:10)

[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] en linux2

Escriba "ayuda", "derechos de autor", "créditos" o "licencia" para obtener más información.

>>> importar matemáticas

>>> print int(20*math.log(8))

41

>>> salir()

2. Ajuste del parámetro YARN yarn-site.xml

Descripción del escenario : Un total de 7 máquinas, cientos de millones de datos por día, fuente de datos->Flume->Kafka->HDFS->Hive

Problemas a los que se enfrenta : HiveSQL se usa principalmente para estadísticas de datos, no hay sesgo de datos, se han fusionado archivos pequeños, la JVM está habilitada para su reutilización, la E/S no está bloqueada y se usa menos del 50 % de la memoria. Pero todavía funciona muy lentamente, y cuando el volumen de datos alcanza su punto máximo, todo el clúster se cae. En base a esta situación, ¿hay algún plan de optimización?

Solución :

Utilización de memoria insuficiente. Esto generalmente se debe a dos configuraciones de Yarn, el tamaño máximo de memoria que puede solicitar una sola tarea y el tamaño de memoria disponible de un solo nodo de Hadoop. El ajuste de estos dos parámetros puede mejorar la utilización de la memoria del sistema.

(a) hilo.nodemanager.resource.memory-mb

Indica la cantidad total de memoria física que YARN puede usar en este nodo. El valor predeterminado es 8192 (MB). Tenga en cuenta que si el recurso de memoria de su nodo no es suficiente para 8 GB, debe reducir este valor y YARN no detectará de manera inteligente el memoria física de la cantidad total del nodo.

(b) hilo.programador.asignación máxima-mb

La cantidad máxima de memoria física que puede solicitar una sola tarea, el valor predeterminado es 8192 (MB).

1.2.3  Instalación de Zookeeper _

1 ) Pasos de instalación

levemente

2 ) Script de inicio y parada del clúster ZK

(1) Cree un script en el directorio /home/bigdata_admin/bin de hadoop102

[bigdata_admin@hadoop102 bin]$ vim zk.sh

Escriba lo siguiente en el guión.

#!/bin/bash



case $1 in

"start"){

for i in hadoop102 hadoop103 hadoop104

do

        echo ---------- zookeeper $i 启动 ------------

ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"

done

};;

"stop"){

for i in hadoop102 hadoop103 hadoop104

do

        echo ---------- zookeeper $i 停止 ------------    

ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"

done

};;

"status"){

for i in hadoop102 hadoop103 hadoop104

do

        echo ---------- zookeeper $i 状态 ------------    

ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"

done

};;

esac

(2) Aumentar el permiso de ejecución del script

[bigdata_admin@hadoop102 bin]$ chmod 777 zk.sh

(3) Script de inicio del clúster de Zookeeper

[módulo bigdata_admin@hadoop102]$ zk.sh inicio

(4) Script de parada del grupo Zookeeper

[módulo bigdata_admin@hadoop102]$ zk.sh parada

1.2.4 Instalación  de Kafka _ _ _

1 ) Pasos de instalación

levemente

1.2.5 Instalación de canal _ _

De acuerdo con la planificación del canal de recolección, se debe implementar un Flume en los tres nodos de hadoop102, hadoop103 y hadoop104 respectivamente. Puede consultar los siguientes pasos para instalarlo primero en Hadoop 102 y luego distribuirlo.

1) Pasos de instalación

levemente

2) Distribuya Flume a hadoop 103 , hadoop 104

[bigdata_admin@hadoop102 ~]$ xsync /opt/module/flume/

3) Experiencia en proyectos

(1) Ajuste de la memoria del montón

La memoria del montón de Flume generalmente se establece en 4G o superior, y la configuración es la siguiente:

Modifique el archivo /opt/module/flume/conf/flume-env.sh y configure los siguientes parámetros (el entorno de la máquina virtual aún no está configurado)

exportar JAVA_ OPTS ="-Xms 4096 m -Xmx 4096 m -Dcom.sun.management.jmxremote"

Nota:

-Xms indica el tamaño mínimo de JVM Heap (memoria de montón), asignación inicial;

-Xmx indica el tamaño máximo permitido de JVM Heap (memoria de montón), asignado bajo demanda.

1.3 Canal  de recogida de troncos

1.3.1 Descripción general de la configuración del canal de recolección de registros

De acuerdo con el plan, los archivos de registro del comportamiento del usuario que se recopilarán se distribuyen en dos servidores de registro, hadoop102 y hadoop103, por lo que la recopilación de registros Flume debe configurarse en dos nodos, hadoop102 y hadoop103. Recopilación de registros Flume necesita recopilar el contenido de los archivos de registro, verificar el formato de registro (JSON) y luego enviar los registros verificados a Kafka.

Aquí puede elegir TaildirSource y KafkaChannel, y configurar interceptores de verificación de registros.

Las razones para elegir TailDirSource y KafkaChannel son las siguientes:

1)TailDirFuente

Ventajas de TailDirSource sobre ExecSource y SpoolingDirectorySource.

TailDirSource: resumen de punto de interrupción, multidirectorio . Antes de Flume 1.6, era necesario personalizar la fuente para registrar la ubicación del archivo cada vez que se leía , a fin de realizar la reanudación del punto de interrupción.

ExecSource puede recopilar datos en tiempo real, pero los datos se perderán si Flume no se está ejecutando o si falla el comando Shell.

SpoolingDirectorySource supervisa directorios y admite cargas reanudables.

2) Canal Café

El uso de Kafka  Channel ahorra Sink y mejora la eficiencia.

La configuración clave de Flume de recopilación de registros es la siguiente:

1.3.2 Recopilación de registros Práctica de configuración de canales

1) Cree un archivo de configuración de Flume

(1) Cree file_to_kafka.conf en el directorio de trabajo de Flume en el nodo hadoop102.

[bigdata_admin@hadoop102 flume]$ mkdir trabajo

[bigdata_admin@hadoop102 flume]$ trabajo vim/file_to_kafka.conf

El contenido del archivo de configuración es el siguiente:

#为各组件命名

a1.sources = r1

a1.channels = c1



#描述source

a1.sources.r1.type = TAILDIR

a1.sources.r1.filegroups = f1

a1.sources.r1.filegroups.f1 = /opt/module/applog/log/app.*

a1.sources.r1.positionFile = /opt/module/flume/taildir_position.json

a1.sources.r1.interceptors =  i1

a1.sources.r1.interceptors.i1.type = com.bigdata_admin.flume.interceptor.ETLInterceptor$Builder



#描述channel

a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel

a1.channels.c1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092

a1.channels.c1.kafka.topic = topic_log

a1.channels.c1.parseAsFlumeEvent = false



#绑定source和channel以及sink和channel的关系

a1.sources.r1.channels = c1

(2) Distribuir archivos de configuración a hadoop103

[bigdata_admin@hadoop102 flume]$ trabajo xsync

2 ) Escriba un interceptor Flume

(1) Cree un canal-interceptor del proyecto Maven

(2) Crear paquete: com.bigdata_admin.flume.interceptor

(3) Agregue la siguiente configuración al archivo pom.xml

<dependencies>
    <dependency>
        <groupId>org.apache.flume</groupId>
        <artifactId>flume-ng-core</artifactId>
        <version>1.9.0</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.62</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

(4) Cree la clase JSONUtils en el paquete com.bigdata_admin.flume.interceptor

package com.bigdata_admin.flume.interceptor;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;

public class JSONUtils {
    public static boolean isJSONValidate(String log){
        try {
            JSON.parse(log);
            return true;
        }catch (JSONException e){
            return false;
        }
    }
}

(5) Cree una clase ETLInterceptor en el paquete com.bigdata_admin.flume.interceptor

package com.bigdata_admin.flume.interceptor;



import com.alibaba.fastjson.JSON;

import org.apache.flume.Context;

import org.apache.flume.Event;

import org.apache.flume.interceptor.Interceptor;



import java.nio.charset.StandardCharsets;

import java.util.Iterator;

import java.util.List;



public class ETLInterceptor implements Interceptor {



    @Override

    public void initialize() {



    }



    @Override

    public Event intercept(Event event) {



        byte[] body = event.getBody();

        String log = new String(body, StandardCharsets.UTF_8);



        if (JSONUtils.isJSONValidate(log)) {

            return event;

        } else {

            return null;

        }

    }



    @Override

    public List<Event> intercept(List<Event> list) {



        Iterator<Event> iterator = list.iterator();



        while (iterator.hasNext()){

            Event next = iterator.next();

            if(intercept(next)==null){

                iterator.remove();

            }

        }



        return list;

    }



    public static class Builder implements Interceptor.Builder{



        @Override

        public Interceptor build() {

            return new ETLInterceptor();

        }

        @Override

        public void configure(Context context) {



        }

    }



    @Override

    public void close() {



    }

}

(6) Embalaje

flume-interceptor-1.0-SNAPSHOT-jar-with-dependencies.jar

(7) Debe colocar el paquete empaquetado en la carpeta /opt/module/flume/lib de hadoop102 y hadoop103.

1.3.3 Recolección de troncos Prueba de canal

1) Inicie los clústeres de Zookeeper y Kafka

2) Inicie la recopilación de registros Flume de hadoop 102

[bigdata_admin@hadoop102 flume]$ bin/flume-ng agent -n a1 -c conf/ -f job/file_to_kafka.conf -Dflume.root.logger=info,console

3) Inicie un consumidor de consola Kafka

[bigdata_admin@hadoop102 kafka]$ bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic topic_log

4 ) Generar datos simulados

[bigdata_admin@hadoop102 ~]$ lg.sh

5 ) Observar si los consumidores de Kafka pueden consumir datos

1.3.4 Secuencia de comandos de inicio y detención de Flume para la recopilación de registros

1 ) Distribuya los interceptores y los archivos de configuración de Flume de recopilación de registros

Si pasa la prueba anterior, debe enviar una copia del archivo de configuración de Flume y el paquete jar del interceptor del nodo hadoop102 a otro servidor de registro.

[bigdata_admin@hadoop102 flume]$ scp -r trabajo hadoop103:/opt/module/flume/

[bigdata_admin@hadoop102 flume]$ scp lib/flume-interceptor-1.0-SNAPSHOT-jar-with-dependencies.jar hadoop103:/opt/module/flume/lib/

2) Para mayor comodidad, aquí hay una secuencia de comandos para iniciar y detener el proceso Flume de recopilación de registros

(1) Cree el script f1.sh en el directorio /home/bigdata_admin/bin del nodo hadoop102

[bigdata_admin@hadoop102 bin]$ vim f1.sh

Complete el siguiente contenido en el script.

#!/bin/bash



case $1 in

"start"){

        for i in hadoop102 hadoop103

        do

                echo " --------启动 $i 采集flume-------"

                ssh $i "nohup /opt/module/flume/bin/flume-ng agent -n a1 -c /opt/module/flume/conf/ -f /opt/module/flume/job/file_to_kafka.conf >/dev/null 2>&1 &"

        done

};;

"stop"){

        for i in hadoop102 hadoop103

        do

                echo " --------停止 $i 采集flume-------"

                ssh $i "ps -ef | grep file_to_kafka | grep -v grep |awk  '{print \$2}' | xargs -n1 kill -9 "

        done



};;

esac

(2) Aumentar el permiso de ejecución del script

[bigdata_admin@hadoop102 bin]$ chmod 777 f1.sh

(3) inicio f1

[bigdata_admin@hadoop102 module]$ f1.sh inicio

(4) parada f2

[bigdata_admin@hadoop102 module]$ f1.sh parada

1.4 registro de consumo Flume

1.4.1 Resumen de la configuración del canal de consumo de troncos

De acuerdo con el plan, Flume necesita enviar los datos topic_log en Kafka a HDFS. Y distinga los registros de comportamiento del usuario generados todos los días y envíe los datos de diferentes días a las rutas de diferentes días en HDFS.

Aquí seleccione KafkaSource, FileChannel, HDFSSink.

La configuración clave es la siguiente:

1.4.2 Práctica de configuración de canal de consumo de troncos

1) Cree un archivo de configuración de Flume

Cree kafka_to_hdfs_log.conf en el directorio de trabajo de Flume en el nodo hadoop104.

[bigdata_admin@hadoop104 flume]$ trabajo vim/kafka_to_hdfs_log.conf

El contenido del archivo de configuración es el siguiente:

## 组件

a1.sources=r1

a1.channels=c1

a1.sinks=k1



## source1

a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource

a1.sources.r1.batchSize = 5000

a1.sources.r1.batchDurationMillis = 2000

a1.sources.r1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092,hadoop104:9092

a1.sources.r1.kafka.topics=topic_log

a1.sources.r1.interceptors = i1

a1.sources.r1.interceptors.i1.type = com.bigdata_admin.flume.interceptor.TimeStampInterceptor$Builder



## channel1

a1.channels.c1.type = file

a1.channels.c1.checkpointDir = /opt/module/flume/checkpoint/behavior1

a1.channels.c1.dataDirs = /opt/module/flume/data/behavior1/

a1.channels.c1.maxFileSize = 2146435071

a1.channels.c1.capacity = 1000000

a1.channels.c1.keep-alive = 6





## sink1

a1.sinks.k1.type = hdfs

a1.sinks.k1.hdfs.path = /origin_data/gmall/log/topic_log/%Y-%m-%d

a1.sinks.k1.hdfs.filePrefix = log-

a1.sinks.k1.hdfs.round = false





a1.sinks.k1.hdfs.rollInterval = 10

a1.sinks.k1.hdfs.rollSize = 134217728

a1.sinks.k1.hdfs.rollCount = 0



## 控制输出文件是原生文件。

a1.sinks.k1.hdfs.fileType = CompressedStream

a1.sinks.k1.hdfs.codeC = gzip



## 拼装

a1.sources.r1.channels = c1

a1.sinks.k1.channel= c1

Nota: optimización de la configuración

(1) optimización de FileChannel

Al configurar dataDirs para apuntar a varias rutas , cada ruta corresponde a un disco duro diferente, lo que aumenta el rendimiento de Flume.

La descripción oficial es la siguiente:

 Lista de directorios separados por comas para almacenar archivos de registro. El uso de varios directorios en discos independientes puede mejorar el rendimiento del canal de archivos

checkpointDir y backupCheckpointDir también deben configurarse en los directorios correspondientes a diferentes discos duros tanto como sea posible para garantizar que después de que se rompa el punto de control, puede usar rápidamente backupCheckpointDir para restaurar datos.

(2) Optimización del sumidero HDFS

①¿Cuál es el impacto de almacenar una gran cantidad de archivos pequeños en HDFS?

Nivel de metadatos: cada archivo pequeño tiene una parte de los metadatos, incluida la ruta del archivo, el nombre del archivo, el propietario, el grupo, el permiso, el tiempo de creación, etc., todos los cuales se almacenan en la memoria de Namenode. Por lo tanto, demasiados archivos pequeños ocuparán una gran cantidad de memoria en el servidor de Namenode, lo que afectará el rendimiento y la vida útil de Namenode.

Nivel de computación: De manera predeterminada, MR habilitará un cálculo de tarea de mapa para cada archivo pequeño, lo que afecta en gran medida el rendimiento de la computación. También afecta los tiempos de búsqueda del disco.

②Procesamiento de archivos pequeños HDFS

La configuración predeterminada oficial de estos tres parámetros generará archivos pequeños después de escribir en HDFS, hdfs.rollInterval, hdfs.rollSize, hdfs.rollCount.

Según los efectos completos de los parámetros anteriores hdfs.rollInterval=3600, hdfs.rollSize=134217728, hdfs.rollCount=0, el efecto es el siguiente:

  • Cuando el archivo alcance los 128M, comenzará a generar un nuevo archivo
  • Cuando el archivo se crea durante más de 3600 segundos, se generará un nuevo archivo de forma continua

2 ) Escriba un interceptor Flume

(1) Cree una clase TimeStampInterceptor en el paquete com.bigdata_admin.flume.interceptor

package com.bigdata_admin.flume.interceptor;



import com.alibaba.fastjson.JSONObject;

import org.apache.flume.Context;

import org.apache.flume.Event;

import org.apache.flume.interceptor.Interceptor;



import java.nio.charset.StandardCharsets;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;



public class TimeStampInterceptor implements Interceptor {



    private ArrayList<Event> events = new ArrayList<>();



    @Override

    public void initialize() {



    }



    @Override

    public Event intercept(Event event) {



        Map<String, String> headers = event.getHeaders();

        String log = new String(event.getBody(), StandardCharsets.UTF_8);



        JSONObject jsonObject = JSONObject.parseObject(log);



        String ts = jsonObject.getString("ts");

        headers.put("timestamp", ts);



        return event;

    }



    @Override

    public List<Event> intercept(List<Event> list) {

        events.clear();

        for (Event event : list) {

            events.add(intercept(event));

        }



        return events;

    }



    @Override

    public void close() {



    }



    public static class Builder implements Interceptor.Builder {

        @Override

        public Interceptor build() {

            return new TimeStampInterceptor();

        }



        @Override

        public void configure(Context context) {

        }

    }

}

(2) Reempaquetado

flume-interceptor-1.0-SNAPSHOT-jar-with-dependencies.jar

(3) Primero debe colocar el paquete en la carpeta /opt/module/flume/lib de hadoop104.

1.4.3 Prueba de canal de consumo de troncos

1) Inicie los clústeres de Zookeeper y Kafka

2) Iniciar la recopilación de registros Flume

[bigdata_admin@hadoop102 ~]$ f1.sh inicio

3) Inicie el registro de consumo Flume de hadoop 104

[bigdata_admin@hadoop104 flume]$ bin/flume-ng agent -n a1 -c conf/ -f job/kafka_to_hdfs_log.conf -Dflume.root.logger=info,console

4 ) Generar datos simulados

[bigdata_admin@hadoop102 ~]$ lg.sh

5 ) Observar si los datos aparecen en HDFS

1 .4 .4 Script de inicio y parada del canal para el consumo de troncos

Si pasa las pruebas anteriores, por conveniencia, cree un script de inicio y parada para Flume aquí.

1 ) Cree el script f2.sh en el directorio /home/bigdata_admin/bin del nodo hadoop102

[bigdata_admin@hadoop102 bin]$ vim f2.sh

Complete el siguiente contenido en el script:

#!/bin/bash



case $1 in

"start")

        echo " --------启动 hadoop104 日志数据flume-------"

        ssh hadoop104 "nohup /opt/module/flume/bin/flume-ng agent -n a1 -c /opt/module/flume/conf -f /opt/module/flume/job/kafka_to_hdfs_log.conf >/dev/null 2>&1 &"

;;

"stop")



        echo " --------停止 hadoop104 日志数据flume-------"

        ssh hadoop104 "ps -ef | grep kafka_to_hdfs_log | grep -v grep |awk '{print \$2}' | xargs -n1 kill"

;;

esac

2 ) Aumentar el permiso de ejecución del script

[bigdata_admin@hadoop102 bin]$ chmod 777 f2.sh

3 ) inicio f2

[bigdata_admin@hadoop102 module]$ f2.sh inicio

4 ) parada f2

[módulo bigdata_admin@hadoop102]$ f2.sh parada

1.5 Script de inicio/ detención del canal de adquisición

1 ) Cree el script cluster.sh en el directorio /home/bigdata_admin/bin

[bigdata_admin@hadoop102 bin]$ vim clúster.sh

Complete el siguiente contenido en el script:

#!/bin/bash



case $1 in

"start"){

        echo ================== 启动 集群 ==================



        #启动 Zookeeper集群

        zk.sh start



        #启动 Hadoop集群

        cdh.sh start



        #启动 Kafka采集集群

        kf.sh start



        #启动 Flume采集集群

        f1.sh start



        #启动 Flume消费集群

        f2.sh start



        };;

"stop"){

        echo ================== 停止 集群 ==================



        #停止 Flume消费集群

        f2.sh stop



        #停止 Flume采集集群

        f1.sh stop



        #停止 Kafka采集集群

        kf.sh stop



        #停止 Hadoop集群

        cdh.sh stop



#循环直至 Kafka 集群进程全部停止

#xcall.sh 是我们写的脚本,作用是在集群的每个节点都执行一次后面的命令。此处 xcall.sh jps 的作用是查看所有节点的 java 进程

#grep Kafka 的作用是过滤所有 Kafka 进程

#wc -l 是统计行数,每个进程会在 jps 中单独占据一行,因此行数等于进程数

#$()的作用是将括号内命令的执行结果作为值取出来

#因此如下命令的作用是统计集群未停止的 Kafka 进程数然后将进程数赋值给 kafka_count 变量



kafka_count=$(xcall.sh jps | grep Kafka | wc -l)



#判断 kafka_count 变量的值是否大于零,如果是则说明仍有未停止的 Kafka 进程,此时不能停止 Zookeeper,因为 Kafka 的工作要依赖于 Zookeeper 的节点,如果在 Kafka 进程停止之前停止了 Zookeeper,可能会导致本次 Kafka 进程无法正常停止。所以当 Kafka 进程数大于零时进入循环,休眠一秒,然后重新统计 Kafka 进程数,直至 Kafka 进程数为零跳出循环,才能进行下一步(停止 Zookeeper 集群)

while [ $kafka_count -gt 0 ]

do

sleep 1

kafka_count=$( xcall.sh jps | grep Kafka | wc -l)

            echo "当前未停止的 Kafka 进程数为 $kafka_count"

done



        #停止 Zookeeper集群

        zk.sh stop

};;

esac

2 ) Aumentar el permiso de ejecución del script

[bigdata_admin@hadoop102 bin]$ chmod u+x clúster.sh

3 ) secuencia de comandos de inicio de clúster de clúster

[módulo bigdata_admin@hadoop102]$ cluster.sh inicio

4 ) secuencia de comandos de parada de clúster

[módulo bigdata_admin@hadoop102]$ cluster.sh parada

Supongo que te gusta

Origin blog.csdn.net/liuwei0376/article/details/125741754
Recomendado
Clasificación