ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ. Π‘ΠΏΠΎΠ΄Π΅Π»ΡΠΌΠ΅ ΠΏΡΠ΅Π²ΠΎΠ΄ Π½Π° Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΡΡΠ°ΡΠΈΡΡΠ°, ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ Π·Π° ΡΡΡΠ΄Π΅Π½ΡΠΈ Π½Π° ΠΊΡΡΡΠ° . Π‘ ΠΏΡΡΠ²Π°ΡΠ° ΡΠ°ΡΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ .
Apache Beam ΠΈ DataFlow Π·Π° ΡΠ΅Π°Π»Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΠΏΠΎΡΠΎΡΠΈ

ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Google Cloud
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: ΠΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΈ Π΄Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌ Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡ Π»ΠΎΠ³, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Google Cloud Shell, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠΌΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΏΡΡΠΊΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π½Π° Python 3. Google Cloud Shell ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Python 2, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΏΠΎ-ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ Apache Beam.
ΠΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π·Π°Π΄ΡΠ»Π±ΠΎΡΠΈΠΌ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅. ΠΠ° ΡΠ΅Π·ΠΈ ΠΎΡ Π²Π°Ρ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π»ΠΈ GCP ΠΏΡΠ΅Π΄ΠΈ, Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΡ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ 6 ΡΡΡΠΏΠΊΠΈ, ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ Π½Π° ΡΠ°Π·ΠΈ .
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠ°ΡΠΈΠΌ Π½Π°ΡΠΈΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π² ΠΎΠ±Π»Π°ΡΠ½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° Google ΠΈ Π΄Π° Π³ΠΈ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π² Π½Π°ΡΠΈΡ Google Cloud Shell. ΠΠ°ΡΠ²Π°Π½Π΅ΡΠΎ Π² ΠΎΠ±Π»Π°ΡΠ½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π΅ Π΄ΠΎΡΡΠ° ΡΡΠΈΠ²ΠΈΠ°Π»Π½ΠΎ (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ ). ΠΠ° Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΠΌ Google Cloud Shell ΠΎΡ ΠΏΠ°Π½Π΅Π»Π° Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΠΊΠ°ΡΠΎ ΡΡΠ°ΠΊΠ½Π΅ΠΌ Π²ΡΡΡ Ρ ΠΏΡΡΠ²Π°ΡΠ° ΠΈΠΊΠΎΠ½Π° Π²Π»ΡΠ²ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ 2 ΠΏΠΎ-Π΄ΠΎΠ»Ρ.

