БъздавамС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ. Част 2

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ Π½Π° всички. БподСлямС ΠΏΡ€Π΅Π²ΠΎΠ΄ Π½Π° Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½Π°Ρ‚Π° част ΠΎΡ‚ статията, ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½Π° спСциално Π·Π° студСнти Π½Π° курса β€žData Engineerβ€œ. Π‘ ΠΏΡŠΡ€Π²Π°Ρ‚Π° част ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ Ρ‚ΡƒΠΊ.

Apache Beam ΠΈ DataFlow Π·Π° Ρ€Π΅Π°Π»Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ

БъздавамС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ. Част 2

Настройка Π½Π° 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
Рисунка 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.

БъздавамС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ. Част 2
Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 3. Π‘Ρ…Π΅ΠΌΠ° Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°

ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° потрСбитСлския Π»ΠΎΠ³

Pub/Sub Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ Π²Π°ΠΆΠ΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π° нашия ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ позволява Π½Π° няколко нСзависими прилоТСния Π΄Π° взаимодСйстват ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρƒ си. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ, Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° ΠΊΠ°Ρ‚ΠΎ посрСдник, ΠΊΠΎΠΉΡ‚ΠΎ Π½ΠΈ позволява Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°ΠΌΠ΅ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСнията. ΠŸΡŠΡ€Π²ΠΎΡ‚ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ, Π΅ Π΄Π° създадСм Ρ‚Π΅ΠΌΠ° (topic). Π”ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π΅ просто Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π² Pub/Sub Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° ΠΈ Π΄Π° натиснСтС CREATE TOPIC.

По-Π΄ΠΎΠ»Ρƒ прСдоставСният ΠΊΠΎΠ΄ ΠΈΠ·Π²ΠΈΠΊΠ²Π° нашия скрипт Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΠΎ-Π³ΠΎΡ€Π΅, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ сС ΡΠ²ΡŠΡ€Π·Π²Π° ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° ΠΆΡƒΡ€Π½Π°Π»ΠΈΡ‚Π΅ Π² Pub/Sub. ЕдинствСното, ΠΊΠΎΠ΅Ρ‚ΠΎ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ, Π΅ Π΄Π° създадСм ΠΎΠ±Π΅ΠΊΡ‚ PublisherClient, Π΄Π° посочим ΠΏΡŠΡ‚Ρ към Ρ‚Π΅ΠΌΠ°Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° topic_path ΠΈ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ функцията publish с topic_path ΠΈ Π΄Π°Π½Π½ΠΈΡ‚Π΅. ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ generate_log_line ΠΎΡ‚ нашия скрипт stream_logs, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ сС ΡƒΠ²Π΅Ρ€Π΅Ρ‚Π΅, Ρ‡Π΅ Ρ‚Π΅Π·ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ са Π² Π΅Π΄Π½Π° ΠΏΠ°ΠΏΠΊΠ°, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° стартирамС Ρ‚ΠΎΠ²Π° Ρ‡Ρ€Π΅Π· Π½Π°ΡˆΠ°Ρ‚Π° Google ΠΊΠΎΠ½Π·ΠΎΠ»Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ:

python publish.py

from 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, Π·Π° Π΄Π° Π³ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠΌ.

БъздавамС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ. Част 2
Рисунок 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 Π·Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΈΡ‚Π΅ Π»ΠΎΠ³ΠΎΠ²Π΅. Π’ΠΎΠ²Π° ΠΌΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π° Π΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° Π² Ρ€Π΅Π΄ΠΈΡ†Π° случаи.

БъздавамС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ. Част 2
Рисунка 4: Beam ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€

Π”ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Π½Π°ΡˆΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ Π² BigQuery

И Ρ‚Π°ΠΊΠ°, Π²Π΅Ρ‡Π΅ трябва Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° Π΄Π°Π½Π½ΠΈ Π² Π½Π°ΡˆΠ°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°. Π—Π° Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ‚ΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅ΠΌ Π² BigQuery ΠΈ Π΄Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ, трябва Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ няколко Ρ€Π΅Π΄Π° ΠΎΡ‚ Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½ΠΈ. Π‘Π΅Π³Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ, ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈ Π² BigQuery, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΠΌ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π΅Π½ Π°Π½Π°Π»ΠΈΠ·, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΄Π° сподСлим Π΄Π°Π½Π½ΠΈΡ‚Π΅ с ΠΊΠΎΠ»Π΅Π³ΠΈ ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ Π΄Π° отговарямС Π½Π° бизнСс Π²ΡŠΠΏΡ€ΠΎΡΠΈ.

