Exemplu Hadoop MapReduce: Primul Java Program cu Code

โšก Rezumat inteligent

Programele Hadoop MapReduce sunt scrise รฎn trei Java clase, un mapper, un reducer ศ™i un driver, care sunt compilate, รฎmpachetate รฎntr-un fiศ™ier jar ศ™i trimise clusterului pentru a numฤƒra vรขnzฤƒrile pe ศ›arฤƒ.

  • ๐Ÿ”˜ Set de date: Fiศ™ierul SalesJan2009.csv conศ›ine o tranzacศ›ie pe linie, ศ›ara fiind indicatฤƒ รฎn a opta coloanฤƒ separatฤƒ prin virgulฤƒ.
  • โ˜‘๏ธ Cartograf: SalesMapper รฎmparte fiecare linie ศ™i emite ศ›ara asociatฤƒ cu valoarea constantฤƒ.
  • โœ… reductorului: SalesCountryReducer รฎnsumeazฤƒ frecvenศ›ele sosite pentru fiecare ศ›arฤƒ รฎntr-un singur numฤƒr de frecvenศ›ฤƒ.
  • ๐Ÿงช Conducฤƒtor auto: Funcศ›ia SalesCountryDriver denumeศ™te jobul, declarฤƒ tipurile de cheie ศ™i valoare ศ™i conecteazฤƒ ambele clase.
  • ๐Ÿ› ๏ธ Construi: Compileazฤƒ cu javac, adaugฤƒ o intrare รฎn manifestul Main-Class, apoi รฎmpacheteazฤƒ totul cu jar cfm.
  • โš ๏ธ Rulaศ›i: Copiaศ›i fiศ™ierul CSV รฎn HDFS, trimiteศ›i fiศ™ierul jar ศ™i citiศ›i codul part-00000 din directorul de ieศ™ire.

Exemplu Hadoop MapReduce care creeazฤƒ o primฤƒ Java program

รŽn acest tutorial, veศ›i รฎnvฤƒศ›a sฤƒ utilizaศ›i Hadoop cu exemple MapReduce. Datele de intrare utilizate sunt VรขnzฤƒriJan2009.csvConศ›ine informaศ›ii legate de vรขnzฤƒri, cum ar fi numele produsului, preศ›ul, metoda de platฤƒ, oraศ™ul ศ™i ศ›ara clientului. Scopul este de a afla numฤƒrul de produse vรขndute รฎn fiecare ศ›arฤƒ.

Primul program Hadoop MapReduce

Acum รฎn asta Tutorial MapReduce, vom crea primul nostru Java Programul MapReduce:

Captura de ecran de mai jos prezintฤƒ datele brute SalesJan2009, unde fiecare linie reprezintฤƒ o tranzacศ›ie, iar ศ›ara se aflฤƒ รฎn a opta coloanฤƒ separatฤƒ prin virgulฤƒ.

Datele de vรขnzฤƒri SalesJan2009 s-au deschis รฎntr-o foaie de calcul care afiศ™eazฤƒ coloanele de tranzacศ›ii

Asiguraศ›i-vฤƒ cฤƒ aveศ›i Hadoop instalat. รŽnainte de a รฎncepe procesul propriu-zis, schimbaศ›i numele utilizatorului รฎn โ€žhduserโ€ (ID-ul folosit la configurarea Hadoop - puteศ›i comuta la ID-ul de utilizator folosit รฎn timpul propriei configurฤƒri Hadoop).

su - hduser_

Solicitarea se schimbฤƒ รฎn contul hduser, aศ™a cum se aratฤƒ mai jos.

Solicitare terminal dupฤƒ trecerea la contul hduser

Pasul 1) Creaศ›i directorul proiectului ศ™i fiศ™ierele sursฤƒ

Creaศ›i un director nou cu numele MapReduceTutorial, aศ™a cum se aratฤƒ รฎn exemplul MapReduce de mai jos.

sudo mkdir MapReduceTutorial

Comanda mkdir creeazฤƒ directorul MapReduceTutorial

Acordaศ›i permisiuni

sudo chmod -R 777 MapReduceTutorial

