greenplum/info

发布 : 2019-10-14 浏览 :

 Greenplum介绍

简介

   Greenplum数据引擎是为了支持新一代数据仓库和分析处理大规模数据而建立的软件解决 方案。Greenplum支持SQL和MapReduce的并行处理功能,并能以较低的成本向管;理TB量到PB量级数据的企业提供业界领先的性能。 它可以支持数据查询,机器学习,文本挖掘,统计计算等 。 世界上最强大的MPP架构分析数据库。Greenplum总的来看就是一粘合剂,以postgreSql为底层存储和依托,以SQL的函数形态为接口表现形式,把各场景各领域统一集成到一起,形成一个1+1>2的良好生态。

Greenplum PL/Java Language Extension(PL/Java扩展)

  Greenplum是用C实现的db,但我们可能通过PL/Java扩展,使用自己喜欢的Java IDE编写Java方法,并将包含这些方法的JJAR文件安装到Greenplum数据库中。java与Greenplum是通过JNI进行交互。 通过JAVA可以实现如下功能:

  • 能够使用Java 1.7或更高版本执行PL/Java函数。
  • 能够指定Java运行时间。
  • 在数据库中安装和维护Java代码的标准化实用程序(在SQL 2003提案之后设计)
  • 参数和结果的标准化映射。支持复杂类型集。
  • 使用Greenplum数据库内部SPI例程的嵌入式高性能JDBC驱动程序
  • 元数据支持JDBC驱动程序。 包括 DatabaseMetaData 和ResultSetMetaData。
  • 能够从查询中返回ResultSet,作为逐行构建ResultSet的替代方法。
  • 完全支持保留点和异常处理。
  • 能够使用IN,INPUT和OUT参数。
  • 两种独立的Greenplum数据库语言:

    • pljava, TRUSTED PL/Java language
    • pljavau, UNTRUSTED PL/Java language
  • 当一个事务或者保留点提交或者回滚时,事务和保留点监听器能够被编译执行。
  • 在所选平台上与GNU GCJ集成。

讨论:PL/Java使用场景

我理解可以在下面场景做些加强:

  • 可以通过JDBC返回结果集,对于复杂的权限定义很有用处。
  • 定义原始数据的处理函数,也就可以自定义数据格式。
  • 格式化输入、输出
  • 触发器,对于字典表同步缓存意义重大,类似于binlog监听功能
  • 大数据量的检查(如一次查询超过100行就拒绝,防止倒卖数据等)
  • 像Madlib类似,做自己的服务生态,像redash一样,把数据模型建成一个函数,输入参数就能出报表。不需要那么多SQL。

Greenplum MADlib Extension for Analytics

通过函数来进行机器学机,Greenplum MADlib Extension主要的工作是提供了许多的函数。

从python下面三层都是madlib提供的东西。

矩阵支持稠密矩阵,也支持稀疏矩阵。

支持的功能有:监督学习,Neural Network, SVM, regression, decision tree;非监督学习,支持clustering,topic modeling等;图形处理,我们支持apsp, bfs等等。

另外还有时间序列处理,模型选择,基本统计和数据类型转换。到目前为止我们支持了超过50种算法,是一个复杂而成熟的数据科学学习库,能够支持各种复杂的机器学习场景。

MADlib特性

  • 更好的并行度。我们在算法设计阶段就充分考虑了与大规模并行处理系统,基于不同的算法,设计不同的分布方式来保证更快的并行处理速度。
  • 更好的可扩展性。随着数据量的增长,我们的扩展性非常稳定。
  • 更高的预测精度。处理大数据使得更多有效数据被利用,从而实现更加精确的预测效果。
  • 我们是Apache ASF上的顶级开源项目,我们的开发是在Pivotal的支持下基于Apache community的,与社区有非常好的互动。

机器学习讨论:

  • 建模

  • 预测,可以不用导数据。

  • 数据分析

Greenplum Text Extension(GPText文本分析)

GPText一言概括,就是使用Solr Cloud的SQL形式客户端。它有大量操作Solr Cloud的函数,这样就可以以SQL的形式直接操作Solr Cloud。GPText以下列顺序进行处理:数据提取->文本处理和索引->全文索引->分析

