PostgreSQL är välkänt som den mest avancerade opensource-databasen, och den hjälper dig att hantera din data oavsett hur stor, liten eller annorlunda datamängden är, så att du kan använda den för att hantera eller analysera din stora data, och naturligtvis finns det flera sätt att göra detta möjligt, t.ex. Apache Spark. I den här bloggen kommer vi att se vad Apache Spark är och hur vi kan använda det för att arbeta med vår PostgreSQL-databas.
För big data-analys har vi två olika typer av analys:
- Batchanalys:Baserat på data som samlats in under en tidsperiod.
- Realtidsanalys (ström):Baserat på omedelbar data för ett omedelbart resultat.
Vad är Apache Spark?
Apache Spark är en enhetlig analysmotor för storskalig databehandling som kan arbeta med både batch- och realtidsanalys på ett snabbare och enklare sätt.
Den tillhandahåller API:er på hög nivå i Java, Scala, Python och R, och en optimerad motor som stöder allmänna exekveringsdiagram.
Apache Spark-komponenterApache Spark Libraries
Apache Spark innehåller olika bibliotek:
- Spark SQL:Det är en modul för att arbeta med strukturerad data med SQL eller ett DataFrame API. Det ger ett vanligt sätt att komma åt en mängd olika datakällor, inklusive Hive, Avro, Parquet, ORC, JSON och JDBC. Du kan till och med slå samman data från dessa källor.
- Spark Streaming:Det gör det enkelt att bygga skalbara feltoleranta strömningsapplikationer med hjälp av ett språkintegrerat API för att strömma bearbetning, vilket låter dig skriva strömmande jobb på samma sätt som du skriver batch-jobb. Den stöder Java, Scala och Python. Spark Streaming återställer både förlorat arbete och operatörstillstånd ur lådan, utan någon extra kod från din sida. Det låter dig återanvända samma kod för batchbearbetning, sammanfoga strömmar mot historisk data eller köra ad-hoc-frågor i strömtillstånd.
- MLib (Machine Learning):Det är ett skalbart maskininlärningsbibliotek. MLlib innehåller högkvalitativa algoritmer som utnyttjar iteration och kan ge bättre resultat än de engångsuppskattningar som ibland används på MapReduce.
- GraphX:Det är ett API för grafer och grafparallella beräkningar. GraphX förenar ETL, utforskande analys och iterativ grafberäkning i ett enda system. Du kan visa samma data som både grafer och samlingar, transformera och sammanfoga grafer med RDD:er effektivt och skriva anpassade iterativa grafalgoritmer med Pregel API.
Apache Spark-fördelar
Enligt den officiella dokumentationen är några fördelar med Apache Spark:
- Hastighet:Kör arbetsbelastningar 100 gånger snabbare. Apache Spark uppnår hög prestanda för både batch- och strömmande data, med hjälp av en toppmodern DAG-schemaläggare (Direct Acyclic Graph), en frågeoptimerare och en fysisk exekveringsmotor.
- Användarvänlighet:Skriv applikationer snabbt i Java, Scala, Python, R och SQL. Spark erbjuder över 80 operatörer på hög nivå som gör det enkelt att bygga parallella appar. Du kan använda det interaktivt från skalen Scala, Python, R och SQL.
- Allmänhet:Kombinera SQL, streaming och komplexa analyser. Spark driver en stapel av bibliotek inklusive SQL och DataFrames, MLlib för maskininlärning, GraphX och Spark Streaming. Du kan kombinera dessa bibliotek sömlöst i samma applikation.
- Körs överallt:Spark körs på Hadoop, Apache Mesos, Kubernetes, fristående eller i molnet. Den kan komma åt olika datakällor. Du kan köra Spark med sitt fristående klusterläge, på EC2, på Hadoop YARN, på Mesos eller på Kubernetes. Få åtkomst till data i HDFS, Alluxio, Apache Cassandra, Apache HBase, Apache Hive och hundratals andra datakällor.
Låt oss nu se hur vi kan integrera detta med vår PostgreSQL-databas.
Hur man använder Apache Spark med PostgreSQL
Vi antar att du har ditt PostgreSQL-kluster igång. För den här uppgiften använder vi en PostgreSQL 11-server som körs på CentOS7.
Låt oss först skapa vår testdatabas på vår PostgreSQL-server:
postgres=# CREATE DATABASE testing;
CREATE DATABASE
postgres=# \c testing
You are now connected to database "testing" as user "postgres".
Nu ska vi skapa en tabell som heter t1:
testing=# CREATE TABLE t1 (id int, name text);
CREATE TABLE
Och infoga lite data där:
testing=# INSERT INTO t1 VALUES (1,'name1');
INSERT 0 1
testing=# INSERT INTO t1 VALUES (2,'name2');
INSERT 0 1
Kontrollera data som skapats:
testing=# SELECT * FROM t1;
id | name
----+-------
1 | name1
2 | name2
(2 rows)
För att ansluta Apache Spark till vår PostgreSQL-databas använder vi en JDBC-anslutare. Du kan ladda ner den härifrån.
$ wget https://jdbc.postgresql.org/download/postgresql-42.2.6.jar
Nu, låt oss installera Apache Spark. För detta måste vi ladda ner sparkpaketen härifrån.
$ wget http://us.mirrors.quenda.co/apache/spark/spark-2.4.3/spark-2.4.3-bin-hadoop2.7.tgz
$ tar zxvf spark-2.4.3-bin-hadoop2.7.tgz
$ cd spark-2.4.3-bin-hadoop2.7/
För att köra Spark-skalet behöver vi JAVA installerat på vår server:
$ yum install java
Så nu kan vi köra vårt Spark Shell:
$ ./bin/spark-shell
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://ApacheSpark1:4040
Spark context available as 'sc' (master = local[*], app id = local-1563907528854).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.3
/_/
Using Scala version 2.11.12 (OpenJDK 64-Bit Server VM, Java 1.8.0_212)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
Vi kan komma åt vårt Spark context Web UI tillgängligt i port 4040 på vår server:
Apache Spark UII Spark-skalet måste vi lägga till PostgreSQL JDBC-drivrutinen:
scala> :require /path/to/postgresql-42.2.6.jar
Added '/path/to/postgresql-42.2.6.jar' to classpath.
scala> import java.util.Properties
import java.util.Properties
Och lägg till JDBC-informationen som ska användas av Spark:
scala> val url = "jdbc:postgresql://localhost:5432/testing"
url: String = jdbc:postgresql://localhost:5432/testing
scala> val connectionProperties = new Properties()
connectionProperties: java.util.Properties = {}
scala> connectionProperties.setProperty("Driver", "org.postgresql.Driver")
res6: Object = null
Nu kan vi köra SQL-frågor. Låt oss först definiera fråga1 som SELECT * FROM t1, vår testtabell.
scala> val query1 = "(SELECT * FROM t1) as q1"
query1: String = (SELECT * FROM t1) as q1
Och skapa DataFrame:
scala> val query1df = spark.read.jdbc(url, query1, connectionProperties)
query1df: org.apache.spark.sql.DataFrame = [id: int, name: string]
Så nu kan vi utföra en åtgärd över denna DataFrame:
scala> query1df.show()
+---+-----+
| id| name|
+---+-----+
| 1|name1|
| 2|name2|
+---+-----+
scala> query1df.explain
== Physical Plan ==
*(1) Scan JDBCRelation((SELECT * FROM t1) as q1) [numPartitions=1] [id#19,name#20] PushedFilters: [], ReadSchema: struct<id:int,name:string>
Vi kan lägga till fler värden och köra det igen bara för att bekräfta att det returnerar de nuvarande värdena.
PostgreSQL
testing=# INSERT INTO t1 VALUES (10,'name10'), (11,'name11'), (12,'name12'), (13,'name13'), (14,'name14'), (15,'name15');
INSERT 0 6
testing=# SELECT * FROM t1;
id | name
----+--------
1 | name1
2 | name2
10 | name10
11 | name11
12 | name12
13 | name13
14 | name14
15 | name15
(8 rows)
Gnista
scala> query1df.show()
+---+------+
| id| name|
+---+------+
| 1| name1|
| 2| name2|
| 10|name10|
| 11|name11|
| 12|name12|
| 13|name13|
| 14|name14|
| 15|name15|
+---+------+
I vårt exempel visar vi bara hur Apache Spark fungerar med vår PostgreSQL-databas, inte hur den hanterar vår Big Data-information.
Slutsats
Nuförtiden är det ganska vanligt att ha utmaningen att hantera big data i ett företag, och som vi kunde se kan vi använda Apache Spark för att klara av det och använda alla funktioner som vi nämnde tidigare. Big data är en enorm värld, så du kan kontrollera den officiella dokumentationen för mer information om användningen av Apache Spark och PostgreSQL och anpassa den efter dina krav.