Développer sur Hadoop avec Scalding (part1)

Scalding est une librairie Scala dévellopée par Twitter pour faciliter l’écriture de job MapReduce pour Hadoop. Elle est basée sur la librairie java Cascading.

Ce post est le premier d’une serie de 2 posts. Il montre comment utiliser Scalding avec le script ruby scald.rb sous Ubuntu.

Installation

  • installer java 7 sudo apt-get install openjdk-7-jdk
  • cloner le projet Scalding git clone https://github.com/twitter/scalding.git
  • installer scala
    • trouver le numero de version scala utilisé par scalding dans le fichier scalding/project/Build.scala à la variable scalaVersion
    • telecharger le tar.gz scala, le dézipper, ajouter $SCALA_HOME à environnement et $SCALA_HOME/bin au PATH (.bashrc pour un user, /etc/profile.d/mon_script.sh pour tous les users))
  • installer ruby, qui est nécéssaire pour faire tourner scald.rb sudo apt-get install ruby-full
  • mettre à jour l’environnement
    • ajouter export SCALDING_HOME=/home/hadoop/scalding dans l’environnement
    • ajouter $SCALDING_HOME/scripts au PATH

Build du jar scalding

  • cd scalding
  • dé-commenter la ligne test in assembly := {} dans project/Build.scala. Cela désactivera l’execution des tests pendant le build, qui prennent beaucoup de temps.
  • ./sbt update
  • ./sbt assemby
  • le jar apparait dans target/scala-2.10/scalding-assembly-0.13.1.jar

Un wordcount en local pour tester !

  • créer le fichier WordCountJob.scala avec le code suivant:

  • créer le fichier d’input:
echo "this day is a great day" > input.txt
  • executer le job sur le fs local :
scald.rb --local WordCountJob.scala --input input.txt --output output.tsv
  • executer le job avec des fichiers stockés sur HDFS :
scald.rb --hdfs-local WordCountJob.scala --input input.txt --output output-hdfslocal.tsv

Remarque: Le resultat sera stocké sur le file system local.

Lancer un WordCount sur le cluster, avec des fichiers stockés sur HDFS

  • s’assurer de pouvoir se connecter en password-less ssh sur le master
  • dans scald.rb, modifier "host" => "my.host.here" pour y mettre le master
  • dans scald.rb, modifier:

  • mettre l’input sous hdfs: hadoop fs -put input.txt input.txt
  • et enfin lancer le job: scald.rb --hdfs WordCountJob.scala --input input.txt --output output.tsv

Voir la ligne de commande réellement executée

scald.rb --print WordCountJob.scala --input input.txt --output output.tsv

affiche:

HADOOP_CLASSPATH=/usr/share/java/hadoop-lzo-0.4.15.jar:scalding-core-assembly-0.13.1.jar:job-jars/WordCountJob.jar /home/hadoop/hadoop-install/bin/hadoop jar scalding-core-assembly-0.13.1.jar -libjars job-jars/WordCountJob.jar -Dmapred.reduce.tasks=20 -Dmapred.min.split.size=2000000000 WordCountJob --hdfs --input input.txt --output output.tsv

REPL

Scalding propose un REPL executable depuis scald.rb.

En local

scald.rb --repl --local

Sur le cluster

  • s’assurer d’avoir un password-less ssh vers le master
  • modifier la fonction jar_mode_command dans scald.rb pour que le path vers hadoop soit complet. Par exemple:

  • lancer le repl: scald.rb --repl --hdfs --host <MASTER_HOST>

référence: https://github.com/twitter/scalding/wiki/Scalding-REPL