PostgreSQL nổi tiếng là cơ sở dữ liệu mã nguồn mở tiên tiến nhất và nó giúp bạn quản lý dữ liệu của mình bất kể tập dữ liệu lớn, nhỏ hay khác nhau như thế nào, vì vậy bạn có thể sử dụng nó để quản lý hoặc phân tích dữ liệu lớn của mình, và tất nhiên, có một số cách để biến điều này thành khả thi, ví dụ:Apache Spark. Trong blog này, chúng ta sẽ xem Apache Spark là gì và cách chúng ta có thể sử dụng nó để làm việc với cơ sở dữ liệu PostgreSQL của chúng ta.
Đối với phân tích dữ liệu lớn, chúng tôi có hai loại phân tích khác nhau:
- Phân tích hàng loạt:Dựa trên dữ liệu được thu thập trong một khoảng thời gian.
- Phân tích theo thời gian thực (luồng):Dựa trên dữ liệu tức thì để có kết quả tức thì.
Apache Spark là gì?
Apache Spark là một công cụ phân tích hợp nhất để xử lý dữ liệu quy mô lớn có thể hoạt động trên cả phân tích hàng loạt và thời gian thực một cách nhanh hơn và dễ dàng hơn.
Nó cung cấp các API cấp cao bằng Java, Scala, Python và R và một công cụ được tối ưu hóa hỗ trợ các biểu đồ thực thi chung.
Thành phần Apache SparkThư viện Apache Spark
Apache Spark bao gồm các thư viện khác nhau:
- Spark SQL:Đây là một mô-đun để làm việc với dữ liệu có cấu trúc bằng cách sử dụng SQL hoặc API DataFrame. Nó cung cấp một cách phổ biến để truy cập nhiều nguồn dữ liệu, bao gồm Hive, Avro, Parquet, ORC, JSON và JDBC. Bạn thậm chí có thể kết hợp dữ liệu trên các nguồn này.
- Spark Streaming:Giúp dễ dàng xây dựng các ứng dụng phát trực tuyến có khả năng chịu lỗi có thể mở rộng bằng cách sử dụng API tích hợp ngôn ngữ để xử lý luồng, cho phép bạn viết các công việc phát trực tuyến giống như cách bạn viết các công việc hàng loạt. Nó hỗ trợ Java, Scala và Python. Spark Streaming khôi phục cả trạng thái công việc và nhà điều hành đã mất mà không cần bất kỳ mã bổ sung nào từ phía bạn. Nó cho phép bạn sử dụng lại cùng một mã để xử lý hàng loạt, tham gia các luồng dựa trên dữ liệu lịch sử hoặc chạy các truy vấn đặc biệt trên trạng thái luồng.
- MLib (Máy học):Đây là một thư viện máy học có thể mở rộng. MLlib chứa các thuật toán chất lượng cao tận dụng sự lặp lại và có thể mang lại kết quả tốt hơn so với phép tính gần đúng một lần đôi khi được sử dụng trên MapReduce.
- GraphX:Đây là một API dành cho đồ thị và tính toán song song đồ thị. GraphX hợp nhất ETL, phân tích khám phá và tính toán đồ thị lặp lại trong một hệ thống duy nhất. Bạn có thể xem cùng một dữ liệu dưới dạng cả biểu đồ và tập hợp, biến đổi và kết hợp các biểu đồ với RDD một cách hiệu quả và viết các thuật toán biểu đồ lặp lại tùy chỉnh bằng cách sử dụng API Pregel.
Ưu điểm của Apache Spark
Theo tài liệu chính thức, một số ưu điểm của Apache Spark là:
- Tốc độ:Chạy khối lượng công việc nhanh hơn 100 lần. Apache Spark đạt được hiệu suất cao cho cả dữ liệu hàng loạt và dữ liệu truyền trực tuyến, sử dụng công cụ lập lịch DAG (Đồ thị vòng tròn trực tiếp) hiện đại, công cụ tối ưu hóa truy vấn và công cụ thực thi vật lý.
- Dễ sử dụng:Viết ứng dụng nhanh chóng bằng Java, Scala, Python, R và SQL. Spark cung cấp hơn 80 nhà khai thác cấp cao giúp dễ dàng xây dựng các ứng dụng song song. Bạn có thể sử dụng nó một cách tương tác từ các shell Scala, Python, R và SQL.
- Tính tổng quát:Kết hợp SQL, phân tích luồng và phân tích phức tạp. Spark cung cấp một đống thư viện bao gồm SQL và DataFrames, MLlib cho máy học, GraphX và Spark Streaming. Bạn có thể kết hợp các thư viện này một cách liền mạch trong cùng một ứng dụng.
- Chạy mọi nơi:Spark chạy trên Hadoop, Apache Mesos, Kubernetes, độc lập hoặc trên đám mây. Nó có thể truy cập các nguồn dữ liệu đa dạng. Bạn có thể chạy Spark bằng chế độ cụm độc lập của nó, trên EC2, trên Hadoop YARN, trên Mesos hoặc trên Kubernetes. Truy cập dữ liệu trong HDFS, Alluxio, Apache Cassandra, Apache HBase, Apache Hive và hàng trăm nguồn dữ liệu khác.
Bây giờ, hãy xem cách chúng tôi có thể tích hợp điều này với cơ sở dữ liệu PostgreSQL của chúng tôi.
Cách sử dụng Apache Spark với PostgreSQL
Chúng tôi sẽ cho rằng bạn đã thiết lập và chạy cụm PostgreSQL của mình. Đối với tác vụ này, chúng tôi sẽ sử dụng máy chủ PostgreSQL 11 chạy trên CentOS7.
Trước tiên, hãy tạo cơ sở dữ liệu thử nghiệm của chúng tôi trên máy chủ PostgreSQL của chúng tôi:
postgres=# CREATE DATABASE testing;
CREATE DATABASE
postgres=# \c testing
You are now connected to database "testing" as user "postgres".
Bây giờ, chúng ta sẽ tạo một bảng có tên là t1:
testing=# CREATE TABLE t1 (id int, name text);
CREATE TABLE
Và chèn một số dữ liệu vào đó:
testing=# INSERT INTO t1 VALUES (1,'name1');
INSERT 0 1
testing=# INSERT INTO t1 VALUES (2,'name2');
INSERT 0 1
Kiểm tra dữ liệu đã tạo:
testing=# SELECT * FROM t1;
id | name
----+-------
1 | name1
2 | name2
(2 rows)
Để kết nối Apache Spark với cơ sở dữ liệu PostgreSQL của chúng tôi, chúng tôi sẽ sử dụng trình kết nối JDBC. Bạn có thể tải xuống từ đây.
$ wget https://jdbc.postgresql.org/download/postgresql-42.2.6.jar
Bây giờ, hãy cài đặt Apache Spark. Đối với điều này, chúng tôi cần tải xuống các gói tia lửa từ đây.
$ 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/
Để chạy Spark shell, chúng tôi cần cài đặt JAVA trên máy chủ của mình:
$ yum install java
Vì vậy, bây giờ, chúng ta có thể chạy Spark Shell của mình:
$ ./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>
Chúng tôi có thể truy cập giao diện người dùng Web ngữ cảnh Spark của chúng tôi có sẵn trong cổng 4040 trên máy chủ của chúng tôi:
Giao diện người dùng Apache SparkTrong Spark shell, chúng ta cần thêm trình điều khiển PostgreSQL JDBC:
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
Và thêm thông tin JDBC sẽ được Spark sử dụng:
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
Bây giờ, chúng ta có thể thực thi các truy vấn SQL. Đầu tiên, hãy xác định query1 là SELECT * FROM t1, bảng thử nghiệm của chúng tôi.
scala> val query1 = "(SELECT * FROM t1) as q1"
query1: String = (SELECT * FROM t1) as q1
Và tạo DataFrame:
scala> val query1df = spark.read.jdbc(url, query1, connectionProperties)
query1df: org.apache.spark.sql.DataFrame = [id: int, name: string]
Vì vậy, bây giờ, chúng tôi có thể thực hiện một hành động trên DataFrame này:
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>
Chúng tôi có thể thêm nhiều giá trị hơn và chạy lại chỉ để xác nhận rằng nó đang trả về các giá trị hiện tại.
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)
Tia lửa
scala> query1df.show()
+---+------+
| id| name|
+---+------+
| 1| name1|
| 2| name2|
| 10|name10|
| 11|name11|
| 12|name12|
| 13|name13|
| 14|name14|
| 15|name15|
+---+------+
Trong ví dụ của chúng tôi, chúng tôi chỉ hiển thị cách Apache Spark hoạt động với cơ sở dữ liệu PostgreSQL của chúng tôi, chứ không phải cách nó quản lý thông tin Dữ liệu lớn của chúng tôi.
Kết luận
Ngày nay, thách thức quản lý dữ liệu lớn trong một công ty khá phổ biến và như chúng ta có thể thấy, chúng ta có thể sử dụng Apache Spark để đối phó và tận dụng tất cả các tính năng mà chúng tôi đã đề cập trước đó. Dữ liệu lớn là một thế giới khổng lồ, vì vậy bạn có thể kiểm tra tài liệu chính thức để biết thêm thông tin về cách sử dụng Apache Spark và PostgreSQL và phù hợp với yêu cầu của bạn.