数据读取和处理服务包括:Pub/Sub、 Dataflow、 Dataproc、 Cloud Data Fusion。
数据质量的五个指标包括:
Batch Processing:在一组存储数据上进行处理和分析,例如支付系统
Streaming Data processing:由数据源产生的流式数据,数据的处理随着数据在系统中的流动,产生对数据的分析,这意味着流式数据几乎是实时分析
加载数据的方式取决于数据需要进行多少转换,包括
ETL的几种方案:
Pub/Sub全称为Publisher/Subscriber,是一个分布式消息服务,可以从多个设备流中读取数据例如IOT设备,默认为Global,提供端到端编码。可能存在延迟、乱序、重复等问题。
发布/订阅的模式可分为以下几种:
每次订阅都需要返回ACK,超过限制时间消息会重新发送。
Pub/Sub的一些特点:
Pub/Sub去重
# create topic
gcloud pubsub topics create sandiego
# publish to topic
gcloud pubsub topics publish sandiego --message "hello"
# Create a client
import os
from google.cloud import pubsub_v1
publisher = pubsub_v1.PublisherClient()
topic_name ='projects/{project_id}/topics/{topic}'.format(
project_id=os.getenv('GOOGLE_CLOUD_PROJECT'),
topic='MY_TOPIC_NAME',
)
publisher.create_topic(topic_name)
publisher.publish(topic_name, b'My first message!', author='dylan')
async pull
import os
from google.cloud import pubsub_v1
subscriber = pubsub_v1.SubscriberClient()
topic_name ='projects/{project_id}/topics/{topic}'.format(
project_id=os.getenv('GOOGLE_CLOUD_PROJECT'),
topic='MY_TOPIC_NAME',
)
subscription_name ='proiects/{proiect_id}/subscriptions/{sub})'format(
proiect_id=os.getenv('GOOGLE_CLOUD_PROJECT'),
Sub='MY_SUBSCRIPTION_NAME'
)
subscriber.create_subscription(
name=subscription_name, topic=topic_name)
def callback(message):
print(message.data)
message.ack()
future = subscriber.subscribe(subscription_name, callback)
synchronous pull
# Create subscription
gcloud pubsub subscriptions create --topic sandiego mySub1
# Pull subscription
gcloud pubsub subscriptions pull --auto-ack mySub1
# Create a client
import time
from google.cloud import pubsub_v1
subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(project_id,subscription_name)
NUM_MESSAGES =2
ACK_DEADLINE = 30
SLEEP_TIME 10
# The subscriber pulls a specific number of messages
response = subscriber.pull(subscription_path,max_messages=NUM_MESSAGES)
Apache Beam:是一个开源的模型来定义和运行数据处理管道,包括ETL、Batch/Streaming processing。
Beam portability:可以理解成一个中间操作层,可以提供跨语言、自定义Docker环境等支持。其中跨语言支持如下图:
Dataflow是一个全部管理的服务用来在谷歌云执行Apache Beam数据管道。Dataflow是一种serverless和NoOps(自动维护、监控、autoscaling)服务。其服务包括:
Dataflow的工作流程可以如下图所示:
可以使用 Google App Engine Cron 服务创建 cron 作业来运行 Cloud Dataflow 作业
Dataflow模板允许用户快速部署标准任务类型,总共分为三种:
Dataflow的安全性:
更新pipeline的方法:使用drain flag(停止pipelilne并更新)、 json mapping(处理兼容性问题)
Dataflow中的window,可以自定义trigger
Trigger决定数据到达时何时发出聚合结果。 默认情况下,当watermark经过窗口末尾时发出结果。Apache Beam SDK 可以设置在以下条件的任意组合下运行的触发器:
from apache_beam import window
fixed_windowed_items =(
items| 'window'>> beam.WindowInto(window.FixedWindows(60)))
sliding_windowed_items =(
items| 'window'>>beam.WindowInto(window.SlidingWindows(30,5)))
session_windowed_items =(
items | 'window'>> beam.WindowInto(window.Sessions(10 *60)))
由于事件发生的时间和事件经过处理的时间存在延迟,Dataflow的windows中使用Watermarks提供一个lag time来处理晚到的消息队列,一旦消息晚于lag time,我们可以选择是否继续等待。
搭建Pipeline的三种方式:
PCollection_out = (PCollection_in| PTransform_1
| PTransform_2
| PTransform_3)
# branching pipeline
PCollection_out_1 = PCollection_in] PTransform_1
PCollection_out_2 = PCollection_in] PTransform_2
使用Python运行Dataflow Pipeline
import apache_beam as beam
if __name__ =='__main__':
with beam.Pipeline(argv=sys.argv) as p:
(p
| beam.io.ReadFromText('gs://...') # read input
| beam.FlatMap(count_words) # apply transform
| beam.io.WriteToText('gs://...') # write output
)
# end of with-clause: runs,stops the pipeline
我们可以自定义Pipeline的一些参数
import apache_beam as beam
options ={'project': <project>,
'runner':'DataflowRunner',
'region': <region>,
'setup_file': <setup.py file>)
pipeline_options = beam.pipeline.PipelineOptions(flags=[], **options)
pipeline = beam.Pipeline(options = pipeline_options)
读取输入
with beam.Pipeline(options=pipeline_options) as p:
# Read from Cloud Storage (returns a string)
lines = p | beam.io.ReadFromText("gs://.../input-*.csv.gz")
# Read from Pub/Sub (returns a string)
lines = p | beam.io.ReadStringsFromPubSub(topic=known_args.input_topic)
# Read from BigQuery (returns rows)
query = "SELECT x,y,Z FROM 'project.dataset.tablename'"
BQ_source = beam.io.BigQuerySource(query = <query>,use_standard_sql=True)
BQ_data = pipeline | beam.io.Read(BQ_source)
输出
from apache_beam.io.gcp.internal.clients import bigquery
# Establish reference to BigQuery table
table_spec = bigquery.TableReference(
projectId='clouddataflow-readonly',
datasetId='samples',
tableId='weather_stations')
# Write to BiqQuery table
p | beam.io.WriteToBigQuery(
table_spec,
schema=table_schema,
write_disposition=beam.io.BigQueryDisposition.WRITE_TRUNCATE,
create_disposition=beamio.BigQueryDisposition.CREATE_IF_NEEDED)
转换
# Map (fn) uses a callable fn to do a one-to-one transformation.
'WordLengths'>> beam.Map(word,len(word))
# FlatMap is similar to Map, but fn returns an iterable. The iterables are flattened into one PCollection. Non 1:1 relationship
def my_grep(line, term):
if term in line:
yield line
'Grep'>> beam.FlatMap(my_grep(line,searchTerm))
# Pardo: filter/format dataset, extract element, simple computation
# 可以在Pardo添加side input
words = ...
class ComputeWordLengthFn(beam.DoFn):
def process(self, element):
return [len(element)]
word_lengths = words | beam.ParDo(ComputeWordLengthFn())
# 聚合函数:GroupByKey(group)、Combine(group)、Faltten(merge)、Partition(split)
# Window:数据默认存在与Global Window里,即从第一个数据开始到最后一个数据结束,我们可以使用Window来处理时间序列问题(按时间分组)
# SlidingWindows代表每个窗口持续60秒,每过30秒开始一个新窗口
beam.WindowInto(beam.window.SlidingWindows(60,30))
Dataproc是基于Apache Hadoop和Spark的数据处理服务。
Dataproc定制化集群的两种方法:
Dataproc集群的结构:
优化Dataproc:
Cloud Data Fusion是一个图形化的、无代码的数据管线。主要针对batch data。
Data Fusion的组成部分:
数据管线——有向无环图:有向无环图中有一系列阶段,每个阶段可以是不同的类型,例子如下图
Cloud Data Catalog:是一个serverless数据发现和元数据管理服务。
Cloud Composer是一个管理引擎,用来控制多个GCP服务的运行。Cloud Composer的结构也是一个有向无环图。
Airflow使用operator在有向无环图中来管理其他GCP服务。具体的operator参考官方文档 Google Cloud Operators。
Cloud Composer scheduling的方法:
使用Python的一个例子
from airflow.contrib.operators import *
# update training data, 指定SQL语句
t1 = BigQueryOperator()
# BigQuery training data export to GCS
t2 = BigQueryToCloudStorageOperator()
# AI Platform training job
t3 = MLEngineTrainingOperator()
# App Engine deploy new version
t4 = AppEngineVersionOperator()
# DAG dependencies
t2.set_upstream(t1)
t3.set_upstream(t2)
t4.set upstream(t3)
可视化与分析服务包括BigQuery、Looker、Looker Studio
Looker支持BigQuery等超过60个SQL数据库,使用Looker建模语言来定义数据的逻辑。
Looker Studio与Looker不同的地方在于不需要管理的支持来获得数据连接。
建立Looker Studio Dashboard的步骤:
Looker Studio的缓存机制:Looker Studio通过临时存储数据来提高性能并降低查询成本,通过设置数据新鲜度(data freshness)来更新数据。
BigQuery是一个全管理的数据仓库,可以存储和分析数据。全管理是指无需考虑BigQuery的部署、安全和可扩展性。BigQuery是column oriented, 通常UTF-8编码。其工作流程如下
BigQuery权限控制:
Bigquery的优化查询:
一些SQL基础:
AVRO数据格式:
在GCP中,数据传输是指GCP生态系统中各种服务,区域或环境之间数据的移动。 GCP提供了几种机制和工具来促进数据传输,每个机制都有不同的目的和方案。 以下是GCP中数据传输的一些常见方法:
Google Cloud Dataprep 是一项完全托管的数据准备和转换服务,可帮助清理、转换和可视化原始数据以进行分析和下游处理。 它提供了可视化的界面和强大的数据转换能力,让用户无需编写代码即可准备数据。
Dataprepd的架构/组件:
Dataprepd的工作流程:
Dataprepd的主要特征:
使用GCP搭建机器学习系统分为三个层次,分别是AI基础、AI开发平台和AI解决方案。
AI开发包括Vertex AI、AutoML,AI解决方案包括Document AI、Contact Center AI等。
搭建AI开发平台的四种方式:Bigquery ML、预训练API、AutoML、自定义训练。四种方式对比如下
我们可以在BigQuery中使用SQL查询语句来创建和运行机器学习模型。步骤如下:
以下是BigQuery 支持的模型
GCP的预建立API包括:
AutoML是一种不需要代码的解决方案来搭建模型。其核心有两点:
AutoML的数据来源可以是Cloud Storage、Big Query或者本地路径。其主要处理以下数据:
使用AutoML的过程包括训练、部署、服务。其中训练过程中,我们需要准备好原始数据集。数据集保存在csv文件中,第一列代表数据组别(训练集、验证集、测试集),第二列为数据的保存位置,第三列为标签。在部署过程中,模型会在一段时间后被删除,所以我们需要周期性的训练模型。
Vertex AI支持AutoML和自定义训练。
自定义训练环境分为两种:
Vertex AI提供以下特征以帮助训练和部署“
训练一个机器学习模型的工作流程包括:
Notebook是运行在computer engine实例中,我们可以定义其实例类型、GPU等。
Notebook中的魔法方法:我们可以在notebook中运行BigQuery命令,将BigQuery结果保存到pandas的dataframe中,例如
%%bigquery df
SELECT
*
FROM
'bigquery-public-data.austin_bikeshare.bikeshare_trips'
WHERE
end_station_name = 'Stolen'
print(type(df))
df.head()
结果是一个dataframe表
Hadoop:
HDFS:Hadoop的文件系统
Pig:编译成 MapReduce 作业的脚本语言
Hive:数据仓库系统和查询语言
Spark:
Sqoop:
Oozie:
Cassandra:
MongoDB:适用于系统需要schema-less文档存储的用例。
Hbase:可能适用于搜索引擎、分析日志数据或需要扫描大的二维无连接表的任何地方。
Redis:旨在为各种数据结构(如树、队列、链表等)提供内存中搜索,非常适合制作实时排行榜