Die Installation von CDH5 aus der Tarball-Distribution ist nicht wirklich schwierig, aber die richtige Konfiguration der Pseudo-Distribution ist alles andere als einfach. Es hat sich also gelohnt, darüber zu schreiben.
Die Software erhalten
Die Software zu erhalten war der einfachste Teil. Gehen Sie einfach auf die Cloudera Download-Seite und klicken Sie auf die Schaltfläche unter dem Text Für Entwickler. Dadurch gelangen Sie auf die Seite mit den Download-Produkten, wo Sie die Version und den Typ auswählen können. Ich wählte CDH5.0.0 und klickte auf den Link Tarballs.
Hier erhalten Sie eine lange Liste von Hadoop-Komponenten, jede mit ihrem eigenen Paket. Ich habe Hadoop und Spark heruntergeladen, da ich sie im Moment benötige.
Auspacken
Ich habe in meinem lokalen Dateisystem ein neues Verzeichnis mit dem Namen cdh5.0.0 erstellt. Ich bezeichne dieses Verzeichnis von nun an als /cdh5.0.0 und entpackte die beiden heruntergeladenen Pakete:
$ mkdir /cdh5.0.0 $ cd /cdh5.0.0 $ tar -xvzf hadoop-2.3.0-cdh5.0.0.tar.gz $ mkdir spark-0.9.0-cdh5.0.0 && cd spark-0.9.0-cdh5.0.0 && tar -xvzf ../spark-0.9.0-cdh5.0.0.tar.gz && cd ../
Dadurch werden die Tarballs entpackt; sehen Sie, wie ich das Spark-Verzeichnis selbst erstellt habe, da dessen Tarball anders gepackt ist als der von Hadoop.
Hadoop im lokalen Modus
Die Verwendung von Hadoop im lokalen Modus ist ziemlich einfach. Alles, was Sie brauchen, sind ein paar Umgebungseinstellungen, die auf die richtigen Verzeichnisse verweisen, und schon können Sie loslegen.
In meinem .bash_profile verwende ich immer Aliase, um einfach zwischen Umgebungen zu wechseln.
Für die Einstellungen des lokalen Modus von Hadoop verwende ich diese:
alias switch_local_cdh5='export JAVA_HOME=$(/usr/libexec/java_home -v 1.7); export HADOOP_PREFIX=/cdh5.0.0/hadoop-2.3.0-cdh5.0.0; export HADOOP_COMMON_HOME=${HADOOP_PREFIX}; export HADOOP_HDFS_HOME=${HADOOP_PREFIX}; export HADOOP_MAPRED_HOME=${HADOOP_PREFIX}; export HADOOP_YARN_HOME=${HADOOP_PREFIX}; export SPARK_HOME=/cdh5.0.0/spark-0.9.0-cdh5.0.0; export PATH=${HADOOP_PREFIX}/bin:${SPARK_HOME}/bin:$PATH; export HADOOP_CONF_DIR=/cdh5.0.0/hadoop-2.3.0-cdh5.0.0/etc/hadoop;'
Wenn ich eine neue Terminalsitzung starte, kann ich die Variablen ganz einfach in einem mit exportieren:
$ switch_local_cdh5
Jetzt sollten alle bekannten Hadoop-Befehle funktionieren. Es gibt keine andere Vorstellung von HDFS als Ihr lokales Dateisystem, so dass der Befehl hadoop fs -ls / die gleiche Ausgabe wie ls / zeigt
$ hadoop fs -ls / drwxrwxr-x - root admin 2686 2014-04-18 09:47 /Anwendungen drwxr-xr-x - root wheel 2210 2014-02-26 02:46 /Bibliothek drwxr-xr-x - root wheel 68 2013-08-25 05:45 /Netzwerk drwxr-xr-x - root wheel 136 2013-10-23 03:05 /System drwxr-xr-x - root admin 204 2013-10-23 03:09 /Benutzer drwxrwxrwt - root admin 136 2014-04-18 12:34 /Volumen [...] $ ls -l / drwxrwxr-x+ 79 root admin 2.6K Apr 18 09:47 Anwendungen drwxr-xr-x+ 65 Wurzelrad 2.2K Feb 26 02:46 Bibliothek drwxr-xr-x@ 2 Wurzelrad 68B Aug 25 2013 Netzwerk drwxr-xr-x+ 4 Wurzelrad 136B Okt 23 03:05 System drwxr-xr-x 6 root admin 204B Okt 23 03:09 Benutzer drwxrwxrwt@ 4 root admin 136B Apr 18 12:34 Bände
Die Ausführung eines MapReduce-Auftrags sollte ebenfalls sofort funktionieren.
$ cd ${HADOOP_PREFIX} $ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.3.0-cdh5.0.0.jar pi 10 100 Anzahl von Karten = 10 Proben pro Karte = 100 2014-04-19 18:05:01.596 java[74281:1703] Realm-Info kann nicht von SCDynamicStore geladen werden 14/04/19 18:05:02 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen Eingaben verfasst für Karte #0 Eingaben verfasst für Karte #1 Eingaben verfasst für Karte #2 Eingaben verfasst für Karte #3 Eingaben verfasst für Karte #4 Eingaben verfasst für Karte #5 Eingaben verfasst für Karte #6 Eingaben verfasst für Karte #7 Eingaben verfasst für Karte #8 Eingaben verfasst für Karte #9 Job beginnen .... Auftrag beendet in 1,587 Sekunden Der geschätzte Wert von Pi ist 3.14800000000000000000
Hadoop im pseudo-distributiven Modus
Der pseudoverteilte Modus ist ein wenig komplizierter. Der pseudoverteilte Modus bedeutet, dass alle beteiligten Daemons, die Hadoop zum Laufen bringen, auf Ihrem lokalen Rechner laufen. Dafür benötigen Sie ein separates Paar von Konfigurationsdateien; lassen Sie uns damit beginnen, ein neues Verzeichnis dafür zu erstellen:
$ cd
/cdh5.0.0
$ mkdir conf.pseudo
Jetzt müssen wir dieses Verzeichnis mit den richtigen Dateien und Inhalten bestücken. Diese manuell zu erstellen ist eine langwierige und mühsame Aufgabe. Da ich ein fauler Programmierer bin, suchte ich nach einem einfachen Ausweg und fand ein Linux-Paket namens hadoop-conf-pseudo. Aber wie bereits erwähnt, habe ich keinen Linux-Laptop. Also habe ich eine virtuelle CentOS-Maschine gestartet und in dieser virtuellen Maschine das CDH5 yum-Repository konfiguriert.
$ echo -e "[cloudera-5-repo]nname=CDH 5 reponbaseurl=http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5/ngpgcheck=0n" > /etc/yum.repos.d/CDH5.repo $ yum install hadoop-conf-psuedo
Dadurch wird ein gut gefülltes Verzeichnis in /etc/hadoop/conf.pseudo erstellt, das wir auf meinen Laptop kopieren werden
$ cp -r /etc/hadoop/conf.pseudo /mnt/hgfs/cdh5.0.0/conf.pseudo.linux
Schauen wir mal, was da drin ist:
$ ll /cdh4.0.0/conf.pseudo.linux/ gesamt 80 -rwxr-xr-x 1 Benutzer Personal 1.1K Apr 19 18:29 README -rwxr-xr-x 1 Benutzer Personal 2.1K Apr 19 18:29 core-site.xml -rwxr-xr-x 1 Benutzer Personal 1.3K Apr 19 18:29 hadoop-env.sh -rwxr-xr-x 1 Benutzer Personal 2.8K Apr 19 18:29 hadoop-metrics.properties -rwxr-xr-x 1 Benutzer Personal 1.8K Apr 19 18:29 hdfs-site.xml -rwxr-xr-x 1 Benutzer Personal 11K Apr 19 18:29 log4j.properties -rwxr-xr-x 1 Benutzer Personal 1.5K Apr 19 18:29 mapred-site.xml -rwxr-xr-x 1 Benutzer Personal 2.3K Apr 19 18:29 yarn-site.xml
Wir müssen ein paar Dinge ändern, da die Verzeichnisstruktur auf unserem Laptop anders ist als auf dem Linux-Rechner, von dem diese Dateien stammen. Werfen wir also einen Blick auf den Inhalt und finden heraus, welche Konfigurationen wir anpassen müssen.
Die wichtigsten Konzepte, die wir brauchen, sind HDFS und YARN, also konzentrieren wir uns auf diese. Die anderen Konfigurationsdateien können ohne Änderungen kopiert werden.
$ cp /cdh5.0.0/conf.pseudo.linux/core-site.xml /cdh5.0.0/conf.pseudo/ $ cp /cdh5.0.0/conf.pseudo.linux/hadoop-env.sh /cdh5.0.0/conf.pseudo/ $ cp /cdh5.0.0/conf.pseudo.linux/hadoop-metrics.properties /cdh5.0.0/conf.pseudo/ $ cp /cdh5.0.0/conf.pseudo.linux/log4j.properties /cdh5.0.0/conf.pseudo/
Das Wichtigste zuerst: HDFS
$ vi /cdh5.0.0/conf.pseudo.linux/hdfs-site.xml
In dieser Datei gibt es einige verschiedene Konfigurationseinstellungen, die auf die Speicherorte der Datenverzeichnisse namenode, secondary namenode und datanode verweisen.
...hadoop.tmp.dir /var/lib/hadoop-hdfs/cache/${user.name} dfs.namenode.name.dir datei:///var/lib/hadoop-hdfs/cache/${benutzer.name}/dfs/name dfs.namenode.checkpoint.dir file:///var/lib/hadoop-hdfs/cache/${benutzer.name}/dfs/namesecondary dfs.datanode.data.dir file:///var/lib/hadoop-hdfs/cache/${benutzername}/dfs/data ...
Kopieren Sie diese Datei in unser Verzeichnis /cdh5.0.0/conf.pseudo und ändern Sie die Speicherorte dieser Konfigurationsparameter. Vergessen Sie nicht, die referenzierten Verzeichnisse anzulegen.
$ cp /cdh5.0.0/conf.pseudo.linux/hdfs-site.xml /cdh5.0.0/conf.pseudo/ $ vi /cdh5.0.0/conf.pseudo/hdfs-site.xml... hadoop.tmp.dir /cdh5.0.0/var/lib/hadoop-hdfs/cache/${benutzer.name} dfs.namenode.name.dir file:///cdh5.0.0/var/lib/hadoop-hdfs/cache/${benutzername}/dfs/name dfs.namenode.checkpoint.dir file:///cdh5.0.0/var/lib/hadoop-hdfs/cache/${user.name}/dfs/namesecondary ... dfs.datanode.data.dir file:///cdh5.0.0/var/lib/hadoop-hdfs/cache/${benutzername}/dfs/data
Und vergessen Sie nicht, die Verzeichnisse anzulegen
$ cd /cdh5.0.0 $ mkdir -p var/lib/hadoop-hdfs/cache/${BENUTZER}/dfs/data $ mkdir -p var/lib/hadoop-hdfs/cache/${BENUTZER}/dfs/namesecondary $ mkdir -p var/lib/hadoop-hdfs/cache/${BENUTZER}/dfs/name
Wir brauchen auch die richtigen Umgebungseinstellungen, erinnern Sie sich? Für die Einstellungen des pseudo-verteilten Modus von Hadoop verwende ich diese:
alias switch_pseudo_cdh5='export JAVA_HOME=$(/usr/libexec/java_home -v 1.7); export HADOOP_PREFIX=/cdh5.0.0/hadoop-2.3.0-cdh5.0.0; export HADOOP_COMMON_HOME=${HADOOP_PREFIX}; export HADOOP_HDFS_HOME=${HADOOP_PREFIX}; export HADOOP_MAPRED_HOME=${HADOOP_PREFIX}; export HADOOP_YARN_HOME=${HADOOP_PREFIX}; export SPARK_HOME=/cdh5.0.0/spark-0.9.0-cdh5.0.0; export PATH=${HADOOP_PREFIX}/sbin:${HADOOP_PREFIX}/bin:${SPARK_HOME}/bin:${PATH}; export HADOOP_CONF_DIR=/cdh5.0.0/hadoop-2.3.0-cdh5.0.0/conf.pseudo;'
Achten Sie auf den zusätzlichen $HADOOP_PREFIX/sbin Zusatz zur Variable PATH. Das brauchen wir in einer Minute.
Funktioniert es schon? Versuchen wir es.
$ switch_psuedo_cdh5 $ hadoop fs -ls / 2014-04-19 19:14:06.047 java[76056:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/19 19:14:06 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen ls: Aufruf von localdomain.local/111.11.11.1 nach localhost:8020 fehlgeschlagen wegen Verbindungsausnahme: java.net.ConnectException: Verbindung abgelehnt; Für weitere Einzelheiten siehe: http://wiki.apache.org/hadoop/ConnectionRefused
Vermutlich nicht. Die Daemons laufen nicht, also müssen Sie sie starten. Dies kann mit dem einfachen Befehl start-dfs.sh geschehen, da wir das Verzeichnis HADOOP_PREFIX/sbin, das die Skripte zum Starten und Stoppen der Daemons enthält, zu unserer Variable PATH hinzugefügt haben.
$ start-dfs.sh
Möglicherweise müssen Sie Ihr Passwort mehrmals eingeben, da die Daemons über eine ssh-Verbindung zu localhost gestartet werden.
Jetzt überprüfen wir noch einmal, ob es funktioniert! Wir sind doch ungeduldige Programmierer, oder?
$ hadoop fs -ls / 2014-04-19 19:14:06.047 java[76056:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/19 19:14:06 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen ls: Aufruf von localdomain.local/111.11.11.1 nach localhost:8020 fehlgeschlagen wegen Verbindungsausnahme: java.net.ConnectException: Verbindung abgelehnt; Für weitere Einzelheiten siehe: http://wiki.apache.org/hadoop/ConnectionRefused
Immer noch nichts. Um zu verstehen, was hier passiert, müssen wir ein wenig zurückgehen und uns die Ausgabe des Befehls start-dfs.sh ansehen:
$ start-dfs.sh 2014-04-19 19:21:38.976 java[76172:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/19 19:21:39 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen Starten von Namensknoten auf [localhost] Das Passwort: localhost: Namenode starten, Protokollierung nach /cdh5.0.0/hadoop-2.3.0-cdh5.0.0/logs/hadoop-user-namenode-localdomain.local.out localhost: 2014-04-19 19:21:45.992 java[76243:1b03] Realm-Informationen können nicht aus SCDynamicStore geladen werden cat: /cdh5.0.0/conf.pseudo/slaves: Keine solche Datei oder Verzeichnis Sekundäre Namensknoten starten [0.0.0.0] Das Passwort: 0.0.0.0: Sekundärnamenode gestartet, Protokollierung nach /cdh5.0.0/hadoop-2.3.0-cdh5.0.0/logs/hadoop-user-secondarynamenode-localdomain.local.out 0.0.0.0: 2014-04-19 19:21:53.619 java[76357:1b03] Realm-Informationen können nicht aus SCDynamicStore geladen werden 2014-04-19 19:21:58.508 java[76405:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/19 19:21:58 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen
Sehen Sie die Meldung cat: /cdh5.0.0/conf.pseudo/slaves: No such file or directory? Wir hatten diese Datei nicht in unserem conf.pseudo.linux Verzeichnis, oder? Glücklicherweise ist die Datei im lokalen Konfigurationsverzeichnis verfügbar: Kopieren Sie sie und stoppen Sie die Daemons, die nicht korrekt gestartet wurden.
$ stop-dfs.sh $ cp /cdh5.0.0/hadoop-2.3.0-cdh5.0.0/etc/hadoop/slaves /cdh5.0.0/conf.pseudo/ $ start-dfs.sh $ hadoop fs -ls / 2014-04-19 19:14:06.047 java[76056:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/19 19:14:06 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen ls: Aufruf von localdomain.local/111.11.11.1 nach localhost:8020 fehlgeschlagen wegen Verbindungsausnahme: java.net.ConnectException: Verbindung abgelehnt; Für weitere Einzelheiten siehe: http://wiki.apache.org/hadoop/ConnectionRefused
Nichts. Wir stoppen die HDFS-Dämonen erneut und sehen uns die Protokolle an:
$ stop-dfs.sh 2014-04-19 19:33:02.835 java[77195:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/19 19:33:02 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen Anhalten von Namensknoten auf [localhost] Das Passwort: localhost: kein Namensknoten zum Anhalten Das Passwort: localhost: Anhalten von datanode Stoppen von sekundären Namensknoten [0.0.0.0] Das Passwort: 0.0.0.0: Anhalten von Sekundärnamenode 2014-04-19 19:33:24.863 java[77400:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/19 19:33:24 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen
Hey! Was ist das für eine localhost: no namenode to stop Nachricht? Schauen wir uns zuerst die Namenode-Protokolle an.
$ vi /cdh5.0.0/hadoop-2.3.0-cdh5.0.0/logs/hadoop-user-namenode-localdomain.local.log
2014-04-19 19:32:20,064 FATAL org.apache.hadoop.hdfs.server.namenode.NameNode: Exception in namenode join
java.io.IOException: NameNode ist nicht formatiert.
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead (FSImage.java:216 )
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage (FSNamesystem.java:879 )
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk (FSNamesystem.java:638 )
at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem (NameNode.java:440)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:496)
at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:652)
at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:637)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1286)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1352)
2014-04-19 19:32:20,066 INFO org.apache.hadoop.util.ExitUtil: Beendet mit Status 1
2014-04-19 19:32:20,067 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG:
Das Protokoll sagt uns, dass wir zuerst HDFS formatieren müssen.
$ hadoop namenode -format $ start-dfs.sh $ hadoop fs -ls / $ hadoop fs -mkdir /bogus $ hadoop fs -ls / 2014-04-19 19:46:32.233 java[78176:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/19 19:46:32 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen Gefunden 1 Artikel drwxr-xr-x - Benutzer Supergruppe 0 2014-04-19 19:46 /bogus
Ok, wir sind dabei!
Jetzt konzentrieren wir uns auf den YARN-Teil
$ vi /cdh5.0.0/conf.pseudo.linux/yarn-site.xml
Dort haben wir einige verschiedene Konfigurationseinstellungen, die auf die Speicherorte der Containerprotokolle und des lokalen Nodemanager-Verzeichnisses verweisen.
...Liste der Verzeichnisse, in denen lokalisierte Dateien gespeichert werden sollen. yarn.nodemanager.local-dirs /var/lib/hadoop-yarn/cache/${user.name}/nm-local-dir Wo Sie Container-Logs aufbewahren. yarn.nodemanager.log-dirs /var/log/hadoop-yarn/containers Wohin die Protokolle aggregiert werden sollen. yarn.nodemanager.remote-app-log-dir /var/log/hadoop-yarn/apps Klassenpfad für typische Anwendungen. yarn.application.classpath $HADOOP_CONF_DIR, $HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*, $HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*, $HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*, $HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/* ...
Kopieren Sie diese Datei in unser Verzeichnis /cdh5.0.0/conf.pseudo und ändern Sie die Speicherorte dieser Konfigurationsparameter. Und vergessen Sie nicht, die referenzierten Verzeichnisse anzulegen.
$ cp /cdh5.0.0/conf.pseudo.linux/yarn-site.xml /cdh5.0.0/conf.pseudo/ $ vi /cdh5.0.0/conf.pseudo/yarn-site.xml
...Liste der Verzeichnisse, in denen lokalisierte Dateien gespeichert werden sollen. yarn.nodemanager.local-dirs /cdh5.0.0/var/lib/hadoop-yarn/cache/${user.name}/nm-local-dir Wo Sie Container-Logs aufbewahren. yarn.nodemanager.log-dirs /cdh5.0.0/var/log/hadoop-yarn/containers Wohin die Protokolle aggregiert werden sollen. yarn.nodemanager.remote-app-log-dir /var/log/hadoop-yarn/apps Klassenpfad für typische Anwendungen. yarn.application.classpath $HADOOP_CONF_DIR, $HADOOP_COMMON_HOME/share/hadoop/common/*, $HADOOP_COMMON_HOME/share/hadoop/common/lib/*, $HADOOP_HDFS_HOME/share/hadoop/hdfs/*, $HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*, $HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*, $HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*, $HADOOP_YARN_HOME/share/hadoop/yarn/*, $HADOOP_YARN_HOME/share/hadoop/yarn/lib/* ...
Und vergessen Sie nicht, diese Verzeichnisse anzulegen
$ cd /cdh5.0.0 $ mkdir -p var/lib/hadoop-yarn/cache/${BENUTZER}/nm-local-dir $ mkdir -p var/log/hadoop-yarn/containers
Die Eigenschaft yarn.nodemanager.remote-app-log-dir muss nicht geändert werden, da es sich um eine Variable handelt, die auf einen Pfad im HDFS verweist.
Versuchen wir nun, die YARN-Daemons zu starten (stellen Sie sicher, dass die HDFS-Daemons noch laufen)
$ start-yarn.sh Starten von Garn-Dämonen Ressourcemanager starten, Protokollierung in /cdh5.0.0/hadoop-2.3.0-cdh5.0.0/logs/yarn-user-resourcemanager-localdomain.local.out Das Passwort: localhost: nodemanager gestartet, Protokollierung in /cdh5.0.0/hadoop-2.3.0-cdh5.0.0/logs/yarn-user-nodemanager-localdomain.local.out $ cd ${HADOOP_PREFIX} $ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.3.0-cdh5.0.0.jar pi 10 100
Sieht aus, als würde es funktionieren. Aber Moment, was sagt die Ausgabe?
Anzahl von Karten = 10 Proben pro Karte = 100 2014-04-20 00:23:57.055 java[79203:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/20 00:23:57 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen Eingaben verfasst für Karte #0 Eingaben verfasst für Karte #1 Eingaben verfasst für Karte #2 Eingaben verfasst für Karte #3 Eingaben verfasst für Karte #4 Eingaben verfasst für Karte #5 Eingaben verfasst für Karte #6 Eingaben verfasst für Karte #7 Eingaben verfasst für Karte #8 Eingaben verfasst für Karte #9 Job beginnen ... 14/04/20 00:23:59 INFO mapred.LocalJobRunner: 14/04/20 00:23:59 INFO mapred.MapTask: Flush der Kartenausgabe gestartet 14/04/20 00:23:59 INFO mapred.MapTask: Kartenausgabe ausgeben 14/04/20 00:23:59 INFO mapred.MapTask: bufstart = 0; bufend = 18; bufvoid = 104857600 14/04/20 00:23:59 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214392(104857568); Länge = 5/6553600 14/04/20 00:23:59 INFO mapred.MapTask: Beendete Verschüttung 0 14/04/20 00:23:59 INFO mapred.Task: Task:attempt_local37475800_0001_m_000000_0 is fertig. Und ist gerade dabei, sich zu verpflichten 14/04/20 00:23:59 INFO mapred.LocalJobRunner: Karte ...
Es wird immer noch die LocalJobRunner erwähnt. Ah, warten Sie, da war noch dieses mapred-site.xml, das wir noch nicht kopiert haben. Das sollten wir nachholen.
$ cd
/cdh5.0.0
$ cp conf.pseudo.linux/mapred-site.xml conf.pseudo/
$ vi conf.pseudo/mapred-site.xml
Dort haben wir eine Konfigurationseinstellung, die auf den Speicherort des Verzeichnisses mapreduce tmp verweist.
...So legen Sie den Wert des tmp-Verzeichnisses für Map- und Reduce-Aufgaben fest. mapreduce.task.tmp.dir /var/lib/hadoop-mapreduce/cache/${user.name}/tasks ...
Das sollten wir auch ändern
$ vi conf.pseudo/mapred-site.xml
...So legen Sie den Wert des tmp-Verzeichnisses für Map- und Reduce-Aufgaben fest. mapreduce.task.tmp.dir /cdh5.0.0/var/lib/hadoop-mapreduce/cache/${user.name}/tasks ...
$ cd /cdh5.0.0 $ mkdir -p var/lib/hadoop-mapreduce/cache/${BENUTZER}/tasks
Und versuchen Sie es erneut
$ cd ${HADOOP_PREFIX} $ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.3.0-cdh5.0.0.jar pi 10 100 Anzahl von Karten = 10 Proben pro Karte = 100 2014-04-20 00:36:42.138 java[79538:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/20 00:36:42 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen Eingaben verfasst für Karte #0 Eingaben verfasst für Karte #1 Eingaben verfasst für Karte #2 Eingaben verfasst für Karte #3 Eingaben verfasst für Karte #4 Eingaben verfasst für Karte #5 Eingaben verfasst für Karte #6 Eingaben verfasst für Karte #7 Eingaben verfasst für Karte #8 Eingaben verfasst für Karte #9 Job beginnen 14/04/20 00:36:43 INFO client.RMProxy: Verbinden mit ResourceManager unter /0.0.0.0:8032 14/04/20 00:36:43 INFO input.FileInputFormat: Gesamte zu verarbeitende Eingabepfade : 10 14/04/20 00:36:43 INFO mapreduce.JobSubmitter: Anzahl der Splits:10 14/04/20 00:36:43 INFO mapreduce.JobSubmitter: Token einreichen für Stelle: job_1397933444099_0001 14/04/20 00:36:44 INFO impl.YarnClientImpl: Übermittelte Anwendung application_1397933444099_0001 14/04/20 00:36:44 INFO mapreduce.Job: Die Url zum Verfolgen des Jobs: http://localdomain.local:8088/proxy/application_1397933444099_0001/ 14/04/20 00:36:44 INFO mapreduce.Job: Laufender Job: job_1397933444099_0001 14/04/20 00:36:49 INFO mapreduce.Job: Job job_1397933444099_0001 läuft im Uber-Modus : false 14/04/20 00:36:49 INFO mapreduce.Job: map 0% reduce 0% 14/04/20 00:36:49 INFO mapreduce.Job: Job job_1397933444099_0001 ist mit dem Status FAILED gescheitert aufgrund von: Anwendung application_1397933444099_0001 fehlgeschlagen 2 mal durch AM Container für appattempt_1397933444099_0001_000002 wurde mit exitCode beendet: 127 aufgrund von: Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException: org.apache.hadoop.util.Shell$ExitCodeException: at org.apache.hadoop.util.Shell.runCommand(Shell.java:505) at org.apache.hadoop.util.Shell.run(Shell.java:418) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:650) at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:195) at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:283) at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:79) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:722) Container wurde mit einem Wert ungleich Null verlassen Ausgang Code 127 Dieser Versuch scheitert. Die Bewerbung ist fehlgeschlagen.
Ok, kein lokaler Jobvermittler mehr. Irgendetwas stimmt definitiv noch nicht. Lassen Sie uns die Protokolle auf HDFS untersuchen:
$ hadoop fs -ls /var/log/hadoop-yarn/apps/user/logs/application_1397933444099_0001/ 2014-04-20 00:42:26.267 java[79865:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/20 00:42:26 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen Gefunden 1 Artikel -rw-r----- 1 Benutzer-Supergruppe 516 2014-04-20 00:36 /var/log/hadoop-yarn/apps/user/logs/application_1397933444099_0001/10.115.86.114_59329 $ hadoop fs -cat /var/log/hadoop-yarn/apps/user/logs/application_1397933444099_0001/10.115.86.114_59329 2014-04-20 00:45:44.565 java[79923:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/20 00:45:44 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen P VERSIONAPPLICATION_ACL MODIFY_APPVIEW_APP APPLICATION_OWNER Benutzer(&container_1397933444099_0001_01_000001Gstderr48/bin/bash: /bin/java: Keine solche Datei oder Verzeichnis stdout0(&container_1397933444099_0001_02_000001Gstderr48/bin/bash: /bin/java: Keine solche Datei oder Verzeichnis stdout0 VERSION*(&container_1397933444099_0001_02_000001none?B?Bdata:BCFile.indexnoneÍ data:TFile.indexnone?X66data:TFile.metanone?R???h??×¶9?A@???P
Seltsames Format, aber wir können die Fehlermeldung zwischen dem Müll deutlich sehen /bin/bash: /bin/java: No such file or directory.
Im Internet fand ich diese Problemumgehung und die Ausgabe HADOOP-8717, die das Problem einschließlich einer Lösung beschreibt. Da ich mehr daran interessiert bin, das Problem zu beheben, als einen Workaround zu verwenden, habe ich mich für den Patch der Startskripte entschieden. Der Patch in der Ausgabe HADOOP-8717 ändert ein wenig mehr als nötig. Wir müssen nur hadoop-config.sh ändern. Lassen Sie uns herausfinden, wo dieses Skript zu finden ist und es ändern.
$ cd
/cdh5.0.0
$ find . -name hadoop-config.sh
./hadoop-2.3.0-cdh5.0.0/bin-mapreduce1/hadoop-config.sh
./hadoop-2.3.0-cdh5.0.0/libexec/hadoop-config.sh
./hadoop-2.3.0-cdh5.0.0/src/hadoop-common-project/hadoop-common/src/main/bin/hadoop-config.sh
./hadoop-2.3.0-cdh5.0.0/src/hadoop-mapreduce1-project/bin/hadoop-config.sh
$ vi ./hadoop-2.3.0-cdh5.0.0/libexec/hadoop-config.sh
Das Skript lautet
# Unter OSX verwenden Sie java_home (oder /Library für ältere Versionen) wenn [ "Darwin" == "$(uname -s)" ]; dann wenn [ -x /usr/libexec/java_home ]; dann exportieren JAVA_HOME=($(/usr/libexec/java_home)) sonst exportieren JAVA_HOME=(/Library/Java/Home) fi fi ...
aber wir müssen es ändern in
... # Unter OSX verwenden Sie java_home (oder /Library für ältere Versionen) wenn [ "Darwin" == "$(uname -s)" ]; dann wenn [ -x /usr/libexec/java_home ]; dann exportieren JAVA_HOME=$(/usr/libexec/java_home) sonst exportieren JAVA_HOME=/Library/Java/Home fi fi ...
Starten wir YARN nun erneut
$ stop-yarn.sh && start-yarn.sh $ cd ${HADOOP_PREFIX} $ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.3.0-cdh5.0.0.jar pi 10 100 Anzahl von Karten = 10 Proben pro Karte = 100 2014-04-20 10:21:56.696 java[80777:1703] Realm-Informationen können nicht aus SCDynamicStore geladen werden 14/04/20 10:22:11 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek kann nicht geladen werden für Ihrer Plattform... gegebenenfalls unter Verwendung von Built-in-Java-Klassen Eingaben verfasst für Karte #0 Eingaben verfasst für Karte #1 Eingaben verfasst für Karte #2 Eingaben verfasst für Karte #3 Eingaben verfasst für Karte #4 Eingaben verfasst für Karte #5 Eingaben verfasst für Karte #6 Eingaben verfasst für Karte #7 Eingaben verfasst für Karte #8 Eingaben verfasst für Karte #9 Job beginnen 14/04/20 10:22:12 INFO client.RMProxy: Verbindung zum ResourceManager unter /0.0.0.0:8032 14/04/20 10:22:12 INFO input.FileInputFormat: Gesamte zu verarbeitende Eingabepfade : 10 14/04/20 10:22:12 INFO mapreduce.JobSubmitter: Anzahl der Splits:10 14/04/20 10:22:13 INFO mapreduce.JobSubmitter: Übermittlung von Token für Stelle: job_1397969462544_0001 14/04/20 10:22:13 INFO impl.YarnClientImpl: Übermittelte Anwendung application_1397969462544_0001 14/04/20 10:22:13 INFO mapreduce.Job: Die Url zum Verfolgen des Jobs: http://localdomain.local:8088/proxy/application_1397969462544_0001/ 14/04/20 10:22:13 INFO mapreduce.Job: Laufender Job: job_1397969462544_0001 14/04/20 10:22:34 INFO mapreduce.Job: Job job_1397969462544_0001 läuft im Uber-Modus : false 14/04/20 10:22:34 INFO mapreduce.Job: map 0% reduce 0% 14/04/20 10:22:53 INFO mapreduce.Job: map 10% reduce 0% 14/04/20 10:22:54 INFO mapreduce.Job: map 20% reduce 0% 14/04/20 10:22:55 INFO mapreduce.Job: map 30% reduce 0% 14/04/20 10:22:56 INFO mapreduce.Job: map 40% reduce 0% 14/04/20 10:22:57 INFO mapreduce.Job: map 50% reduce 0% 14/04/20 10:22:58 INFO mapreduce.Job: map 60% reduce 0% 14/04/20 10:23:12 INFO mapreduce.Job: map 70% reduce 0% 14/04/20 10:23:13 INFO mapreduce.Job: map 80% reduce 0% 14/04/20 10:23:15 INFO mapreduce.Job: map 90% reduce 0% 14/04/20 10:23:16 INFO mapreduce.Job: map 100% reduce 100% 14/04/20 10:23:16 INFO mapreduce.Job: Job job_1397969462544_0001 erfolgreich abgeschlossen ... Auftrag beendet in 64.352 Sekunden Der geschätzte Wert von Pi ist 3.14800000000000000000
Wow, wir haben es zum Laufen gebracht, nicht wahr?
Weiter zu Spark
Um mit der Spark-Shell zu experimentieren, kehren wir zur lokalen Hadoop-Konfiguration zurück:
$ switch_local_cdh5
$ spark-shell
ls: /cdh5.0.0/spark-0.9.0-cdh5.0.0/assembly/target/scala-2.10/: Keine solche Datei oder Verzeichnis
ls: /cdh5.0.0/spark-0.9.0-cdh5.0.0/assembly/target/scala-2.10/: Keine solche Datei oder Verzeichnis
Spark-Assembly in /cdh5.0.0/spark-0.9.0-cdh5.0.0/assembly/target/scala-2.10/ konnte nicht gefunden werden
Sie müssen Spark mit sbt/sbt Baugruppe'. bevor Sie dieses Programm ausführen.
Die Spark-Shell geht davon aus, dass ich es aus dem Quellcode-Build oder so ausführe. Das ist aber nicht der Fall. Schauen wir mal, wie man das beheben kann.
$ vi /cdh5.0.0/spark-0.9.0-cdh5.0.0/bin/spark-shell
#hier sehen wir, dass es die Spark-Klasse aufruft sonst $FWDIR/bin/spark-class $OPTIONS org.apache.spark.repl.Main "$@" fi
$ vi /cdh5.0.0/spark-0.9.0-cdh5.0.0/bin/spark-class
... wenn [ ! -f "$FWDIR/RELEASE" ]; dann # Beenden, wenn der Benutzer Spark nicht kompiliert hat num_jars=$(ls "$FWDIR"/assembly/target/scala-$SCALA_VERSION/ | grep "spark-assembly.*hadoop.*.jar" | wc -l) jars_list=$(ls "$FWDIR"/assembly/target/scala-$SCALA_VERSION/ | grep "spark-assembly.*hadoop.*.jar") wenn [ "$num_jars" -eq "0" ]; dann echo "Spark-Assembly konnte nicht gefunden werden in $FWDIR/zusammenbau/ziel/scala-$SCALA_VERSION/" >&2 echo "Sie müssen Spark mit 'sbt/sbt assembly' bauen, bevor Sie dieses Programm ausführen können. >&2 Ausgang 1 fi wenn [ "$num_jars" -gt "1" ]; dann echo "Mehrere Spark-Assembly-Jars gefunden in $FWDIR/zusammenbau/ziel/scala-$SCALA_VERSION:" >&2 echo "$jars_list" echo "Bitte entfernen Sie alle Gläser bis auf eines." Ausgang 1 fi fi ...
Die Bash-Skripte suchen nach Beweisen dafür, dass wir eine Release-Version ausführen (indem sie sich die Datei RELEASE ansehen); sie suchen dann nach einer jar-Datei mit assembly im Namen. Schauen wir nach, ob wir eine solche jar-Datei haben.
$ find /cdh5.0.0 -name "*assembly*jar"
/cdh5.0.0/spark-0.9.0-cdh5.0.0/spark-assembly_2.10-0.9.0-cdh5.0.0-hadoop2.3.0-cdh5.0.0.jar
Sie ist vorhanden, aber nicht an der Stelle, die das Skript spark-class sucht. Wir müssen nur das Skript spark-class ändern, damit es an der richtigen Stelle sucht, und die Datei RELEASE hinzufügen.
$ touch /cdh5.0.0/spark-0.9.0-cdh5.0.0/RELEASE $ vi /cdh5.0.0/spark-0.9.0-cdh5.0.0/bin/spark-class
... wenn [ ! -f "$FWDIR/RELEASE" ]; dann # Beenden, wenn der Benutzer Spark nicht kompiliert hat num_jars=$(ls "$FWDIR"/assembly/target/scala-$SCALA_VERSION/ | grep "spark-assembly.*hadoop.*.jar" | wc -l) jars_list=$(ls "$FWDIR"/assembly/target/scala-$SCALA_VERSION/ | grep "spark-assembly.*hadoop.*.jar") wenn [ "$num_jars" -eq "0" ]; dann num_jars=$(ls "$FWDIR"/ | grep "spark-assembly.*hadoop.*.jar" | wc -l) jars_list=$(ls "$FWDIR"/ | grep "spark-assembly.*hadoop.*.jar") wenn [ "$num_jars" -eq "0" ]; dann echo "Spark-Assembly konnte nicht gefunden werden in $FWDIR/zusammenbau/ziel/scala-$SCALA_VERSION/" >&2 echo "Sie müssen Spark mit 'sbt/sbt assembly' bauen, bevor Sie dieses Programm ausführen können. >&2 Ausgang 1 fi fi wenn [ "$num_jars" -gt "1" ]; dann echo "Mehrere Spark-Assembly-Jars gefunden in $FWDIR/zusammenbau/ziel/scala-$SCALA_VERSION:" >&2 echo "$jars_list" echo "Bitte entfernen Sie alle Gläser bis auf eines." Ausgang 1 fi fi ...
Versuchen Sie es noch einmal.
$ spark-shell ls: /cdh5.0.0-blog/spark-0.9.0-cdh5.0.0/jars/spark-assembly*.jar: Keine solche Datei oder Verzeichnis Fehler: Die Hauptklasse org.apache.spark.repl.Main konnte nicht gefunden oder geladen werden
Es ist wieder richtig. Irgendwo anders machen wir eine falsche Annahme über die Struktur unseres Verzeichnisbaums. Aber wo?
$ cd spark-0.9.0-cdh5.0.0/bin
$ grep jars/spark-assembly'. *
compute-classpath.sh: ASSEMBLY_JAR=</span>ls <span class="s2">"</span><span class="nv">$F</span><span class="s2">WDIR"</span>/jars/spark-assembly*.jar<span class="sb"> $ vi compute-classpath.sh
# Entfernen Sie die /jars in der ASSEMBLY_JAR-Variable, und versuchen Sie es erneut.
$ cd ../../ $ spark-shell Ausnahme im Thread "Haupt" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream at org.apache.spark.repl.SparkIMain.(SparkIMain.scala:93) at org.apache.spark.repl.SparkILoop$SparkILoopInterpreter. (SparkILoop.scala:174 ) at org.apache.spark.repl.SparkILoop.createInterpreter (SparkILoop.scala:193 ) at org.apache.spark.repl.SparkILoop $$anonfun$process $1.apply$mcZ$sp (SparkILoop.scala:887 ) at org.apache.spark.repl.SparkILoop $$anonfun$process $1.apply (SparkILoop.scala:883) at org.apache.spark.repl.SparkILoop $$anonfun$process $1.apply (SparkILoop.scala:883 ) at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader (ScalaClassLoader.scala:135 ) at org.apache.spark.repl.SparkILoop.process (SparkILoop.scala:883 ) at org.apache.spark.repl.SparkILoop.process (SparkILoop.scala:981) at org.apache.spark.repl.Main$.main (Main.scala:31 ) at org.apache.spark.repl.Main.main (Main.scala ) Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FSDataInputStream at java.net.URLClassLoader $1.run (URLClassLoader.java:366 ) at java.net.URLClassLoader $1.run (URLClassLoader.java:355 ) at java.security.AccessController.doPrivileged (Native Method ) at java.net.URLClassLoader.findClass (URLClassLoader.java:354 ) at java.lang.ClassLoader.loadClass (ClassLoader.java:423) at sun.misc.Launcher $AppClassLoader.loadClass (Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) ... 11 mehr
Wir kommen der Sache näher. Spark kann unsere Hadoop-Jars nicht finden. Um das zu beheben, fügen wir dem compute-classpath.sh Skript einige classpath Einstellungen hinzu:
$ vi spark-0.9.0-cdh5.0.0/bin/compute-classpath.sh
...
ASSEMBLY_JAR=</span>ls <span class="s2">"</span><span class="nv">$F</span><span class="s2">WDIR"</span>/spark-assembly*.jar<span class="sb"> # Hier werden die Referenzen auf den Hadoop-Klassenpfad hinzugefügt. CLASSPATH="$CLASSPATH:$HADOOP_PREFIX/share/hadoop/common/*:$HADOOP_PREFIX/share/hadoop/common/lib/*" CLASSPATH="$CLASSPATH:$HADOOP_PREFIX/share/hadoop/mapreduce/*" CLASSPATH="$CLASSPATH:$HADOOP_PREFIX/share/hadoop/mapreduce/lib/*" CLASSPATH="$CLASSPATH:$HADOOP_PREFIX/share/hadoop/yarn/*" CLASSPATH="$CLASSPATH:$HADOOP_PREFIX/share/hadoop/yarn/lib/*" CLASSPATH="$CLASSPATH:$HADOOP_PREFIX/share/hadoop/hdfs/*" CLASSPATH="$CLASSPATH:$HADOOP_PREFIX/share/hadoop/hdfs/lib/*" CLASSPATH="$CLASSPATH:$SPARK_HOME/lib/*"
$ spark-shell SLF4J: Der Klassenpfad enthält mehrere SLF4J-Bindungen. ... 2014-04-20 09:48:25,238 INFO [Haupt] spark.HttpServer (Protokollierung.scala:logInfo(49)) - HTTP-Server starten 2014-04-20 09:48:25,302 INFO [Haupt] server.Server (Server.java:doStart(266)) - jetty-7.6.8.v20121106 2014-04-20 09:48:25,333 INFO [Haupt] server.AbstractConnector (AbstractConnector.java:doStart(338)) - Gestartet SocketConnector@0.0.0.0:62951 Willkommen bei ____ __ / __/__ ___ _____/ /__ _ / _ / _ `/ __/ '_/ /___/ .__/_,_/_/ /_/_ Version 0.9.0 /_/ Scala Version 2.10.3 verwenden (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_15) Geben Sie Ausdrücke ein, damit sie ausgewertet werden. Typ :Hilfe für mehr Informationen. ... Erstellt Funken Kontext... Spark-Kontext verfügbar als sc. scala>
Und wir sind dabei!!
Als letzten Test überprüfen wir nun, ob Spark auf unserer pseudoverteilten Hadoop-Konfiguration funktioniert
$ switch_pseudo_cdh5 $ start-dfs.sh $ start-yarn.sh $ hadoop fs -mkdir /sourcedata $ hadoop fs -put somelocal-textfile.txt /sourcedata/sometext.txt $ spark-shell scala> val Datei = sc.textFile("/sourcedata/sometext.txt") file.take(5) res1: Array[Zeichenfolge] = Array("Erste", "fünf Zeilen", "von", "die", "Textdatei" )
Funktioniert wie ein Zauber. Ich hoffe, dies war eine nützliche Übung. Für mich war sie es zumindest.
Unsere Ideen
Weitere Blogs
Contact