Π ΠΈΡΡΠ½ΠΊΠ° 2
ΠΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅, ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ Π·Π° ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΡΠ° ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ ΠΏΠΎ-Π΄ΠΎΠ»Ρ.
# Copy file from cloud storage
gsutil cp gs://<YOUR-BUCKET>/ * .
sudo pip install apache-beam[gcp] oauth2client==3.0.0
sudo pip install -U pip
sudo pip install Faker==1.0.2
# Environment variables
BUCKET=<YOUR-BUCKET>
PROJECT=<YOUR-PROJECT>Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½Π°ΡΠ°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠ°Π±Π»ΠΈΡΠ°
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΈΠ·Π²ΡΡΡΠΈΠΌ Π²ΡΠΈΡΠΊΠΈ ΡΡΡΠΏΠΊΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅, ΡΠ»Π΅Π΄Π²Π°ΡΠΎΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ, Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠ°Π±Π»ΠΈΡΠ° Π² BigQuery. ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈΠ½Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅, Π½ΠΎ Π½Π°ΠΉ-Π»Π΅ΡΠ½ΠΈΡΡ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° Π½Π° Google Cloud, ΠΊΠ°ΡΠΎ ΠΏΡΡΠ²ΠΎ ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΡΠ°, ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ , Π·Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΡΡ Π΅ΠΌΠ°. ΠΠ°ΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΅ ΠΈΠΌΠ° 7 ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ Π»ΠΎΠ³. ΠΠ° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΠΊΠ°ΡΠΎ Π½ΠΈΠ·ΠΎΠ²Π΅ (ΡΠΈΠΏ string), Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° timelocal, ΠΈ ΡΠ΅ Π³ΠΈ Π½Π°ΡΠ΅ΡΠ΅ΠΌ Π² ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΠΌΠ΅ ΠΏΠΎ-ΡΠ°Π½ΠΎ. Π‘Ρ Π΅ΠΌΠ°ΡΠ° Π½Π° Π½Π°ΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ 3.

ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ 3. Π‘Ρ
Π΅ΠΌΠ° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°
ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡ Π»ΠΎΠ³
Pub/Sub Π΅ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π²Π°ΠΆΠ΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° Π½Π°ΡΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ. ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ, ΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° ΠΊΠ°ΡΠΎ ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°ΠΌΠ΅ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°. ΠΡΡΠ²ΠΎΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ, Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ΅ΠΌΠ° (topic). ΠΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π² Pub/Sub Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° ΠΈ Π΄Π° Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ CREATE TOPIC.
ΠΠΎ-Π΄ΠΎΠ»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈΡΡ ΠΊΠΎΠ΄ ΠΈΠ·Π²ΠΈΠΊΠ²Π° Π½Π°ΡΠΈΡ ΡΠΊΡΠΈΠΏΡ Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΠΎ-Π³ΠΎΡΠ΅, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π° ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ° ΠΆΡΡΠ½Π°Π»ΠΈΡΠ΅ Π² Pub/Sub. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ, Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΎΠ±Π΅ΠΊΡ PublisherClient, Π΄Π° ΠΏΠΎΡΠΎΡΠΈΠΌ ΠΏΡΡΡ ΠΊΡΠΌ ΡΠ΅ΠΌΠ°ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° topic_path ΠΈ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° publish Ρ topic_path ΠΈ Π΄Π°Π½Π½ΠΈΡΠ΅. ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°ΠΌΠ΅ generate_log_line ΠΎΡ Π½Π°ΡΠΈΡ ΡΠΊΡΠΈΠΏΡ stream_logs, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ ΡΠ²Π΅ΡΠ΅ΡΠ΅, ΡΠ΅ ΡΠ΅Π·ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ° Π² Π΅Π΄Π½Π° ΠΏΠ°ΠΏΠΊΠ°, Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ ΠΈΠΌΠΏΠΎΡΡΠ°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΎΠ²Π° ΡΡΠ΅Π· Π½Π°ΡΠ°ΡΠ° Google ΠΊΠΎΠ½Π·ΠΎΠ»Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ:
python publish.pyfrom stream_logs import generate_log_line
import logging
from google.cloud import pubsub_v1
import random
import time
PROJECT_ID="user-logs-237110"
TOPIC = "userlogs"
publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(PROJECT_ID, TOPIC)
def publish(publisher, topic, message):
data = message.encode('utf-8')
return publisher.publish(topic_path, data = data)
def callback(message_future):
# ΠΠΎΠ³Π°ΡΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅ Π½Π΅ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ΠΎ, ΠΌΠ΅ΡΠΎΠ΄ΡΡ Π·Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠ° Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ.
if message_future.exception(timeout=30):
print('Publishing message on {} threw an Exception {}.'.format(
topic_name, message_future.exception()))
else:
print(message_future.result())
if __name__ == '__main__':
while True:
line = generate_log_line()
print(line)
message_future = publish(publisher, topic_path, line)
message_future.add_done_callback(callback)
sleep_time = random.choice(range(1, 3, 1))
time.sleep(sleep_time)Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ°ΠΉΠ»ΡΡ ΡΡΠ°ΡΡΠΈΡΠ°, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°Π±Π»ΡΠ΄Π°Π²Π°ΠΌΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°, ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ. Π’ΠΎΠ·ΠΈ ΡΠΊΡΠΈΠΏΡ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ CTRL+C, Π·Π° Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΠΌ.

