Skapar en datastreamingpipeline. Del 2

Hej alla. Vi delar med oss av översĂ€ttningen av den avslutande delen av artikeln, som Ă€r speciellt framtagen för studenter pĂ„ kursen „Data Engineer“. Du kan bekanta dig med den första delen ). Ett typiskt exempel pĂ„ anvĂ€ndning:.

Apache Beam och DataFlow för realtidsrörledningar

Skapar en datastreamingpipeline. Del 2

InstÀllning av Google Cloud

Observera: För att köra pipelinen och publicera data fra anvÀndarloggen anvÀnde jag Google Cloud Shell, eftersom jag hade problem med att köra pipelinen pÄ Python 3. Google Cloud Shell anvÀnder Python 2, vilket fungerar bÀttre med Apache Beam.

För att köra pipelinen behöver vi grÀva lite i instÀllningarna. De av er som aldrig har anvÀnt GCP tidigare mÄste följa dessa 6 steg som anges pÄ denna sidan.

DÀrefter behöver vi ladda upp vÄra skript till Google Cloud Storage och kopiera dem till vÄr Google Cloud Shell. Att ladda upp till Google Cloud Storage Àr ganska enkelt (beskrivning finns att hitta hÀr). För att kopiera vÄra filer kan vi öppna Google Cloud Shell frÄn verktygsfÀltet genom att klicka pÄ den första ikonen till vÀnster i bild 2 nedan.

Skapar en datastreamingpipeline. Del 2
Figur 2

Kommandona som vi behöver för att kopiera filer och installera nödvÀndiga bibliotek listas nedan.

# 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>

Skapande av vÄr databas och tabell

NÀr vi har genomfört alla steg relaterade till instÀllning Àr nÀsta steg att skapa en dataset och tabell i BigQuery. Det finns flera sÀtt att göra detta, men det enklaste Àr att anvÀnda Google Cloud-konsolen, först skapa dataset. Du kan följa stegen som anges nedan lÀnken, för att skapa en tabell med schema. VÄr tabell kommer att ha 7 kolumner, motsvarande komponenterna i varje anvÀndarlogg. För enkelhetens skull definierar vi alla kolumner som strÀngar (typ string), förutom variabeln timelocal, och namnger dem enligt de variabler vi genererade tidigare. Schemat för vÄr tabell bör se ut som pÄ bild 3.

Skapar en datastreamingpipeline. Del 2
Bild 3. Tabellschema

Publicering av data frÄn anvÀndarloggen

Pub/Sub Ă€r en kritisk komponent i vĂ„r pipeline eftersom den möjliggör interaktion mellan flera oberoende applikationer. Specifikt fungerar det som en medlare, vilket lĂ„ter oss skicka och ta emot meddelanden mellan applikationerna. Det första vi behöver göra Ă€r att skapa ett Ă€mne (topic). Det Ă€r enkelt att bara gĂ„ till Pub/Sub i konsolen och klicka pĂ„ SKAPA ÄMNE.

Koden nedan anropar vÄrt skript för att generera loggdata som definierades ovan och kopplar sedan upp sig för att skicka loggar till Pub/Sub. Det enda vi behöver göra Àr att skapa ett objekt PublisherClient, ange sökvÀgen till Àmnet med metoden topic_path och anropa funktionen publish med topic_path med data. Observera att vi importerar generate_log_line frÄn vÄrt skript stream_logs, sÄ se till att dessa filer ligger i samma mapp, annars fÄr du ett importfel. DÀrefter kan vi köra detta via vÄr Google-konsol med:

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):
    # NÀr timeout inte anges, vÀntar exceptionsmetoden oÀndligt.
    if message_future.exception(timeout=30):
        print('Publicering av meddelande pÄ {} kastade ett undantag {}.'.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)

NÀr filen har körts kan vi se utdata frÄn loggen pÄ konsolen som visas pÄ bilden nedan. Detta skript kommer att fungera tills vi anvÀnder CTRL+C, för att avsluta det.

Skapar en datastreamingpipeline. Del 2
Figur 4. Utdata publish_logs.py

Skriva koden för vÄr pipeline

Nu nĂ€r vi har förberett allt kan vi gĂ„ vidare till den mest intressanta delen — skriva koden för vĂ„r pipeline med hjĂ€lp av Beam och Python. För att skapa en Beam-pipeline behöver vi skapa ett pipeline-objekt (p). NĂ€r vi har skapat pipeline-objektet kan vi tillĂ€mpa flera funktioner en efter en med hjĂ€lp av operatorn pipe (|). Generellt sett ser arbetsflödet ut som bilden nedan.

[Final Output PCollection] = ([Initial Input PCollection] | [First Transform]
             | [Second Transform]
             | [Third Transform])