Comanda chmod care acordฤƒ permisiuni complete asupra MapReduceTutorial

Creaศ›i cele trei Java fiศ™ierele sursฤƒ de mai jos, รฎn MapReduceTutorial. Reศ›ineศ›i cฤƒ toate trei folosesc versiunea mai veche org.apache.hadoop.mapred API, care este รฎncฤƒ inclus รฎn Hadoop 3.x.

SalesMapper.java

package SalesCountry;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.*;

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

	public void map(LongWritable key, Text value, OutputCollector <Text, IntWritable> output, Reporter reporter) throws IOException {

		String valueString = value.toString();
		String[] SingleCountryData = valueString.split(",");
		output.collect(new Text(SingleCountryData[7]), one);
	}
}

SalesCountryReducer.java

package SalesCountry;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.*;

public class SalesCountryReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {

	public void reduce(Text t_key, Iterator<IntWritable> values, OutputCollector<Text,IntWritable> output, Reporter reporter) throws IOException {
		Text key = t_key;
		int frequencyForCountry = 0;
		while (values.hasNext()) {
			// replace type of value with the actual type of our value
			IntWritable value = (IntWritable) values.next();
			frequencyForCountry += value.get();
			
		}
		output.collect(key, new IntWritable(frequencyForCountry));
	}
}

SalesCountryDriver.java

package SalesCountry;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;

public class SalesCountryDriver {
    public static void main(String[] args) {
        JobClient my_client = new JobClient();
        // Create a configuration object for the job
        JobConf job_conf = new JobConf(SalesCountryDriver.class);

        // Set a name of the Job
        job_conf.setJobName("SalePerCountry");

        // Specify data type of output key and value
        job_conf.setOutputKeyClass(Text.class);
        job_conf.setOutputValueClass(IntWritable.class);

        // Specify names of Mapper and Reducer Class
        job_conf.setMapperClass(SalesCountry.SalesMapper.class);
        job_conf.setReducerClass(SalesCountry.SalesCountryReducer.class);

        // Specify formats of the data type of Input and output
        job_conf.setInputFormat(TextInputFormat.class);
        job_conf.setOutputFormat(TextOutputFormat.class);

        // Set input and output directories using command line arguments, 
        //arg[0] = name of input directory on HDFS, and arg[1] =  name of output directory to be created to store the output file.

        FileInputFormat.setInputPaths(job_conf, new Path(args[0]));
        FileOutputFormat.setOutputPath(job_conf, new Path(args[1]));

        my_client.setConf(job_conf);
        try {
            // Run the job 
            JobClient.runJob(job_conf);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Descฤƒrcaศ›i fiศ™iere aici

Arhiva se extinde รฎn aceleaศ™i trei fiศ™iere sursฤƒ, aศ™a cum se aratฤƒ aici.

Extracarhiva ted care listeazฤƒ SalesMapper, SalesCountryReducer ศ™i SalesCountryDriver

Verificaศ›i permisiunile pentru toate aceste fiศ™iere

Listฤƒ lungฤƒ care aratฤƒ permisiunile fiศ™ierelor pe cele trei Java fiศ™iere sursฤƒ

Dacฤƒ lipsesc permisiunile de โ€žcitireโ€, atunci acordaศ›i-le:

comanda chmod care adaugฤƒ permisiunea de citire la Java fiศ™iere sursฤƒ

Pasul 2) Exportaศ›i calea de clasฤƒ Hadoop

Exportaศ›i calea de clasฤƒ aศ™a cum se aratฤƒ รฎn exemplul Hadoop de mai jos.

export CLASSPATH="$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.2.0.jar:$HADOOP_HOME/share/hadoop/common/hadoop-common-2.2.0.jar:~/MapReduceTutorial/SalesCountry/*:$HADOOP_HOME/lib/*"

Calea de clasฤƒ exportatฤƒ este readusฤƒ la prompt.

Prompt shell dupฤƒ exportarea variabilei Hadoop CLASSPATH

Pasul 3) Compilaศ›i Java fiศ™iere

Compilaศ›i Java fiศ™iere (aceste fiศ™iere sunt prezente รฎn directorul Final-MapReduceHandsOn). Fiศ™ierele lor de clasฤƒ vor fi plasate รฎn directorul pachetului.

javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java

ieศ™irea javac afiศ™eazฤƒ un avertisment de depreciere รฎn timpul compilฤƒrii

Acest avertisment poate fi ignorat รฎn siguranศ›ฤƒ โ€” raporteazฤƒ doar cฤƒ API-ul mapred este depreciat.

Aceastฤƒ compilare va crea un director รฎn directorul curent numit cu numele pachetului specificat รฎn Java fiศ™ierul sursฤƒ (de exemplu, SalesCountry รฎn cazul nostru) ศ™i puneศ›i toate fiศ™ierele de clasฤƒ compilate รฎn el.

Directorul pachetului SalesCountry care conศ›ine cele trei fiศ™iere de clasฤƒ compilate

Pasul 4) Creaศ›i fiศ™ierul manifest

