БъздавамС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ. Част 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('ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π² {} ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ {}.'.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, която сканира Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΈ ΠΈΠ·Π²Π»ΠΈΡ‡Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°Ρ‰Π° Π½ΠΈΠ· Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° списък с Π¨ΠΠ‘Π›ΠžΠΠ˜, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ функцията 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 Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈΡ‚Π΅, Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°.
  • стрийминг

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