Π ΠΈΡΡΠ½ΠΎΠΊ 4. ΠΠ·Ρ
ΠΎΠ΄ publish_logs.py
ΠΠ°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° Π½Π°ΡΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ
Π‘Π΅Π³Π°, ΠΊΠΎΠ³Π°ΡΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ Π½Π°ΠΉ-ΠΈΠ½ΡΡΠΈΠ³ΡΠ²Π°ΡΠ°ΡΠ° ΡΠ°ΡΡ β Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° Π½Π°ΡΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Beam ΠΈ Python. ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Beam ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ, ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΎΠ±Π΅ΠΊΡ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° (p). Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΎΠ±Π΅ΠΊΡΠ° Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ Π΅Π΄Π½Π° ΡΠ»Π΅Π΄ Π΄ΡΡΠ³Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° pipe (|). ΠΠ±ΡΠΎ Π²Π·Π΅ΡΠΎ, ΡΠ°Π±ΠΎΡΠ½ΠΈΡΡ ΠΏΡΠΎΡΠ΅Ρ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ.
[Final Output PCollection] = ([Initial Input PCollection] | [First Transform]
| [Second Transform]
| [Third Transform]) Π Π½Π°ΡΠΈΡ ΠΊΠΎΠ΄ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π΄Π²Π΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ. Π€ΡΠ½ΠΊΡΠΈΡΡΠ° regex_clean, ΠΊΠΎΡΡΠΎ ΡΠΊΠ°Π½ΠΈΡΠ° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΈ ΠΈΠ·Π²Π»ΠΈΡΠ° ΡΡΠΎΡΠ²Π΅ΡΠ½Π°ΡΠ° ΡΠ΅Π΄ΠΈΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° PATTERNS, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΡΡΠ° re.search. Π€ΡΠ½ΠΊΡΠΈΡΡΠ° Π²ΡΡΡΠ° ΡΠ΅Π΄ΠΈΡΠ°, ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π° ΡΡΡ Π·Π°ΠΏΠ΅ΡΠ°ΠΈ. ΠΠΊΠΎ Π½Π΅ ΡΡΠ΅ Π΅ΠΊΡΠΏΠ΅ΡΡ ΠΏΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ, ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Ρ ΡΠΎΠ·ΠΈ ΠΈ Π΄Π° ΡΠΏΡΠ°ΠΆΠ½ΠΈΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ° Π² Π±Π΅Π»Π΅ΠΆΠ½ΠΈΠΊΠ°, Π·Π° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΊΠΎΠ΄Π°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠΌΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠ° ParDo-ΡΡΠ½ΠΊΡΠΈΡ Π½Π° ΠΈΠΌΠ΅ Split, ΠΊΠΎΡΡΠΎ Π΅ Π²Π°ΡΠΈΠ°ΡΠΈΡ Π½Π° Beam ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°. Π Python ΡΠΎΠ²Π° ΡΡΠ°Π²Π° ΠΏΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ Π½Π°ΡΠΈΠ½ β ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΊΠ»Π°Ρ, ΠΊΠΎΠΉΡΠΎ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΠΊΠ»Π°ΡΠ° DoFn Beam. Π€ΡΠ½ΠΊΡΠΈΡΡΠ° Split ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠ°Π·ΠΏΠ°ΡΡΠ΅Π½Π° ΡΡΡΠΎΠΊΠ° ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π²ΡΡΡΠ° ΡΠΏΠΈΡΡΠΊ ΠΎΡ ΡΠ΅ΡΠ½ΠΈΡΠΈ Ρ ΠΊΠ»ΡΡΠΎΠ²Π΅, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ Π½Π° ΠΈΠΌΠ΅Π½Π°ΡΠ° Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈΡΠ΅ Π² Π½Π°ΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° BigQuery. ΠΠΌΠ° Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ Π·Π° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ: ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°ΠΌ datetime Π²ΡΠ² ΡΡΠ½ΠΊΡΠΈΡΡΠ°, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ. ΠΠΎΠ»ΡΡΠ°Π²Π°Ρ
ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π·Π° Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°Π½Π΅ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΠ΅ΡΠΎ Π±Π΅ΡΠ΅ ΡΡΡΠ°Π½Π½ΠΎ. Π’ΠΎΠ·ΠΈ ΡΠΏΠΈΡΡΠΊ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° WriteToBigQuery, ΠΊΠΎΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²Ρ Π½Π°ΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. ΠΠΎΠ΄ΡΡ Π·Π° Batch DataFlow Job ΠΈ Streaming DataFlow Job Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎ-Π΄ΠΎΠ»Ρ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡ ΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΈΡ ΠΊΠΎΠ΄ Π΅, ΡΠ΅ Π² ΠΏΠ°ΠΊΠ΅ΡΠ½Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ΅ΡΠ΅ΠΌ CSV ΠΎΡ src_path, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΡΡΠ° ReadFromText ΠΎΡ Beam.
Batch DataFlow Job (ΠΏΠ°ΠΊΠ΅ΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°)
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions
from google.cloud import bigquery
import re
import logging
import sys
PROJECT='user-logs-237110'
schema = 'remote_addr:STRING, timelocal:STRING, request_type:STRING, status:STRING, body_bytes_sent:STRING, http_referer:STRING, http_user_agent:STRING'
src_path = "user_log_fileC.txt"
def regex_clean(data):
PATTERNS = [r'(^S+.[S+.]+S+)s',r'(?<=[).+?(?=])',
r'"(S+)s(S+)s*(S*)"',r's(d+)s',r"(?> beam.io.textio.ReadFromText(src_path)
| "clean address" >> beam.Map(regex_clean)
| 'ParseCSV' >> beam.ParDo(Split())
| 'WriteToBigQuery' >> beam.io.WriteToBigQuery('{0}:userlogs.logdata'.format(PROJECT), schema=schema,
write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND)
)
p.run()
if __name__ == '__main__':
logger = logging.getLogger().setLevel(logging.INFO)
main()Streaming DataFlow Job (ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΡΠΎΠΊΠ°)
ΠΎΡ apache_beam.options.pipeline_options ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°ΠΉΡΠ΅ PipelineOptions
ΠΎΡ google.cloud ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°ΠΉΡΠ΅ pubsub_v1
ΠΎΡ google.cloud ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°ΠΉΡΠ΅ bigquery
ΠΈΠΌΠΏΠΎΡΡ apache_beam ΠΊΠ°ΡΠΎ beam
ΠΈΠΌΠΏΠΎΡΡ logging
ΠΈΠΌΠΏΠΎΡΡ argparse
ΠΈΠΌΠΏΠΎΡΡ sys
ΠΈΠΌΠΏΠΎΡΡ re
PROJECT="user-logs-237110"
schema = 'remote_addr:STRING, timelocal:STRING, request_type:STRING, status:STRING, body_bytes_sent:STRING, http_referer:STRING, http_user_agent:STRING'
TOPIC = "projects/user-logs-237110/topics/userlogs"
def regex_clean(data):
PATTERNS = [r'(^S+.[S+.]+S+)s',r'(?<=[).+?(?=])',
r'"(S+)s(S+)s*(S*)"',r's(d+)s',r"(?> beam.io.ReadFromPubSub(topic=TOPIC).with_output_types(bytes)
| "Decode" >> beam.Map(lambda x: x.decode('utf-8'))
| "Clean Data" >> beam.Map(regex_clean)
| 'ParseCSV' >> beam.ParDo(Split())
| 'WriteToBigQuery' >> beam.io.WriteToBigQuery('{0}:userlogs.logdata'.format(PROJECT), schema=schema,
write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND)
)
result = p.run()
result.wait_until_finish()
if __name__ == '__main__':
logger = logging.getLogger().setLevel(logging.INFO)
main()
Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°
ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΏΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°ΡΠΈΠ½Π°. ΠΠΊΠΎ ΠΆΠ΅Π»Π°Π΅ΠΌ, ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ Π΄Π° Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π»ΠΎΠΊΠ°Π»Π½ΠΎ ΠΎΡ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°, Π²Π»ΠΈΠ·Π°ΡΠ° Π² GCP.
python -m main_pipeline_stream.py
--input_topic "projects/user-logs-237110/topics/userlogs"
--streamingΠΠΎ Π½ΠΈΠ΅ ΡΠ΅ Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° DataFlow. ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π·Π°Π΄Π°Π²Π°ΠΉΠΊΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ.
ΠΏΡΠΎΠ΅ΠΊΡβ ID Π½Π° Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ Π² GCP.runnerβ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π²Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΈ ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠ° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°. ΠΠ° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΠΎΠ±Π»Π°ΠΊΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ DataflowRunner.staging_locationβ ΠΏΡΡ ΠΊΡΠΌ ΠΎΠ±Π»Π°ΡΠ½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Cloud Dataflow Π·Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ΠΎΠ²ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΡΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΠ°.temp_locationβ ΠΏΡΡ ΠΊΡΠΌ ΠΎΠ±Π»Π°ΡΠ½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Cloud Dataflow Π·Π° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅Π²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° Π·Π°Π΄Π°Π½ΠΈΡ, ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°.streaming
python main_pipeline_stream.py
--runner DataFlow
--project $PROJECT
--temp_location $BUCKET/tmp
--staging_location $BUCKET/staging
--streaming
ΠΠΎΠΊΠ°ΡΠΎ ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π½Π° ΡΠ°Π±Π° DataFlow Π² Google ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° ΠΈ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½Π°ΡΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ. ΠΠ°ΡΠΎ ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ Π²ΡΡΡ Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π½Π΅ΡΠΎ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° ΡΠΈΡΡΠ½ΠΊΠ° 4. ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Π΄Π΅Π±ΡΠ³Π²Π°Π½Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π² Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π² Stackdriver Π·Π° ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΈΡΠ΅ Π»ΠΎΠ³ΠΎΠ²Π΅. Π’ΠΎΠ²Π° ΠΌΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π° Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π² ΡΠ΅Π΄ΠΈΡΠ° ΡΠ»ΡΡΠ°ΠΈ.