SELECT * FROM `user-logs-237110.userlogs.logdata` LIMIT 10;

БъздавамС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ. Част 2
Рисунка 5: BigQuery

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

НадявамС сС, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ пост Ρ‰Π΅ послуТи ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° създаванС Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π·Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° улСсняванС Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π΄ΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅. Π‘ΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² Ρ‚Π°ΠΊΡŠΠ² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½ΠΈ Π΄Π°Π²Π° ΠΌΠ½ΠΎΠ³ΠΎ прСдимства. Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ Π΄Π° отговарямС Π½Π° Π²Π°ΠΆΠ½ΠΈ Π²ΡŠΠΏΡ€ΠΎΡΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ»ΠΊΠΎ Ρ…ΠΎΡ€Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ нашия ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚? РастС Π»ΠΈ Π±Π°Π·Π°Ρ‚Π° Π½ΠΈ ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ с Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ? Π‘ ΠΊΠ°ΠΊΠ²ΠΈ аспСкти Π½Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Ρ…ΠΎΡ€Π°Ρ‚Π° взаимодСйстват Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ? И ΠΈΠΌΠ° Π»ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ Ρ‚Π°ΠΌ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π½Π΅ трябва Π΄Π° ΠΈΠΌΠ°? Π’ΠΎΠ²Π° са Π²ΡŠΠΏΡ€ΠΎΡΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π±ΠΈΡ…Π° Π±ΠΈΠ»ΠΈ интСрСсни Π·Π° организацията. На Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΈΠ΄Π΅ΠΈΡ‚Π΅, ΠΏΡ€ΠΎΠΈΠ·Ρ‚ΠΈΡ‡Π°Ρ‰ΠΈ ΠΎΡ‚ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° Ρ‚Π΅Π·ΠΈ Π²ΡŠΠΏΡ€ΠΎΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡƒΡΡŠΠ²ΡŠΡ€ΡˆΠ΅Π½ΡΡ‚Π²Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈ Π΄Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠΌ ангаТираността Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅.

Beam наистина Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π·Π° Ρ‚ΠΎΠ·ΠΈ Π²ΠΈΠ΄ упраТнСния ΠΈ ΠΈΠΌΠ° Ρ€Π΅Π΄ΠΈΡ†Π° Π΄Ρ€ΡƒΠ³ΠΈ интСрСсни прилоТСния. НапримСр, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ Π·Π° борсовитС Ρ‚ΠΈΠΊΠ΅Ρ€ΠΈ Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΈ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚Π΅ сдСлки въз основа Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°. МоТС Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ сСнзори, ΠΏΠΎΡΡ‚ΡŠΠΏΠ²Π°Ρ‰ΠΈ ΠΎΡ‚ ΠΏΡ€Π΅Π²ΠΎΠ·Π½ΠΈ срСдства, ΠΈ искатС Π΄Π° изчислитС Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π½Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π° Π±ΡŠΠ΄Π΅Ρ‚Π΅ ΠΈΠ³Ρ€Π°Π»Π½Π° компания, която ΡΡŠΠ±ΠΈΡ€Π° Π΄Π°Π½Π½ΠΈ Π·Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ ΠΈ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° създаванС Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΈ ΠΏΠ°Π½Π΅Π»ΠΈ Π·Π° прослСдяванС Π½Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. Π”ΠΎΠ±Ρ€Π΅, господа, Ρ‚ΠΎΠ²Π° Π΅ Ρ‚Π΅ΠΌΠ° Π·Π° Π΄Ρ€ΡƒΠ³ пост, благодаря Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅Ρ‚ΠΎ, Π° Π·Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ искат Π΄Π° видят цСлия ΠΊΠΎΠ΄, Π΅Ρ‚ΠΎ Π»ΠΈΠ½ΠΊ към моя GitHub.

https://github.com/DFoly/User_log_pipeline

На Ρ‚ΠΎΠ²Π° Π΅ всичко. ΠŸΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΏΡŠΡ€Π²Π°Ρ‚Π° част.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster