PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Big Data com PostgreSQL e Apache Spark


O PostgreSQL é conhecido como o banco de dados de código aberto mais avançado e ajuda você a gerenciar seus dados, não importa quão grande, pequeno ou diferente seja o conjunto de dados, para que você possa usá-lo para gerenciar ou analisar seus grandes dados e, claro, existem várias maneiras de tornar isso possível, por exemplo, Apache Spark. Neste blog, veremos o que é o Apache Spark e como podemos usá-lo para trabalhar com nosso banco de dados PostgreSQL.



Para análise de big data, temos dois tipos diferentes de análise:


  • Análise de lote:com base nos dados coletados durante um período de tempo.
  • Análise em tempo real (stream):com base em dados imediatos para um resultado instantâneo.

O que é Apache Spark?


O Apache Spark é um mecanismo de análise unificado para processamento de dados em larga escala que pode funcionar em análises em lote e em tempo real de maneira mais rápida e fácil.

Ele fornece APIs de alto nível em Java, Scala, Python e R e um mecanismo otimizado que suporta gráficos de execução geral.
Componentes do Apache Spark

Bibliotecas do Apache Spark


O Apache Spark inclui diferentes bibliotecas:
  • Spark SQL:é um módulo para trabalhar com dados estruturados usando SQL ou uma API DataFrame. Ele fornece uma maneira comum de acessar uma variedade de fontes de dados, incluindo Hive, Avro, Parquet, ORC, JSON e JDBC. Você pode até mesmo juntar dados entre essas fontes.
  • Spark Streaming:facilita a criação de aplicativos de streaming escalonáveis ​​e tolerantes a falhas usando uma API integrada à linguagem para processamento de streaming, permitindo que você escreva trabalhos de streaming da mesma forma que escreve trabalhos em lote. Ele suporta Java, Scala e Python. O Spark Streaming recupera o trabalho perdido e o estado do operador imediatamente, sem nenhum código extra de sua parte. Ele permite que você reutilize o mesmo código para processamento em lote, junte fluxos em relação a dados históricos ou execute consultas ad-hoc no estado do fluxo.
  • MLib (Machine Learning):é uma biblioteca de aprendizado de máquina escalável. O MLlib contém algoritmos de alta qualidade que aproveitam a iteração e podem gerar resultados melhores do que as aproximações de uma passagem às vezes usadas no MapReduce.
  • GraphX:é uma API para gráficos e computação paralela a gráficos. O GraphX ​​unifica ETL, análise exploratória e computação gráfica iterativa em um único sistema. Você pode visualizar os mesmos dados como gráficos e coleções, transformar e unir gráficos com RDDs com eficiência e escrever algoritmos de gráficos iterativos personalizados usando a API Pregel.

Vantagens do Apache Spark


De acordo com a documentação oficial, algumas vantagens do Apache Spark são:
  • Velocidade:execute cargas de trabalho 100 vezes mais rápido. O Apache Spark alcança alto desempenho para dados em lote e streaming, usando um agendador DAG (Direct Acyclic Graph) de última geração, um otimizador de consulta e um mecanismo de execução física.
  • Facilidade de uso:escreva aplicativos rapidamente em Java, Scala, Python, R e SQL. O Spark oferece mais de 80 operadores de alto nível que facilitam a criação de aplicativos paralelos. Você pode usá-lo interativamente nos shells Scala, Python, R e SQL.
  • Generalidade:combine SQL, streaming e análises complexas. O Spark alimenta uma pilha de bibliotecas, incluindo SQL e DataFrames, MLlib para aprendizado de máquina, GraphX ​​e Spark Streaming. Você pode combinar essas bibliotecas perfeitamente no mesmo aplicativo.
  • Executado em todos os lugares:o Spark é executado no Hadoop, Apache Mesos, Kubernetes, autônomo ou na nuvem. Ele pode acessar diversas fontes de dados. Você pode executar o Spark usando seu modo de cluster autônomo, no EC2, no Hadoop YARN, no Mesos ou no Kubernetes. Acesse dados em HDFS, Alluxio, Apache Cassandra, Apache HBase, Apache Hive e centenas de outras fontes de dados.

Agora, vamos ver como podemos integrar isso com nosso banco de dados PostgreSQL.

Como usar o Apache Spark com PostgreSQL


Vamos supor que você tenha seu cluster PostgreSQL instalado e funcionando. Para esta tarefa, usaremos um servidor PostgreSQL 11 rodando no CentOS7.

Primeiro, vamos criar nosso banco de dados de teste em nosso servidor PostgreSQL:
postgres=# CREATE DATABASE testing;
CREATE DATABASE
postgres=# \c testing
You are now connected to database "testing" as user "postgres".

Agora, vamos criar uma tabela chamada t1:
testing=# CREATE TABLE t1 (id int, name text);
CREATE TABLE

E insira alguns dados lá:
testing=# INSERT INTO t1 VALUES (1,'name1');
INSERT 0 1
testing=# INSERT INTO t1 VALUES (2,'name2');
INSERT 0 1

Verifique os dados criados:
testing=# SELECT * FROM t1;
 id | name
----+-------
  1 | name1
  2 | name2
(2 rows)

Para conectar o Apache Spark ao nosso banco de dados PostgreSQL, usaremos um conector JDBC. Você pode baixá-lo aqui.
$ wget https://jdbc.postgresql.org/download/postgresql-42.2.6.jar

Agora, vamos instalar o Apache Spark. Para isso, precisamos baixar os pacotes spark aqui.
$ 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/

Para executar o Spark shell, precisaremos do JAVA instalado em nosso servidor:
$  yum install java

Então agora, podemos executar nosso 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>

Podemos acessar nossa interface da Web de contexto do Spark disponível na porta 4040 em nosso servidor:
Apache Spark UI
No shell do Spark, precisamos adicionar o driver JDBC do PostgreSQL:
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

E adicione as informações JDBC a serem usadas pelo 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

Agora, podemos executar consultas SQL. Primeiro, vamos definir query1 como SELECT * FROM t1, nossa tabela de teste.
scala> val query1 = "(SELECT * FROM t1) as q1"
query1: String = (SELECT * FROM t1) as q1

E crie o DataFrame:
scala> val query1df = spark.read.jdbc(url, query1, connectionProperties)
query1df: org.apache.spark.sql.DataFrame = [id: int, name: string]

Então agora, podemos executar uma ação sobre este 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>

Podemos adicionar mais valores e executá-lo novamente apenas para confirmar que está retornando os valores atuais.

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)

Fagulha
scala> query1df.show()
+---+------+
| id|  name|
+---+------+
|  1| name1|
|  2| name2|
| 10|name10|
| 11|name11|
| 12|name12|
| 13|name13|
| 14|name14|
| 15|name15|
+---+------+

Em nosso exemplo, estamos mostrando apenas como o Apache Spark funciona com nosso banco de dados PostgreSQL, não como ele gerencia nossas informações de Big Data.

Conclusão


Hoje em dia, é muito comum ter o desafio de gerenciar big data em uma empresa e, como pudemos ver, podemos usar o Apache Spark para lidar com isso e fazer uso de todos os recursos que mencionamos anteriormente. O big data é um mundo enorme, então você pode verificar a documentação oficial para obter mais informações sobre o uso do Apache Spark e PostgreSQL e adequá-lo aos seus requisitos.