Π ΠΈΡΡΠ½ΠΊΠ° 4: Beam ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ
ΠΠΎΡΡΡΠΏ Π΄ΠΎ Π½Π°ΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Π² BigQuery
Π ΡΠ°ΠΊΠ°, Π²Π΅ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ Π°ΠΊΡΠΈΠ²Π΅Π½ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π° Π΄Π°Π½Π½ΠΈ Π² Π½Π°ΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°. ΠΠ° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΡΠΈΠ΄Π΅ΠΌ Π² BigQuery ΠΈ Π΄Π° ΠΏΡΠ΅Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ, ΡΡΡΠ±Π²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΡΡΠ²ΠΈΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π΄Π° ΠΎΡ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΠΈ. Π‘Π΅Π³Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ, ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈ Π² BigQuery, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΠΌ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ Π°Π½Π°Π»ΠΈΠ·, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΠΌ Π΄Π°Π½Π½ΠΈΡΠ΅ Ρ ΠΊΠΎΠ»Π΅Π³ΠΈ ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π΄Π° ΠΎΡΠ³ΠΎΠ²Π°ΡΡΠΌΠ΅ Π½Π° Π±ΠΈΠ·Π½Π΅Ρ Π²ΡΠΏΡΠΎΡΠΈ.
SELECT * FROM `user-logs-237110.userlogs.logdata` LIMIT 10; 
Π ΠΈΡΡΠ½ΠΊΠ° 5: BigQuery
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ°Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠ΅, ΡΠ΅ ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ ΡΠ΅ ΠΏΠΎΡΠ»ΡΠΆΠΈ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π·Π° ΡΡΡΡΠ΅Π½Π΅ Π½Π° Π½Π°ΡΠΈΠ½ΠΈ Π·Π° ΡΠ»Π΅ΡΠ½ΡΠ²Π°Π½Π΅ Π½Π° Π΄ΠΎΡΡΡΠΏΠ° Π΄ΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅. Π‘ΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ Π² ΡΠ°ΠΊΡΠ² ΡΠΎΡΠΌΠ°Ρ Π½ΠΈ Π΄Π°Π²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°. Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π΄Π° ΠΎΡΠ³ΠΎΠ²Π°ΡΡΠΌΠ΅ Π½Π° Π²Π°ΠΆΠ½ΠΈ Π²ΡΠΏΡΠΎΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ»ΠΊΠΎ Ρ ΠΎΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΄ΡΠΊΡ? Π Π°ΡΡΠ΅ Π»ΠΈ Π±Π°Π·Π°ΡΠ° Π½ΠΈ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Ρ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ? Π‘ ΠΊΠ°ΠΊΠ²ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠ° Ρ ΠΎΡΠ°ΡΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ? Π ΠΈΠΌΠ° Π»ΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΡΠ°ΠΌ, ΠΊΡΠ΄Π΅ΡΠΎ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ°? Π’ΠΎΠ²Π° ΡΠ° Π²ΡΠΏΡΠΎΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π±ΠΈΡ Π° Π±ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΡΠ°. ΠΠ° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΈΠ΄Π΅ΠΈΡΠ΅, ΠΏΡΠΎΠΈΠ·ΡΠΈΡΠ°ΡΠΈ ΠΎΡ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ Π½Π° ΡΠ΅Π·ΠΈ Π²ΡΠΏΡΠΎΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΡΠ²ΡΡΡΠ΅Π½ΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠ΄ΡΠΊΡΠ° ΠΈ Π΄Π° ΡΠ²Π΅Π»ΠΈΡΠΈΠΌ Π°Π½Π³Π°ΠΆΠΈΡΠ°Π½ΠΎΡΡΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅.
Beam Π½Π°ΠΈΡΡΠΈΠ½Π° Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π·Π° ΡΠΎΠ·ΠΈ Π²ΠΈΠ΄ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ ΠΈ ΠΈΠΌΠ° ΡΠ΅Π΄ΠΈΡΠ° Π΄ΡΡΠ³ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π΄Π°Π½Π½ΠΈ Π·Π° Π±ΠΎΡΡΠΎΠ²ΠΈΡΠ΅ ΡΠΈΠΊΠ΅ΡΠΈ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΡΠ΄Π΅Π»ΠΊΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°. ΠΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΠ΅Π½Π·ΠΎΡΠΈ, ΠΏΠΎΡΡΡΠΏΠ²Π°ΡΠΈ ΠΎΡ ΠΏΡΠ΅Π²ΠΎΠ·Π½ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°, ΠΈ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈΡΠ΅ Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° Π±ΡΠ΄Π΅ΡΠ΅ ΠΈΠ³ΡΠ°Π»Π½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΡΠ±ΠΈΡΠ° Π΄Π°Π½Π½ΠΈ Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΠΈ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΠΏΠ°Π½Π΅Π»ΠΈ Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΠΎΠ²ΠΈΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ. ΠΠΎΠ±ΡΠ΅, Π³ΠΎΡΠΏΠΎΠ΄Π°, ΡΠΎΠ²Π° Π΅ ΡΠ΅ΠΌΠ° Π·Π° Π΄ΡΡΠ³ ΠΏΠΎΡΡ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ΡΠΎ, Π° Π·Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΡΠΊΠ°Ρ Π΄Π° Π²ΠΈΠ΄ΡΡ ΡΠ΅Π»ΠΈΡ ΠΊΠΎΠ΄, Π΅ΡΠΎ Π»ΠΈΠ½ΠΊ ΠΊΡΠΌ ΠΌΠΎΡ GitHub.
ΠΠ° ΡΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ. .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
