HDFS-Connector mit Spark verwenden
Einführung
Dieser Artikel bietet eine Schritt-für-Schritt-Anleitung, die die Verwendung des Hadoop Distributed File System-(HDFS-)Connectors mit dem Spark-Anwendungs-Framework veranschaulicht. Für die Schritt-für-Schritt-Anleitung verwenden wir das Betriebssystem Oracle Linux 7.4 und führen Spark als eigenständiges System auf einem einzelnen Rechner aus.
Voraussetzungen
Im Folgenden werden die Voraussetzungen für die Schritt-für-Schritt-Anleitung aufgeführt:
- Sie benötigen die Berechtigung zum Erstellen einer Compute-Instanz. Weitere Informationen finden Sie unter Instanz erstellen.
- Sie müssen eine Verbindung zu der gestarteten Serviceinstanz herstellen können. Weitere Informationen finden Sie unter Verbindung mit einer Instanz herstellen.
- Sie benötigen die entsprechende OCID, den Fingerprint und die Private Key für den Identity and Access Management-(IAM-)Benutzer, mit dem Sie mit Object Storage interagieren. Weitere Informationen finden Sie unter Setup und Voraussetzungen.
- Sie müssen über einen Object Storage-Bucket verfügen, zu dem Sie die Verbindung herstellen können.
- Der IAM-Benutzer muss mit der Konsole diesen Bucket lesen und schreiben kann.
Spark verwenden
Spark und Abhängigkeiten installieren
Für dieses Beispiel müssen Sie Spark im Home-Verzeichnis des aktuellen Benutzers installieren. Beachten Sie, dass dies bei Produktionsszenarien nicht der Fall ist.
Ab Version 2.7.7.0 werden nicht mehr alle erforderlichen Abhängigkeiten von Drittanbietern installiert. Erforderliche Drittanbieterabhängigkeiten werden im Ordner
third-party/lib im ZIP-Archiv gebündelt und müssen manuell installiert werden.- Erstellen Sie eine Instanz Ihres Compute-Service. Weitere Informationen finden Sie unter Instanz erstellen.
- Stellen Sie sicher, dass die Serviceinstanz eine öffentliche IP-Adresse hat, damit Sie eine Verbindung über eine Secure-Shell-(SSH-)Verbindung herstellen können. Weitere Informationen finden Sie unter Verbindung mit einer Instanz herstellen.
- Stellen Sie eine SSH-Verbindung zur Serviceinstanz her.
- Installieren Sie Spark und die zugehörigen Abhängigkeiten, Java und Scala, indem Sie die folgenden Codebeispiele verwenden.
# We'll use wget to download some of the artifacts that need to be installed
sudo yum install wget
# First install Java
sudo yum install java-1.8.0-openjdk.x86_64
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
# Should be something like: OpenJDK Runtime Environment (build 1.8.0_161-b14)
java -version
# Then install Scala
wget https://downloads.lightbend.com/scala/2.12.4/scala-2.12.4.rpm
sudo yum install scala-2.12.4.rpm
# Should be something like: Scala code runner version 2.12.4 -- Copyright 2002-2017, LAMP/EPFL and Lightbend, Inc.
scala -version
# Then download Spark
wget https://archive.apache.org/dist/spark/spark-2.2.1/spark-2.2.1-bin-hadoop2.7.tgz
tar xvf spark-2.2.1-bin-hadoop2.7.tgz
export SPARK_HOME=$HOME/spark-2.2.1-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin
# Start a Spark master
cd $SPARK_HOME
./sbin/start-master.sh
HDFS-Connector herunterladen und Konfigurationsdateien erstellen
Legen Sie für dieses Beispiel die JAR- und Schlüsseldateien im Home-Verzeichnis des aktuellen Benutzers ab. In Produktionsszenarien würden Sie diese Dateien stattdessen an einem gemeinsamen Ort ablegen, der die entsprechenden Berechtigungen durchsetzt (also Lesezugriff durch den Benutzer, unter dem Spark und Hive ausgeführt werden).
Laden Sie den HDFS-Connector in die Serviceinstanz herunter, und fügen Sie die relevanten Konfigurationsdateien mit dem folgenden Codebeispiel hinzu. Weitere Informationen finden Sie unter HDFS-Connector für Object Storage.
wget https://github.com/oracle/oci-hdfs-connector/releases/download/v2.9.2.1/oci-hdfs.zip
unzip oci-hdfs.zip -d oci-hdfs
cd $HOME
mkdir .oci
# Create or copy your API key into the $HOME/.oci directory
cd $SPARK_HOME/conf
# Create a core-site.xml (e.g. by transferring one you have, using vi etc.). Consult
# https://docs.oracle.com/iaas/Content/API/SDKDocs/hdfsconnector.htm#Properties
# for what this should look like
# Create a spark-defaults.conf file from the template
cp spark-defaults.conf.template spark-defaults.conf
Fügen Sie am Ende der Datei spark-defaults.conf Folgendes hinzu:
spark.sql.hive.metastore.sharedPrefixes= shaded.oracle,com.oracle.bmc
Daten vorbereiten
Für das Testen von Daten wird das MovieLens-Dataset verwendet.
- Laden Sie das neueste Dataset unter https://grouplens.org/datasets/movielens/latest/ herunter. Laden Sie unbedingt das "kleine" Dataset herunter.
- Extrahieren Sie die heruntergeladene Datei.
- Laden Sie die Datei
movies.csvin den Object Storage-Bucket herunter.
Test mit Spark-Shell durchführen
Mit den Daten kann jetzt die Spark-Shell gestartet und mit einem Beispielbefehl getestet werden:
cd $SPARK_HOME
./bin/spark-shell
scala> sc.wholeTextFiles("oci://PipedUploadTest@sampletenancy/")
java.io.IOException: No FileSystem for scheme: oci
An dieser Stelle wird eine Fehlermeldung angezeigt, da das Dateisystemschema oci:// nicht verfügbar ist. Sie müssen die JAR-Datei referenzieren, bevor Sie die Spark-Shell starten. Beispiel:
./bin/spark-shell --jars $HOME/oci-hdfs/lib/oci-hdfs-full-1.2.7.jar --driver-class-path $HOME/oci-hdfs/lib/oci-hdfs-full-1.2.7.jar
scala> sc.wholeTextFiles("oci://PipedUploadTest@sampletenancy/")
res0: org.apache.spark.rdd.RDD[(String, String)] = oci://PipedUploadTest@sampletenancy/ MapPartitionsRDD[1] at wholeTextFiles at <console>:25
scala> sc.textFile("oci://PipedUploadTest@sampletenancy/movies.csv").take(20).foreach(println)
movieId,title,genres
1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasy
2,Jumanji (1995),Adventure|Children|Fantasy
3,Grumpier Old Men (1995),Comedy|Romance
4,Waiting to Exhale (1995),Comedy|Drama|Romance
5,Father of the Bride Part II (1995),Comedy
6,Heat (1995),Action|Crime|Thriller
7,Sabrina (1995),Comedy|Romance
8,Tom and Huck (1995),Adventure|Children
9,Sudden Death (1995),Action
10,GoldenEye (1995),Action|Adventure|Thriller
11,"American President, The (1995)",Comedy|Drama|Romance
12,Dracula: Dead and Loving It (1995),Comedy|Horror
13,Balto (1995),Adventure|Animation|Children
14,Nixon (1995),Drama
15,Cutthroat Island (1995),Action|Adventure|Romance
16,Casino (1995),Crime|Drama
17,Sense and Sensibility (1995),Drama|Romance
18,Four Rooms (1995),Comedy
19,Ace Ventura: When Nature Calls (1995),Comedy
Der Befehl ist erfolgreich, sodass eine Verbindung zu Object Storage möglich ist. Wenn Sie das Argument --jars nicht bei jeder Ausführung des Befehls übergeben möchten, können Sie stattdessen die JAR-Datei oci-hdfs-full in das Verzeichnis $SPARK_HOME/jars kopieren.
Spark Thrift-Server starten
Starten Sie den Spark Thrift-Server auf Port 10015, und verwenden Sie das Beeline-Befehlszeilentool, um eine JDBC-Verbindung herzustellen und dann eine allgemeine Abfrage auszuführen, wie hier dargestellt:
cd $SPARK_HOME
./sbin/start-thriftserver.sh --hiveconf hive.server2.thrift.port=10015
Sobald der Spark-Server ausgeführt wird, kann Beeline gestartet werden, wie hier gezeigt:
cd $SPARK_HOME
./bin/beeline
Beeline version 1.2.1.spark2 by Apache Hive
beeline>
Stellen Sie als Nächstes eine Verbindung zum Server her, wie hier dargestellt:
Für dieses Beispiel wurde keine Sicherheit konfiguriert, sodass alle Benutzernamen und Kennwörter akzeptiert werden. Dies ist bei Produktionsszenarien nicht der Fall.
beeline> !connect jdbc:hive2://localhost:10015 testuser testpass
Connecting to jdbc:hive2://localhost:10015
log4j:WARN No appenders could be found for logger (org.apache.hive.jdbc.Utils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Connected to: Spark SQL (version 2.2.1)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10015>
Bei einer Abfrage der vorhandenen Tabellen wird jetzt Folgendes angezeigt:
0: jdbc:hive2://localhost:10015> show tables;
+-----------+------------+--------------+--+
| database | tableName | isTemporary |
+-----------+------------+--------------+--+
+-----------+------------+--------------+--+
No rows selected (0.724 seconds)
Aktuell sind keine Tabellen vorhanden. Sie können jedoch eine Tabelle erstellen und mit der Datei movies.csv verknüpfen, die Sie heruntergeladen und im Objektspeicher-Bucket gespeichert haben, wie hier dargestellt:
0: jdbc:hive2://localhost:10015> create table test_table (movieId integer, title string, genres string) using csv options (path "oci://myBucket@myTenant/movies.csv", header "true", delimiter ",");
0: jdbc:hive2://localhost:10015> describe formatted test_table;
+-------------------------------+------------------------------------------------------------+----------+--+
| col_name | data_type | comment |
+-------------------------------+------------------------------------------------------------+----------+--+
| movieId | int | NULL |
| title | string | NULL |
| genres | string | NULL |
| | | |
| # Detailed Table Information | | |
| Database | default | |
| Table | test_table | |
| Owner | opc | |
| Created | Thu Mar 01 20:45:18 GMT 2018 | |
| Last Access | Thu Jan 01 00:00:00 GMT 1970 | |
| Type | EXTERNAL | |
| Provider | csv | |
| Table Properties | [transient_lastDdlTime=1519937118] | |
| Location | oci://PipedUploadTest@sampletenancy/movies.csv | |
| Serde Library | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe | |
| InputFormat | org.apache.hadoop.mapred.SequenceFileInputFormat | |
| OutputFormat | org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat | |
| Storage Properties | [delimiter=,, header=true, serialization.format=1] | |
+-------------------------------+------------------------------------------------------------+----------+--+
Beachten Sie, dass die Daten der Tabelle extern in Object Storage gespeichert werden und dass mit dem HDFS-Connector (Dateisystemschema oci://) auf die Daten zugegriffen werden kann. Jetzt ist eine Tabelle vorhanden, die sich abfragen lässt:
0: jdbc:hive2://localhost:10015> select * from test_table limit 10;
+----------+-------------------------------------+----------------------------------------------+--+
| movieId | title | genres |
+----------+-------------------------------------+----------------------------------------------+--+
| 1 | Toy Story (1995) | Adventure|Animation|Children|Comedy|Fantasy |
| 2 | Jumanji (1995) | Adventure|Children|Fantasy |
| 3 | Grumpier Old Men (1995) | Comedy|Romance |
| 4 | Waiting to Exhale (1995) | Comedy|Drama|Romance |
| 5 | Father of the Bride Part II (1995) | Comedy |
| 6 | Heat (1995) | Action|Crime|Thriller |
| 7 | Sabrina (1995) | Comedy|Romance |
| 8 | Tom and Huck (1995) | Adventure|Children |
| 9 | Sudden Death (1995) | Action |
| 10 | GoldenEye (1995) | Action|Adventure|Thriller |
+----------+-------------------------------------+----------------------------------------------+--+