Creaศ›i un fiศ™ier nou Manifest.txt

sudo gedit Manifest.txt

Adฤƒugaศ›i urmฤƒtoarea linie la aceasta:

Main-Class: SalesCountry.SalesCountryDriver

gedit fereastrฤƒ care afiศ™eazฤƒ intrarea Main-Class รฎn Manifest.txt

SalesCountry.SalesCountryDriver este numele clasei principale. Reศ›ineศ›i cฤƒ trebuie sฤƒ apฤƒsaศ›i tasta Enter la sfรขrศ™itul acestei linii.

Pasul 5) รŽmpachetaศ›i clasele รฎntr-un borcan

Creaศ›i un fiศ™ier Jar

jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class

comanda jar construieศ™te ProductSalePerCountry.jar din manifest

Verificaศ›i dacฤƒ fiศ™ierul jar este creat

Listฤƒ รฎn director care confirmฤƒ crearea fiศ™ierului ProductSalePerCountry.jar

Pasul 6) Porniศ›i Hadoop

Porniศ›i Hadoop

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

Pasul 7) Copiaศ›i fiศ™ierul de intrare รฎn HDFS

Copiaศ›i fiศ™ierul SalesJan2009.csv รฎn ~/inputMapReduce

Acum folosiศ›i comanda de mai jos pentru a copia ~/inputMapReduce รฎn HDFS.

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /

Ieศ™irea comenzii copyFromLocal cu un avertisment pentru biblioteca nativฤƒ

Putem ignora รฎn siguranศ›ฤƒ acest avertisment.

Verificaศ›i dacฤƒ un fiศ™ier este copiat sau nu.

$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce

hdfs dfs -ls listeazฤƒ SalesJan2009.csv รฎn directorul inputMapReduce

Pasul 8) Executaศ›i jobul MapReduce

Rulaศ›i jobul MapReduce

$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales

Ieศ™irea consolei รฎn timp ce jobul SalePerCountry ruleazฤƒ pe cluster

Aceasta va crea un director de ieศ™ire numit mapreduce_output_sales on HDFS. Conศ›inutul acestui director va fi un fiศ™ier care conศ›ine vรขnzฤƒrile de produse pe ศ›arฤƒ.

Pasul 9) Citiศ›i rezultatele

Rezultatul poate fi vฤƒzut prin interfaศ›a de comandฤƒ ca fiind,

$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000

Perechile โ€žศ›arฤƒโ€ ศ™i โ€žnumฤƒr de vรขnzฤƒriโ€ afiศ™ate de comanda hdfs dfs -cat

Rezultatele pot fi vฤƒzute ศ™i printr-o interfaศ›ฤƒ web ca-

Operatii Deschise http://localhost:50070/ รฎntr-un browser web. Pe Hadoop 3.x, interfaศ›a web NameNode a fost mutatฤƒ รฎn port 9870, deci foloseศ™te http://localhost:9870/ acolo รฎn schimb.

Pagina principalฤƒ a interfeศ›ei web NameNode รฎntr-un browser

Acum selectaศ›i โ€žRฤƒsfoiศ›i sistemul de fiศ™iereโ€ ศ™i navigaศ›i la /mapreduce_output_sales

Browser de fiศ™iere HDFS care afiศ™eazฤƒ directorul mapreduce_output_sales

