Introducció a YARN

YARN (Yet Another Resource Negotiator) és un component fonamental de l'ecosistema Hadoop que gestiona els recursos del clúster i programa les aplicacions. Va ser introduït a Hadoop 2.0 per superar les limitacions del model original de MapReduce, permetent una major escalabilitat i flexibilitat.

Objectius de YARN

  • Gestió de recursos: Assignar recursos de manera eficient entre les aplicacions que s'executen en el clúster.
  • Planificació de tasques: Programar les tasques de les aplicacions per assegurar-se que s'executen de manera òptima.
  • Suport a múltiples models de programació: Permetre l'execució de diferents tipus d'aplicacions més enllà de MapReduce, com ara Apache Spark, Apache Flink, etc.

Components de YARN

YARN consta de diversos components clau que treballen junts per gestionar els recursos i les aplicacions en el clúster:

  1. ResourceManager (RM):

    • És el component central de YARN que gestiona els recursos del clúster.
    • Consta de dos subcomponents principals:
      • Scheduler: Assigna recursos a les aplicacions basant-se en polítiques de planificació.
      • ApplicationManager: Gestiona la submissió d'aplicacions i la negociació de recursos per a les aplicacions.
  2. NodeManager (NM):

    • S'executa en cada node del clúster i és responsable de gestionar els recursos locals i supervisar l'execució de les tasques.
    • Comunica l'estat dels recursos al ResourceManager.
  3. ApplicationMaster (AM):

    • És específic per a cada aplicació i s'encarrega de gestionar l'execució de l'aplicació.
    • Sol·licita recursos al ResourceManager i treballa amb els NodeManagers per executar i supervisar les tasques.
  4. Containers:

    • Són les unitats de recursos (CPU, memòria, etc.) assignades a les aplicacions per executar les seves tasques.
    • Cada container és gestionat pel NodeManager del node on s'executa.

Flux de treball de YARN

El flux de treball de YARN es pot desglossar en els següents passos:

  1. Submissió de l'aplicació:

    • L'usuari envia una aplicació al ResourceManager.
    • El ResourceManager crea un ApplicationMaster per a l'aplicació.
  2. Negociació de recursos:

    • L'ApplicationMaster sol·licita recursos al ResourceManager.
    • El ResourceManager assigna containers basant-se en la disponibilitat de recursos i les polítiques de planificació.
  3. Execució de tasques:

    • L'ApplicationMaster treballa amb els NodeManagers per iniciar les tasques en els containers assignats.
    • Els NodeManagers supervisen l'execució de les tasques i informen l'ApplicationMaster sobre l'estat de les tasques.
  4. Finalització de l'aplicació:

    • Quan totes les tasques de l'aplicació han finalitzat, l'ApplicationMaster informa el ResourceManager.
    • Els recursos assignats són alliberats i l'ApplicationMaster es tanca.

Exemple pràctic

A continuació, es mostra un exemple pràctic de com es pot executar una aplicació MapReduce en un clúster YARN.

Pas 1: Submissió de l'aplicació

hadoop jar my-mapreduce-job.jar com.example.MyMapReduceJob /input /output

Pas 2: Negociació de recursos

L'ApplicationMaster sol·licita recursos al ResourceManager:

Resource capability = Resource.newInstance(1024, 1); // 1024 MB de memòria i 1 vCore
AMRMClient.ContainerRequest containerRequest = new AMRMClient.ContainerRequest(capability, null, null, Priority.newInstance(0));
amRMClient.addContainerRequest(containerRequest);

Pas 3: Execució de tasques

L'ApplicationMaster treballa amb els NodeManagers per iniciar les tasques:

for (Container container : allocatedContainers) {
    LaunchContainerRunnable runnableLaunchContainer = new LaunchContainerRunnable(container, containerListener);
    Thread launchThread = new Thread(runnableLaunchContainer);
    launchThreads.add(launchThread);
    launchThread.start();
}

Pas 4: Finalització de l'aplicació

Quan totes les tasques han finalitzat, l'ApplicationMaster informa el ResourceManager:

amRMClient.unregisterApplicationMaster(FinalApplicationStatus.SUCCEEDED, "", "");

Exercici pràctic

Exercici 1: Configuració de YARN

  1. Configura el ResourceManager i el NodeManager:
    • Edita el fitxer yarn-site.xml per configurar el ResourceManager i el NodeManager.
    • Exemple de configuració:
<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>resourcemanager-hostname</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>8192</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>4</value>
    </property>
</configuration>
  1. Inicia el ResourceManager i el NodeManager:
start-yarn.sh

Exercici 2: Executar una aplicació MapReduce en YARN

  1. Crea un programa MapReduce senzill:
public class WordCount extends Configured implements Tool {
    public static void main(String[] args) throws Exception {
        int res = ToolRunner.run(new Configuration(), new WordCount(), args);
        System.exit(res);
    }

    public int run(String[] args) throws Exception {
        Job job = Job.getInstance(getConf(), "wordcount");
        job.setJarByClass(this.getClass());

        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        job.setMapperClass(Map.class);
        job.setReducerClass(Reduce.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        return job.waitForCompletion(true) ? 0 : 1;
    }

    public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);
            }
        }
    }

    public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            context.write(key, new IntWritable(sum));
        }
    }
}
  1. Compila i executa el programa:
hadoop jar wordcount.jar WordCount /input /output

Conclusió

YARN és un component essencial de l'ecosistema Hadoop que permet una gestió eficient dels recursos i la planificació de tasques en un clúster. Amb YARN, Hadoop pot suportar múltiples models de programació i escalar de manera eficient per gestionar grans volums de dades. En aquest mòdul, hem explorat els components clau de YARN, el seu flux de treball i hem proporcionat exemples pràctics per ajudar-te a comprendre com funciona YARN en la pràctica.

© Copyright 2024. Tots els drets reservats