数据提取:GPText支持多种文件格式的文本提取(网页、社交记录、邮件、病例、保单、日志、富文本文档甚至是图片等。)。支持的数据源有:HDFS、FTP、HTTP、S3。等,用户通过GPText提供的函数去相关数据源提取到GPText中。

文本处理、索引流程、高阶分析:

在处理过程中,需要进行分词,如识别特殊含义词(URL、Email)、添加同义词、过滤停用词、处理多语言等。文本处理的目的是要把自然语言转换为计算机可以理解并处理的结构。只有能准确做好了文本处理,才能为为后续的索引与分析提供可靠的加工“源材料”。

特定类型的文档,其格式可能不同,如日志中的特殊标识,社交中的表情符、xml中的标签 等,在文本处理中需要正确标注和过滤,甚至做一些附属属性后才能正确高效地处理。

一个文档,首先通过分词器切割为一个个能处理的词,然后经过多种类型的过滤器串行处理,比如过滤一些语气助词。经过一系列过滤器处理的词以倒排索引的结构存储,用于后续的查询、分析等功能。

GPText还支持Facet查询、临近查询、命名实体查询。

Lucene更多的是一个软件包,还不能称之为搜索引擎

内存全文检索引擎:Solr Cloud 它与ES的区别: https://www.cnblogs.com/xiaoqi/p/6545314.html

Collection 就是逻辑上的索引、 Share是Collection的逻辑分片就是分区,

ES与cassandra一样使用流言协议,而 Solr Cloud则使用Zookeeper提供分布式锁功能,而Solr则通过配置文件配置,单机版。

GPText创建索引四个步骤:

1、创建表并加载需要索引的数据

2、通过GPText提供的UDF创建GPText索引

3、通过GPText提供的UDF加载索引。并行处理,每个Segment会加载到对应shard的主副本中,由主副本复制到从副本

4、通过GPText提供的UDF提交索引,使之前加载的数据对处可以查询。

通过以上就完成了数据导入索引的过程。然后用户就可以通过GPText提供的UDF以SQL的形式使用索引数据了。

思考Solr与ES的取舍(讨论):

1、如同软件架构就应该讲究高内聚,低耦合。像数据库、搜索引擎两种资源大户就应该分开,避免互相影响。就是OLTP与OLAP系统使用的库要分开一个道理,要合在一起的好处就是一份数据,简单。

2、数据同步:真实数据源以kafka为数据总线,分也就是加个监听入库的步骤而以,并不复杂。

3、公司选用ES做搜索引擎,也有部署,直接使用也是水到渠成的事情。且Solr Cloud 所支持的功能在ES上都能找到。

4、GPText如果与Madlib结合可以取得较好的优势,绝对是1+1>2的。它们都是以Greenplum的函数提供服务,也就统一了接口,都被纳入到SQL这一粘合剂下面。

Greenplum Fuzzy String Match Extension

Greenplum数据库模糊字符串匹配扩展提供了基于各种算法确定字符串之间相似性和距离的函数。

  • Soundex Functions 算法是一种拼音算法,用于按英语发音来索引姓名,它最初由美国人口调查局开发。 https://blog.csdn.net/qq_36761831/article/details/82226544
  • Levenshtein Functions 编辑距离计算  https://www.jb51.net/article/98449.htm
  • Metaphone Functions 根据两个字符串发音来确定两个单词的相似度,这个针对First Name和Last Name都有效。比如Joseph和Josef两个单词发音一样,所以匹配程度为100.   
  • Double Metaphone Functions

Greenplum PL/Container Language Extension

  PL/容器语言扩展是一个开源模块。有关该模块的信息,请参见GitHub存储库中的README文件:https://github.com/greenpldb/plcontainer。

  当Greenplum数据库在Docker容器中运行时,不支持PL/Container。PL/Container现在只支持python和R语言,并有相应的base images支持,并不支持Java。PL/java是通过JNI和Greenplum进行通信的,而PL/Container是通过rpc服务与Greenplum通行通信,它具有大部分编程语言方式使用的功能。PL/Container可以在下列方面具有优势:

  • 扩展
  • 语言多版本支持
  • 资源管理方便