Deschideศ›i piesa-r-00000

Fiศ™ierul rezultat part-r-00000 a fost deschis รฎn browserul HDFS

Explicaศ›ia clasei SalesMapper

Avรขnd รฎn vedere cฤƒ jobul se desfฤƒศ™oarฤƒ de la un capฤƒt la altul, urmฤƒtoarele trei secศ›iuni prezintฤƒ ce face de fapt fiecare clasฤƒ.

รŽn aceastฤƒ secศ›iune, vom รฎnศ›elege implementarea clasei SalesMapper.

1. รŽncepem prin a specifica un nume de pachet pentru clasa noastrฤƒ. SalesCountry este numele pachetului nostru. Reศ›ineศ›i cฤƒ rezultatul compilฤƒrii, SalesMapper.class, va intra รฎntr-un director numit cu acest nume de pachet: SalesCountry.

Dupฤƒ aceasta, importฤƒm pachete de bibliotecฤƒ.

Mai jos este prezentatฤƒ o implementare a clasei SalesMapper -

Vizualizare editor a implementฤƒrii complete a clasei SalesMapper

EลŸantion Code Explicaลฃie:

1. Definiศ›ia clasei SalesMapper-

public class SalesMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {

Fiecare clasฤƒ mapper trebuie sฤƒ fie extinsฤƒ din clasa MapReduceBase ศ™i trebuie sฤƒ implementeze interfaศ›a Mapper.

2. Definirea funcศ›iei โ€žhartฤƒโ€-

public void map(LongWritable key,
         Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException

Partea principalฤƒ a clasei Mapper este metoda โ€žmap()โ€ care acceptฤƒ patru argumente.

La fiecare apel al metodei โ€žmap()โ€, se transmite o pereche cheie-valoare (โ€žkeyโ€ ศ™i โ€žvalueโ€ รฎn acest cod).

Metoda 'map()' รฎncepe prin divizarea textului de intrare primit ca argument. Aceasta รฎmparte fiecare linie รฎn cรขmpuri.

String valueString = value.toString();
String[] SingleCountryData = valueString.split(",");

Aici, se foloseศ™te โ€ž,โ€ ca delimitator.

Dupฤƒ aceasta, se formeazฤƒ o pereche folosind o รฎnregistrare la al 7-lea index al matricei โ€žSingleCountryDataโ€ ศ™i o valoare โ€ž1โ€.

output.collect(new Text(SingleCountryData[7]), one);

Alegem รฎnregistrarea la al 7-lea index deoarece avem nevoie de date despre ศ›arฤƒ, iar acestea se aflฤƒ la al 7-lea index din matricea โ€žSingleCountryDataโ€.

Vฤƒ rugฤƒm sฤƒ reศ›ineศ›i cฤƒ datele noastre de intrare sunt รฎn formatul urmฤƒtor (unde ศšara se aflฤƒ la al 7-lea indice, cu 0 ca indice de pornire) -

Transaction_date,Product,Price,Payment_Type,Name,City,State,Country,Account_Created,Last_Login,Latitude,Longitude

O ieศ™ire a funcศ›iei mapper este din nou o pereche cheie-valoare emisฤƒ folosind metoda โ€žcollect()โ€ a funcศ›iei โ€žOutputCollectorโ€.

Explicaศ›ia clasei SalesCountryReducer

รŽn aceastฤƒ secศ›iune, vom รฎnศ›elege implementarea clasei SalesCountryReducer.

1. รŽncepem prin a specifica numele pachetului pentru clasa noastrฤƒ. SalesCountry este numele pachetului nostru. Reศ›ineศ›i cฤƒ rezultatul compilฤƒrii, SalesCountryReducer.class, va intra รฎntr-un director numit cu acest nume de pachet: SalesCountry.

Dupฤƒ aceasta, importฤƒm pachete de bibliotecฤƒ.

Instantaneul de mai jos prezintฤƒ o implementare a clasei SalesCountryReducer-

Vizualizare editor a implementฤƒrii complete a clasei SalesCountryReducer

Code Explicaลฃie:

1. Definiศ›ia clasei SalesCountryReducer-

public class SalesCountryReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {

Aici, primele douฤƒ tipuri de date, โ€žTextโ€ ศ™i โ€žIntWritableโ€, reprezintฤƒ tipul de date al cheii-valoare de intrare a reductorului.

Rezultatul mapperului este sub forma , Aceastฤƒ ieศ™ire a mapper-ului devine intrare pentru reducer. Aศ™adar, pentru a se alinia cu tipul sฤƒu de date, se folosesc aici tipuri de date Text ศ™i IntWritable.

Ultimele douฤƒ tipuri de date, โ€žTextโ€ ศ™i โ€žIntWritableโ€, sunt tipurile de date de ieศ™ire generate de reductor sub forma unei perechi cheie-valoare.

Fiecare clasฤƒ Reducer trebuie sฤƒ fie extinsฤƒ din clasa MapReduceBase ศ™i trebuie sฤƒ implementeze interfaศ›a Reducer.

2. Definirea funcศ›iei โ€žreduceโ€-

public void reduce( Text t_key,
             Iterator<IntWritable> values,                           
             OutputCollector<Text,IntWritable> output,
             Reporter reporter) throws IOException {

O intrare pentru metoda reduce() este o cheie cu o listฤƒ de valori multiple.

De exemplu, รฎn cazul nostru, va fi...

, , , , , .

Acest lucru este dat reductorului ca

Deci, pentru a accepta argumente de aceastฤƒ formฤƒ, se utilizeazฤƒ primele douฤƒ tipuri de date, ศ™i anume Text ศ™i Iterator. Textul este un tip de date cheie ศ™i iterator. este un tip de date pentru o listฤƒ de valori pentru cheia respectivฤƒ.

Urmฤƒtorul argument este de tip OutputCollector care colecteazฤƒ ieศ™irea fazei reducฤƒtoare.

Metoda reduce() รฎncepe prin copierea valorii cheii ศ™i iniศ›ializarea numฤƒrului de frecvenศ›ฤƒ la 0.

Text key = t_key;
int frequencyForCountry = 0;

Apoi, folosind bucla โ€žwhileโ€, iterฤƒm prin lista de valori asociate cheii ศ™i calculฤƒm frecvenศ›a finalฤƒ prin รฎnsumarea tuturor valorilor.

 while (values.hasNext()) {
            // replace type of value with the actual type of our value
            IntWritable value = (IntWritable) values.next();
            frequencyForCountry += value.get();
            
        }

Acum, trimitem rezultatul cฤƒtre colectorul de ieศ™ire sub forma unei chei ศ™i a numฤƒrului de frecvenศ›ฤƒ obศ›inut.

Codul de mai jos face asta -

output.collect(key, new IntWritable(frequencyForCountry));

Explicaศ›ia clasei SalesCountryDriver

รŽn aceastฤƒ secศ›iune, vom รฎnศ›elege implementarea clasei SalesCountryDriver.

1. รŽncepem prin a specifica un nume de pachet pentru clasa noastrฤƒ. SalesCountry este numele pachetului nostru. Reศ›ineศ›i cฤƒ rezultatul compilฤƒrii, SalesCountryDriver.class, va intra รฎntr-un director numit cu acest nume de pachet: SalesCountry.

Aici este o linie care specificฤƒ numele pachetului urmat de cod pentru a importa pachete de bibliotecฤƒ.

Declaraศ›ii de pachete ศ™i declaraศ›ii de import ale SalesCountryDriver

2. Definiศ›i o clasฤƒ de driver care va crea un nou loc de muncฤƒ client, un obiect de configurare ศ™i va face publicitate claselor Mapper ศ™i Reducer.

Clasa de ศ™oferi este responsabilฤƒ pentru setarea jobului nostru MapReduce pentru a rula HadoopรŽn aceastฤƒ clasฤƒ, specificฤƒm numele jobului, tipul de date de intrare/ieศ™ire ศ™i numele claselor mapper ศ™i reducer.

Codul driverului care seteazฤƒ numele jobului, clasele cheie ศ™i valori ศ™i formatele

3. รŽn fragmentul de cod de mai jos, setฤƒm directoarele de intrare ศ™i de ieศ™ire care sunt folosite pentru a consuma setul de date de intrare ศ™i, respectiv, a produce ieศ™iri.

arg[0] ศ™i arg[1] sunt argumentele din linia de comandฤƒ transmise odatฤƒ cu o comandฤƒ datฤƒ รฎn MapReduce hands-on, adicฤƒ,

$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales

Codul driverului care transmite cฤƒile de intrare ศ™i ieศ™ire din linia de comandฤƒ

4. Declanศ™eazฤƒ-ne jobul

Codul de mai jos porneศ™te execuศ›ia jobului MapReduce-

try {
    // Run the job 
    JobClient.runJob(job_conf);
} catch (Exception e) {
    e.printStackTrace();
}

รŽntrebฤƒri frecvente

Toate cele trei clase importฤƒ org.apache.hadoop.mapred, API-ul original MapReduce. Hadoop 3.x รฎncฤƒ รฎl livreazฤƒ ศ™i รฎl ruleazฤƒ, dar noile lucrฤƒri sunt scrise รฎn mod normal pentru org.apache.hadoop.mapreduce, care รฎnlocuieศ™te JobConf ศ™i JobClient cu Configuration ศ™i Job.

Modelele antrenate pe baza istoricului anterior al joburilor prezic timpul de execuศ›ie, sugereazฤƒ dimensiuni de divizare ศ™i numฤƒr de reductoare ศ™i detecteazฤƒ asimetriile รฎnainte de finalizarea unei execuศ›ii. De asemenea, acestea semnaleazฤƒ joburile ale cฤƒror contoare de รฎnregistrฤƒri scurse sau sarcini eศ™uate depฤƒศ™esc intervalul obiศ™nuit.

Copilot finalizeazฤƒ bine pฤƒrศ›ile repetitive: semnฤƒturile de clasฤƒ, genericele, importurile ศ™i apelurile de configurare a driverelor. Logica de business, cum ar fi coloana care conศ›ine ศ›ara, trebuie totuศ™i verificatฤƒ de cฤƒtre un dezvoltator รฎn raport cu schema realฤƒ.

Hadoop refuzฤƒ sฤƒ scrie รฎntr-un director de ieศ™ire existent, astfel รฎncรขt rezultatele finale sฤƒ nu fie niciodatฤƒ suprascrise. ศ˜tergeศ›i recursiv mapreduce_output_sales cu hdfs dfs -rm -r sau transmiteศ›i o cale de ieศ™ire diferitฤƒ la urmฤƒtoarea rulare.

Instrumentul jar ignorฤƒ o linie finalฤƒ de manifest care nu are un terminator de linie, aศ™adar Main-Class este eliminatฤƒ silenศ›ios. Jarul se construieศ™te apoi fฤƒrฤƒ erori, dar eศ™ueazฤƒ la momentul execuศ›iei deoarece nu este รฎnregistratฤƒ nicio clasฤƒ principalฤƒ.

Da. Exemplul introduce 2.2.0 รฎn fiecare nume de fiศ™ier jar. รŽntr-o altฤƒ versiune, รฎnlocuiศ›i acea versiune sau pur ศ™i simplu utilizaศ›i ieศ™irea din hadoop classpath, care afiศ™eazฤƒ fiecare fiศ™ier jar de care are nevoie distribuศ›ia instalatฤƒ.

Nu. O instalare pseudo-distribuitฤƒ cu un singur nod o ruleazฤƒ neschimbatฤƒ, deoarece comenzile presupun doar cฤƒ HDFS ศ™i YARN sunt pornite. Acelaศ™i fiศ™ier jar se trimite cฤƒtre un cluster real cu mai multe noduri fฤƒrฤƒ nicio modificare de cod.

Schimbaศ›i indexul matricei รฎn mapper de la 7 la 5, deoarece City este a ศ™asea coloanฤƒ a fiศ™ierului SalesJan2009.csv. Recompilaศ›i, reconstruiศ›i fiศ™ierul jar ศ™i rulaศ›i jobul รฎntr-un director de ieศ™ire nou.

Rezumaศ›i aceastฤƒ postare cu: