How to use the HadoopStreaming class to work in Hadoop using perl (or any language, actually)
Presentation made for the French Perl Workshop 2012 in Strastbourg.
2. le plus simple :
apprendre java
un language simple
facile à apprendre
relativement
répandu
commence à être
assez stable
3. et si je ne veux pas
apprendre ?
hadoop fournit une classe
HadoopStreaming pour lancer des jobs
hors de java
utilise STDIN et STDOUT pour
communiquer avec vos processus
prend 2 arguments principaux : un
programme de map, et un autre de reduce
5. etape 1 : importation des
données avec sqoop
Les données vont être écrite sous forme
tabulaire dans HDFS,
dans /user/hive/warehouse/
db_table_whatever/part-000[0-9]{2}
Utilisable avec HiveQL directment
mais sinon :
hadoop fs -put ./fichier.tsv /user/dmorel/
6. etape 2 : écriture des
scripts map + reduce
while ( <STDIN> ) {
chomp;
my @fields = split /t/;
# make the key
print join( '+', @fields[ ( 16, 25 ) ] );
# separate key and value
print "+t";
# make the value
print join(",",
@fields[ ( 28, 30, ... ) ] ) . "n";
}
7. le mapper peut être plus
«complexe» !
while ( <STDIN> ) {
chomp;
my @fields = split /t/;
# make the key
my $key = join( '+',
@fields[ ( 16, 25 ) ] , q{} );
# make the valueS
my @base_values = @fields[ ( 28 .. 150 ) ] );
my @final_vals = mybigcombinesub(@base_values);
for ( @final_values ) {
print $key, join(«t», @$_), «n»;
}
}
8. exemple d’utilisation
(ouf, pas de code...)
trouver les combinaisons de 3, 4, 5 objets ou +
les plus fréquemment achetées par les clients
d’un site e-commerce
impossible en SQL, trop de combinaisons,
jointures trop lourdes
facile avec Hadoop : juste produire toutes les
combinaisons pour chaque client
séquentiellement, réduire ensuite, et compter
9. reducer : analyser ligne à
ligne, vérifier le key switch
my ($k_prev, $processed_lines_in_key,
@output_lines, $value_to_print);
while (<STDIN>) {
chomp;
my ($key, $value) = split /t/;
if ( $k_main ne $k_prev ) {
$processed_lines_in_key = 0;
_flush_to_stdout(@output_lines);
$value_to_print = ''; $k_prev = $k_main;
}
$value_to_print .= $value;
push @output_lines, [ $k_main, $value_to_print ]
if (int (rand()*3) == 2);
}
10. etape 3 : test
/usr/bin/hadoop fs -cat
/user/david/myfile.tsv
| head -10000
| ./mapper.pl
| sort
| ./reducer.pl