Greenplum MapReduce Specification

  MapReduce 是 Google 提出的一种海量数据并发处理的一种编程思想,可以让程序员在多态机器上快速的编写出自己的代码。MapReduce 的基本思想是将大数据量拆分成一行一行 (key,value) 对,然后分发给 Map 模块,通过自定义的 Map 函数,生成新的 (key,value) 对,通过排序汇总,生成 (key,output_list) 发给自定义的 Reduce 函数处理,每一个 Reduce 函数处理一个唯一的 key 及这个 key 对应的所有 value 的列表,如果有需要,还可以将 Reduce 的结果作为下一个 Map 的数据再进行计算。每一个机器都可以启动多个 Map 和 Reduce 来计算结果。

gp MapReduce 允许用户自己编写 map 和 reduce 函数,然后提交给 gp 并发处理引擎处理,gp 在分布式的环境下允许 MapReduce 代码,并处理所有Segment 的报错信息。

gp 中的 MapReduce 基本框架如图:

img

图6-5

MapReduce 的组成部分:

img

表6-11

在 gp 中,执行 MapReduce 函数需要编写 yaml 文件。在 yaml 文件中,主要有以下几个部分需要定义:

1、INPUT

INPUT 有多种类型:可以是一个外部文本数据文件、一个数据库中的表或查询等。

(1)外部文件

1
2
3
4
5
6
7
8
9
- INPUT:
NAME: my_file_input
FILE: seghostname:/var/data/gpfiles/employees.txt
COLUMNS
- first_name text
- last_name text
- dept text
FORMAT: TEXT
DELIMITER: |

(2)数据库表

1
2
3
- INPUT:
NAME: my_table_input
TABLE: sales

(3)数据库查询

1
2
3
- INPUT:
NAME: my_query_input
QUERY: SELECT vendor, amt FROM sales WHERE region='usa';

(4)通过 gpfdist 导入外部文件