I vĂ„r kod kommer vi att skapa tvĂ„ anvĂ€ndardefinierade funktioner. Funktionen regex_clean, som genomsöker data och extraherar den relevanta strĂ€ngen baserat pĂ„ listan PATTERNS, med hjĂ€lp av funktionen re.search. Funktionen returnerar en kommaseparerad strĂ€ng. Om du inte Ă€r expert pĂ„ reguljĂ€ra uttryck rekommenderar jag att du kollar in den hĂ€r handledningen och öva i anteckningsblocket för att testa koden. Efter detta definierar vi en anvĂ€ndardefinierad ParDo-funktion som heter Split, vilket Ă€r en variation av Beam-transformering för parallell bearbetning. I Python görs detta pĂ„ ett speciellt sĂ€tt – vi mĂ„ste skapa en klass som Ă€rvts frĂ„n Beam DoFn-klassen. Split-funktionen tar emot en parserad strĂ€ng frĂ„n den föregĂ„ende funktionen och returnerar en lista av ordböcker med nycklar som motsvarar kolumnnamnen i vĂ„r BigQuery-tabell. Det finns nĂ„got viktigt att notera om denna funktion: jag var tvungen att importera datetime inne i funktionen för att den skulle fungera. Jag fick ett felmeddelande nĂ€r jag importerade i början av filen, vilket var konstigt. Denna lista skickas sedan till funktionen WriteToBigQuery, som helt enkelt lĂ€gger till vĂ„ra data i tabellen. Koden för Batch DataFlow Job och Streaming DataFlow Job Ă€r angiven nedan. Den enda skillnaden mellan batch- och streamkod Ă€r att vi i batchbearbetningen lĂ€ser CSV frĂ„n src_path, med hjĂ€lp av funktionen ReadFromText frĂ„n Beam.

Batch DataFlow Job (batchbearbetning)

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 (streambearbetning)

frÄn apache_beam.options.pipeline_options import PipelineOptions
frÄn google.cloud import pubsub_v1
frÄn google.cloud import bigquery
import apache_beam som beam
import logging
import argparse
import sys
import 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()

Starta pipelinen

Vi kan starta pipelinen pÄ flera olika sÀtt. Om vi ville, kunde vi helt enkelt köra den lokalt frÄn terminalen, genom att logga in pÄ GCP pÄ distans.

python -m main_pipeline_stream.py 
 --input_topic "projects/user-logs-237110/topics/userlogs" 
 --streaming

Men vi kommer att köra det med hjÀlp av DataFlow. Vi kan göra detta med hjÀlp av kommandot nedan, genom att ange följande obligatoriska parametrar.

  • projekt — ID för ditt GCP-projekt.
  • runner — verktyget som kör pipelinen, som analyserar ditt program och konstruerar din pipeline. För att köra i molnet mĂ„ste du ange DataflowRunner.
  • staging_location — sökvĂ€gen till Cloud Dataflow-molnlagringen för indexering av kodpaket som behövs för att jobba med uppgifterna.
  • temp_location — sökvĂ€gen till Cloud Dataflow-molnlagringen för att lagra temporĂ€ra filuppgifter som skapas under genomförandet av pipelinen.
  • streaming

python main_pipeline_stream.py 
--runner DataFlow 
--project $PROJECT 
--temp_location $BUCKET/tmp 
--staging_location $BUCKET/staging
--streaming

Medan detta kommando körs kan vi gÄ till DataFlow-fliken i Google-konsolen och granska vÄr pipeline. Genom att klicka pÄ pipelinen bör vi se nÄgot som liknar bild 4. För felsökning kan det vara vÀldigt anvÀndbart att gÄ till loggarna och sedan till Stackdriver för att se detaljerade loggar. Detta har hjÀlpt mig att lösa problem med pipelinen i flera fall.

Skapar en datastreamingpipeline. Del 2
Bild 4: Beam-pipeline

Åtkomst till vĂ„ra data i BigQuery

SÄ vi bör redan ha en pipeline igÄng med data som flödar in i vÄr tabell. För att kontrollera detta kan vi gÄ till BigQuery och titta pÄ datan. Efter att ha kört kommandot nedan bör du se de första raderna av datasetet. Nu nÀr vi har data lagrade i BigQuery kan vi göra djupare analyser, dela data med kollegor och börja besvara affÀrsfrÄgor.

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

Skapar en datastreamingpipeline. Del 2
Bild 5: BigQuery

Slutsats

Vi hoppas att det hÀr inlÀgget fungerar som ett nyttigt exempel pÄ att skapa en strömmande datakÀlla och att hitta sÀtt att göra data mer tillgÀngliga. Att lagra data i detta format ger oss mÄnga fördelar. Nu kan vi börja besvara viktiga frÄgor, sÄsom hur mÄnga personer som anvÀnder vÄr produkt? VÀxer vÄr anvÀndarbas över tid? Vilka aspekter av produkten interagerar folk mest med? Och finns det fel dÀr det inte borde finnas? Dessa frÄgor Àr av intresse för organisationen. Baserat pÄ insikterna frÄn svaren pÄ dessa frÄgor kan vi förbÀttra produkten och öka anvÀndarengagemanget.

Beam Àr verkligen anvÀndbar för den hÀr typen av övningar och har ocksÄ en rad andra intressanta anvÀndningsomrÄden. Till exempel kan du analysera data om aktietick i realtid och genomföra affÀrer baserat pÄ analysen. Kanske har du sensordata som kommer frÄn fordon och du vill berÀkna trafiknivÄn. Du kan ocksÄ, till exempel, vara ett spelföretag som samlar in anvÀndardata och anvÀnder den för att skapa instrumentpaneler för att spÄra nyckeltal. Okej, mina damer och herrar, det hÀr Àr en annan diskussion, tack för att du lÀste, och för dem som vill se hela koden, hÀr Àr lÀnken till min GitHub.

https://github.com/DFoly/User_log_pipeline

Det Àr allt. LÀs första delen.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster