4.4 Mit Sqoop Daten importieren

In diesem Beispiel möchten wir mit Sqoop Dateien in HDFS importieren. Dazu sind jedoch ein paar Vorbereitungen notwendig.

Vorbereitungen zum Beispiel

Bitte starte zuerst wieder deine VirtualBox und logge dich mittels Putty auf deiner virtuellen Instanz ein. Logge dich bitte wie immer als „maria_dev“ ein. Leider besitzt in der Hortonworks Hadoop Sandbox Version 2.6.5 MySQL keinen root-Benutzer. Diesen müssen wir uns erst anlegen. Bitte führe dazu folgende Schritte (jeden Befehl einzeln) durch:

sudo su - root
systemctl stop mysqld
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
systemctl start mysqld
mysql -uroot

Du gelangst nun in die MySQL-Shell. Bitte gib dort folgendes ein (jeden Befehl einzeln) :

FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'hadoop';
FLUSH PRIVILEGES;
QUIT;

Du solltest nun wieder in der Kommandozeile der Hadoop-Sandbox sein. Bitte gib nun folgendes ein:

systemctl unset-environment MYSQLD_OPTS
systemctl restart mysqld
exit

Nun solltest du wieder in der Shell für den User „maria_dev“ sein. Bitte gib nun folgenden Code in der Kommandozeile ein:

mysql -uroot -phadoop

Du bist nun in der MySQL-Tabelle mittels Kommandozeile. Wir müssen unsere Datenbank so vorbereiten, dass wir überhaupt Daten zum Testen und Übertragen haben. Bitte lege nun die Datenbank „movielens“ mit folgendem Befehl an und lasse dir danach mit dem zweiten Befehl alle Tabellen in MySQL anzeigen:

create database movielens;
show databases;

Wie du sehen kannst, sind bereits einige Datenbanken im Sandbox-MySQL von Hadoop angelegt. Wir können nun die Shell wieder verlassen mit

exit

Die Daten, welche wir nun in Hadoop importieren, müssen einem bestimmten Format entsprechen. Ich habe dir die MovieLens-Daten bereits umgewandelt, sodass du die Daten gleich importieren kannst. Bitte lade dazu das entsprechende SQL-Skript innerhalb deiner virtuellen Instanz per Kommandozeile herunter:

wget https://jasonadam.de/hadoop/dateien/movielens.sql

Wir importieren nun die Daten, indem wir uns wieder in die SQL-Shell anmelden und dann die Daten importieren. Bitte gib dazu folgende Befehle ein:

mysql -uroot -phadoop
SET NAMES 'utf8';
SET CHARACTER SET utf8;
use movielens;
source movielens.sql;

Der Import sollte nun geklappt haben. Lass uns den Import überprüfen:

show tables;

Du solltest hier nun die Genres, Filme, Bewertungen etc. als Tabelleninhalt sehen können. Ein weiterer Test ist die Abfrage der Datenbank. Bitte gib hierzu folgendes ein:

select * from movies limit 10;

Du solltest hier nun einen Auszug der Filmliste bekommen. 

Extra: den Film mit den meisten Bewertungen herausfinden

Auch hier kannst du den Film mit den meisten Bewertungen herausfinden. Wir haben das zwar schon mit Hive gemacht, ich möchte dir hier aber verdeutlichen, wie viel schneller das in MySQL funktioniert. Bitte gib dazu folgendes ein:

SELECT movies.title, COUNT(ratings.movie_id) AS ratingCount FROM movies INNER JOIN ratings ON movies.id = ratings.movie_id GROUP BY movies.title ORDER BY ratingCount;

Du wirst das Ergebnis sehr schnell bekommen (wie erwartet Star Wars als Ergebnis) und nicht erst ein paar Sekunden darauf warten müssen wie bei Hive. Für kleine Datensätze wie die von uns verwendeten Filmdaten sind Lösungen wie MySQL deutlich besser. Für sehr große Datensätze würde die Abfrage, wenn überhaupt mit MySQL möglich, sehr lange dauern. Hier spielt Hive sein volles Potential aus.

Importieren der Daten von MySQL in HDFS mit Sqoop

Bitte gib folgendes in der Kommandozeile von maria_dev ein (falls du noch in der MySQL-Shell bist, kannst du diese mit ‚exit‘ verlassen):

sqoop import --connect jdbc:mysql://localhost/movielens --driver com.mysql.jdbc.Driver --table movies -m 1 --fields-terminated-by '/0001' -username root -P

Bitte gib als Passwort „hadoop“ ein, dieses haben wir in unseren Vorbereitungen gesetzt. Danach kannst du zusehen, wie Sqoop deinen Import-Job ausführt. Du siehst, dass hier deutlich mehr Aufgaben anfallen, als es für einen kleinen Datensatz notwendig wäre. Aus diesem Grund ist Sqoop nicht das Mittel der Wahl bei kleinen Datensatzimporten.

Nachdem du die erfolgreiche Durchführung in der Kommandozeile mitgeteilt bekommst, kannst du dich in Ambari über localhost:8080 anmelden. Gehe dort bitte auf „Files View“ und navigiere anschließend zum Ordner „user“–> „maria_dev“. Du findest hier nun den Ordner „movies“, welcher unsere Daten sowie ein Log enthält. Da wir nur einen Mapper festgelegt haben, findest du die Daten auch nur in einer Datei.

Der Import-Vorgang von HDFS in MySQL ist genauso aufgebaut, ich lasse ihn nun aus Zeitgründen jedoch weg.


Weiter geht es mit: 5.1 Grundlagen von HBase