1
2
3
4
5
6
7
8
9
10
11
- INPUT:
NAME: my_distributed_input
# specifiles the host,port and the desired files served
# by gpfdist. /* denotes all files on the gpfdist server
GPFDIST:
- gpfdisthost:8080/*
COLUMNS
- first_name text
- last_name text
FORMAT: TEXT
DELIMITER: '|'

(5)操作系统命令

1
2
3
4
5
6
7
8
- INPUT:
NAME: my_query_input
EXEC: /var/load_scripts/get_log_data.sh
COLUMNS
- url text
- date timestamp
FORMAT: TEXT
DELIMITER: '|'

类型(4)和(5)也可以采用在数据库中建成外部表的形式,就是可以当成数据库中的表操作,跟(2)一样,这两个类型的功能跟外部表有点重复。

2、Map

Map 是输入一行数据,有 0 个或多个数据输出,可以用 python 或 perl 实现。

1
2
3
4
5
6
7
8
9
10
11
- MAP:
NAME: function_name
FUNCTION: function_definition
LANGUAGE: perl | python | c
LIBRARY: /path/filename.so
PARAMETERS:
- nametype
RETURNS:
- nametype
OPTIMIZE: STRICT IMMUTABLE
MODE: SINGLE | MULTI

3、Reduce

也可以用 python 或 perl 实现。

gp 提供几个预定义 Reduce 函数:

IDENTITY - 返回没有标红的 (key,value) 对

SUM - 计算数字类型的和

AVG - 计算数字类型的平均值

COUNT - 计算输入数据的count数

MIN - 计算数字类型的最小值

MAX - 计算数字类型的最大值

(函数对 value 进行相应的操作)

4、OUTPUT

OUTPUT 可以是数据表也可以是文本文件:

(1)输出到文本文件

1
2
3
- OUTPUT:
NAME: gpmr_output
FILE: /var/data/mapreduce/wordcount.out

(2)输出到数据表

1
2
3
4
5
6
- OUTPUT
NAME: gpmr_output
TABLE: wordcount_out
KEYS:
- value
MODE: REPLACE(注:若是放此表并重建表,则用 REPLACE,若是想追加输出的数据,则用 APPEND)

5、Task

Task 的描述是选择性的,主要用在多级的 MapReduce 任务中,一个 Task 的输出可以作为下一个 Task 或 Map 的输入。

6、EXECUTE

EXECUTE 就是将上面定义的步骤串联起来

1
2
3
4
5
6
EXECUTE:
- RUN:
SOURCE: input_or_task_name
TARGET: output_name
MAP: map_function_name
REDUCE: reduce_function_name

小结

MapReduce:当下非常流行的一种编程思想,它简化了编程模型,通过这种编程思路,可以解决很多 sql 无法完成的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
%YAML 1.1
---
VERSION: 1.0.0.2
DATABASE: dbname
USER: db_username
HOST: master_hostname
PORT: master_port
DEFINE:
- INPUT:
NAME: input_name
FILE:
- hostname:/path/to/file
GPFDIST:
- hostname:port/file_pattern
TABLE: table_name
QUERY: SELECT_statement
EXEC: command_string
COLUMNS:
- field_name data_type
FORMAT: TEXT | CSV
DELIMITER: delimiter_character
ESCAPE: escape_character
NULL: null_string
QUOTE: csv_quote_character
ERROR_LIMIT: integer
ENCODING: database_encoding
- OUTPUT:
NAME: output_name
FILE: file_path_on_client
TABLE: table_name
KEYS:
- column_name
MODE: REPLACE | APPEND
- MAP:
NAME: function_name
FUNCTION: function_definition
LANGUAGE: perl | python | c
LIBRARY: /path/filename.so
PARAMETERS:
- nametype
RETURNS:
- nametype
OPTIMIZE: STRICT IMMUTABLE
MODE: SINGLE | MULTI
- TRANSITION | CONSOLIDATE | FINALIZE:
NAME: function_name
FUNCTION: function_definition
LANGUAGE: perl | python | c
LIBRARY: /path/filename.so
PARAMETERS:
- nametype
RETURNS:
- nametype
OPTIMIZE: STRICT IMMUTABLE
MODE: SINGLE | MULTI
- REDUCE:
NAME: reduce_job_name
TRANSITION: transition_function_name
CONSOLIDATE: consolidate_function_name
FINALIZE: finalize_function_name
INITIALIZE: value
KEYS:
- key_name
- TASK:
NAME: task_name
SOURCE: input_name
MAP: map_function_name
REDUCE: reduce_function_name
EXECUTE
- RUN:
SOURCE: input_or_task_name
TARGET: output_name
MAP: map_function_name
REDUCE: reduce_function_name...

Greenplum PostGIS Extension

就是支持 PostGIS ,使Greenplum变为空间数据库。

PostGIS作为新一代空间数据存储标准模型,将空间地理信息数据结构规范为关系型数据库可以承载的sp模式(simple features),这样,使得之前门槛颇高的gis空间数据存储模式变得通俗易懂、简单明了。

最重要的只要接触过SQL语言,就可以利用PostGIS的SQL语法便捷的操纵装载着空间信息的数据框(数据表),这些二维表除了被设定了一个特殊的空间地理信息字段(带有空间投影信息、经纬度信息等)之外,与主流数据管理系统所定义的各种字段并无两样。

PostGIS安装不仅依赖于PostgreSQL,还依赖于很多插件:

  • GEOS几何对象库
  • GDAL栅格功能
  • LibXML2
  • LIBJSON

PostGIS的特点如下:

  • PostGIS支持所有的空间数据类型,这些类型包括:点(POINT)、线(LINESTRING)、面(POLYGON)、多点 (MULTIPOINT)、多线(MULTILINESTRING)、多面(MULTIPOLYGON)和几何集合 (GEOMETRYCOLLECTION)等。PostGIS支持所有的对象表达方法,比如WKT和WKB。
  • PostGIS支持所有的数据存取和构造方法,如GeomFromText()、AsBinary(),以及GeometryN()等。
  • PostGIS提供简单的空间分析函数(如Area和Length)同时也提供其他一些具有复杂分析功能的函数,比如Distance。
  • PostGIS提供了对于元数据的支持,如GEOMETRY_COLUMNS和SPATIAL_REF_SYS。同时,PostGIS也提供了相应的支持函数,如AddGeometryColumn和DropGeometryColumn。
  • PostGIS提供了一系列的二元谓词(如Contains、Within、Overlaps和Touches)用于检测空间对象之间的空间关系,同时返回布尔值来表征对象之间符合这个关系。
  • PostGIS提供了空间操作符(如Union和Difference)用于空间数据操作。
  • 数据库坐标变换
  • 球体长度运算
  • 三维的几何类型
  • 空间聚集函数
  • 栅格数据类型
本文作者 : andy.zhou
原文链接 : https://rjzjh.gitee.io/2019/10/14/other/greenplum-info/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