á¡á¬ážáá¯á¶ážáááºá¹ááá¬áá«á áááºáááºážáá¬ážáá»á¬ážá¡ááœáẠá¡áá°ážááŒááºáááºáá¬ážáá±á¬ áá±á¬ááºážáá«ážá áá±á¬ááºáá¯á¶ážá¡ááá¯ááºážááᯠáá¬áá¬ááŒááºáá»áŸáá±áá¬ážáá«áááºá
á¡áá»áááºááŸáá·áºáááŒá±ážáá® ááá¯ááºááá¯ááºážáá»á¬ážá¡ááœáẠApache Beam ááŸáá·áº DataFlow
Google Cloud ááᯠá áá áºááá·áºááœááºážááŒááºážá
ááŸááºáá»ááº- áá»áœááºá¯ááºááẠPython 3 ááœáẠááá¯ááºááá¯ááºážááᯠáá¯ááºáá±á¬ááºááẠá¡áááºá¡áá²ááŸááá±áá±á¬ááŒá±á¬áá·áº ááá¯ááºááá¯ááºážááá¯áááºáááºáááºááŸáá·áº á áááºááŒáá¯ááºááŸááºáááºážáá±áá¬áá¯ááºáá±ááẠGoogle Cloud Shell ááá¯á¡áá¯á¶ážááŒá¯áá²á·áááºá Apache Beam ááŸáá·áº ááá¯ááá¯ááá¯ááºáá®ááá·áº Google Cloud Shell ááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá
ááá¯ááºááá¯ááºážá
áááºááẠáááºáááºáá»á¬ážááá¯á· á¡áááºážáááºáá°ážááẠááá¯á¡ááºáááºá GCP á¡áááºá á¡áá¯á¶ážáááŒá¯áá°ážáá°áá»á¬ážá¡ááœááºá á€ááœááºáá±á¬áºááŒáá¬ážáá±á¬ á¡á±á¬ááºáá«á¡ááá·áº 6 áá¯ááᯠááá¯ááºáá¬ááá«áááºá
áááºážááŒá®ážáá±á¬ááºá áá»áœááºá¯ááºááá¯á·á script áá»á¬ážááᯠGoogle Cloud Storage ááá¯á· á¡ááºáá¯ááºáá¯ááºááŒá®áž áááºážááá¯á·ááᯠáá»áœááºá¯ááºááá¯á·á Google Cloud Shel ááá¯á· áá°ážáá°ááẠááá¯á¡ááºáá«áááºá cloud ááá¯ááŸá±á¬ááºááŸá¯ááá¯á· á¡ááºáá¯ááºáááºááŒááºážááẠá¡áá±ážá¡ááœá²ááŒá
áºááẠ(áá±á¬áºááŒáá»ááºááᯠááœá±á·ááá¯ááºáááºá
áá¯á¶ 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 ááœááºááá¯ážááºááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒá
áºáááºá á¡á±á¬ááºáá«á¡ááá·áºáá»á¬ážá¡ááá¯ááºáž áá¯ááºáá±á¬ááºááá¯ááºáá«áááºá
áá¯á¶ 3. ááá¬ážá¡ááŒááºá¡áááº
á¡áá¯á¶ážááŒá¯áá°ááŸááºáááºážáá±áá¬ááᯠáá¯ááºááŒááºááŒááºážá
Pub/Sub ááẠáá»áœááºá¯ááºááá¯á·á ááá¯ááºááá¯ááºážá á¡áá±ážááŒá®ážáá±á¬ á¡á áááºá¡ááá¯ááºážáá áºáá¯ááŒá áºááŒá®áž áááºážááẠáá®ážááŒá¬ážááœááºáááºáá±á¬ á¡ááá®áá±ážááŸááºážáá»á¬ážá áœá¬ááᯠáá áºáá¯ááŸáá·áºáá áºáᯠáááºááœááºááá¯ááºá á±áá±á¬ááŒá±á¬áá·áº ááŒá áºáááºá á¡áá°ážáááŒáá·áºá áááºážááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž á¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááŒá¬áž áááºáá±á·áá»áºáá»á¬áž áá±ážááá¯á·áááºáá¶ááá¯ááºá á±ááẠááŒá¬ážáá¶áá áºáá¯á¡áá±ááŒáá·áº áá¯ááºáá±á¬ááºáááºá ááááá¯á¶ážáá¯ááºáááŸá¬á áá±á«ááºážá ááºáá áºáá¯áááºáá®ážáá«á ááœááºááá¯ážááºááŸá Pub/Sub ááá¯á·ááœá¬ážáᬠCREATE TOPIC ááá¯ááŸáááºáá«á
á¡á±á¬ááºáá±á¬áºááŒáá«áá¯ááºááẠá¡áááºáá±á¬áºááŒáá« ááŸááºáááºážáá±áá¬ááᯠáá¯ááºáá¯ááºááẠáá»áœááºá¯ááºááá¯á·á script ááá¯áá±á«áºááá¯ááŒá®áž áá»áááºáááºááŒá®áž ááŸááºáááºážáá»á¬ážááᯠPub/Sub ááá¯á· áá±ážááá¯á·áá«áááºá áá
áºáá¯áááºážáá±á¬ á¡áá¬ááŸá¬ á¡áá¬ááá¹áá¯áá
áºáá¯ááᯠáááºáá®ážáááºááŒá
áºáááºá áá¯ááºáá±áá°áá±á¬ááºáááºáááºážáááºážááᯠá¡áá¯á¶ážááŒá¯á á¡ááŒá±á¬ááºážá¡áá¬ááá¯á· áááºážááŒá±á¬ááºážááᯠáááºááŸááºáá«á topic_path
function ááá¯áá±á«áºáá«á publish
Ñ topic_path
ááŸáá·áºáá±áá¬á áá»áœááºá¯ááºááá¯á· áááºááœááºážááŒá±á¬ááºáž áááááŒá¯áá«á generate_log_line
áá»áœááºá¯ááºááá¯á·á áá¬ááºááœáŸááºážá០stream_logs
ááá¯á·ááŒá±á¬áá·áº á€ááá¯ááºáá»á¬ážááẠáá°áá®áá±á¬ááá¯ááºááœá²ááœáẠááŸááá±ááŒá±á¬ááºáž áá±áá»á¬á
á±áá«á ááá¯á·ááá¯ááºáá«á áááºááẠáááºááœááºážááŸá¯ á¡ááŸá¬ážáá
áºáᯠáááŸááááá·áºáááºá ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·á google console ááá¯á¡áá¯á¶ážááŒá¯á áááºážááᯠrun ááá¯ááºáááº-
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):
# When timeout is unspecified, the exception method waits indefinitely.
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)
ááá¯ááºáááºáááºáááºááŸáá·áºáááŒáá¯ááºáááºá á¡á±á¬ááºáá±á¬áºááŒáá«áá¯á¶ááœááºááŒáá¬ážááá·áºá¡ááá¯ááºáž console ááá¯á· log data á output ááá¯áá»áœááºá¯ááºááá¯á·ááŒááºááá¯ááºáááºááŒá áºáááºá áá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážáááŒá¯áááœá±á· á€áá¬ááºááœáŸááºážááẠá¡áá¯ááºáá¯ááºáá«áááºá 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
. áá¯ááºáá±á¬ááºáá»ááºááẠáá±á¬áºáá¬ááŒá¬ážáá¬ážáá±á¬ á
á¬ááŒá±á¬ááºážááᯠááŒááºáá±ážáááºá á¡áááºá áááºááẠáá¯á¶ááŸááºá¡áá¯á¶ážá¡ááŸá¯ááºážáá»áœááºážáá»ááºáá°ááá¯ááºáá«áá á€á¡áá¬ááᯠá
á
áºáá±ážááŒáá·áºááẠá¡ááŒá¶ááŒá¯ááá¯áá«áááºá datetime
áááºážááá¯á¡áá¯ááºáá¯ááºá
á±ááẠfunction áá
áºáá¯á¡ááœááºážááœááºá ááá¯ááºáá²á·á¡á
ááŸá¬ áááºááœááºážááŸá¯á¡ááŸá¬ážáá
áºáá¯ááœá±á·áá²á·áááºá áá«á áá°ážáááºážáááºá ááá¯á·áá±á¬áẠá€á
á¬áááºážááᯠáá¯ááºáá±á¬ááºáá»ááºááá¯á· áá±ážááá¯á·áááºá WriteToBigQueryááá¯ážááŸááºážá
áœá¬áá»áœááºá¯ááºááá¯á·ááá±áá¬ááá¯ááá¬ážááá¯á·ááá·áºáááºá Batch DataFlow Job ááŸáá·áº Streaming DataFlow Job á¡ááœáẠáá¯ááºááᯠá¡á±á¬ááºááœááºáá±ážáá¬ážáááºá batch ááŸáá·áº streaming code á¡ááŒá¬áž áá
áºáá¯áááºážáá±á¬ ááœá¬ááŒá¬ážáá»ááºááŸá¬ batch ááœáẠáá»áœááºá¯ááºááá¯á·á០CSV ááᯠáááºááŒááºážááŒá
áºáááºá src_path
function ááᯠá¡áá¯á¶ážááŒá¯ ReadFromText
Beam ááŸ
Batch DataFlow Job (batch processing)
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"(?<=[).d+(?=])",
r'"[A-Z][a-z]+', r'"(http|https)://[a-z]+.[a-z]+.[a-z]+']
result = []
for match in PATTERNS:
try:
reg_match = re.search(match, data).group()
if reg_match:
result.append(reg_match)
else:
result.append(" ")
except:
print("There was an error with the regex search")
result = [x.strip() for x in result]
result = [x.replace('"', "") for x in result]
res = ','.join(result)
return res
class Split(beam.DoFn):
def process(self, element):
from datetime import datetime
element = element.split(",")
d = datetime.strptime(element[1], "%d/%b/%Y:%H:%M:%S")
date_string = d.strftime("%Y-%m-%d %H:%M:%S")
return [{
'remote_addr': element[0],
'timelocal': date_string,
'request_type': element[2],
'status': element[3],
'body_bytes_sent': element[4],
'http_referer': element[5],
'http_user_agent': element[6]
}]
def main():
p = beam.Pipeline(options=PipelineOptions())
(p
| 'ReadData' >> 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 á¡áá¯áẠ(á á®ážááŒá±á¬ááºážááᯠáá¯ááºáá±á¬ááºááŒááºáž)
from apache_beam.options.pipeline_options import PipelineOptions
from google.cloud import pubsub_v1
from google.cloud import bigquery
import apache_beam as 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"(?<=[).d+(?=])",
r'"[A-Z][a-z]+', r'"(http|https)://[a-z]+.[a-z]+.[a-z]+']
result = []
for match in PATTERNS:
try:
reg_match = re.search(match, data).group()
if reg_match:
result.append(reg_match)
else:
result.append(" ")
except:
print("There was an error with the regex search")
result = [x.strip() for x in result]
result = [x.replace('"', "") for x in result]
res = ','.join(result)
return res
class Split(beam.DoFn):
def process(self, element):
from datetime import datetime
element = element.split(",")
d = datetime.strptime(element[1], "%d/%b/%Y:%H:%M:%S")
date_string = d.strftime("%Y-%m-%d %H:%M:%S")
return [{
'remote_addr': element[0],
'timelocal': date_string,
'request_type': element[2],
'body_bytes_sent': element[3],
'status': element[4],
'http_referer': element[5],
'http_user_agent': element[6]
}]
def main(argv=None):
parser = argparse.ArgumentParser()
parser.add_argument("--input_topic")
parser.add_argument("--output")
known_args = parser.parse_known_args(argv)
p = beam.Pipeline(options=PipelineOptions())
(p
| 'ReadData' >> 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()
Conveyor á áááºááŒááºážá
ááá¯ááºááá¯ááºážááᯠáá¯á¶á á¶á¡áá»áá¯ážáá»áá¯ážááŒáá·áº ááœááºáááºážááá¯ááºáááºá áá»áœááºá¯ááºááá¯á·á¡ááá¯ááŸááá«áá áá»áœááºá¯ááºááá¯á·ááẠGCP á¡áá±ážááááºážá áá áºááá¯á· á¡áá±á¬áá·áºáááºáá±á áẠterminal á០áááºážááᯠá ááºááœááºážááᬠáá¯ááºáá±á¬ááºááá¯ááºáááºá
python -m main_pipeline_stream.py
--input_topic "projects/user-logs-237110/topics/userlogs"
--streaming
ááá¯á·áá±á¬áºáááºáž áá»áœááºá¯ááºááá¯á·ááẠDataFlow ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºááœá¬ážáááºááŒá áºáááºá á¡á±á¬ááºáá±á¬áºááŒáá« ááá¯á¡ááºááá·áº áá±á¬ááºáá»á¬ážááᯠáááºááŸááºááŒááºážááŒáá·áº á¡á±á¬ááºáá« command ááᯠá¡áá¯á¶ážááŒá¯á áááºážááᯠááŒá¯áá¯ááºááá¯ááºáááºá
project
â ááá·áº GCP ááá±á¬áá»ááºá IDárunner
ááá·áºáááá¯ááááºááᯠááœá²ááŒááºážá áááºááŒá¬ááŒá®áž ááá·áºááá¯ááºááá¯ááºážááᯠáááºáá±á¬ááºáá±ážááá·áº ááá¯ááºááá¯ááºážááŒá±ážáá°ááŒá áºáááºá cloud ááœááºáááºáááºáááºá DataflowRunner ááᯠáááºááŸááºááá«áááºástaging_location
â á¡áá¯ááºáá¯ááºáá±á¬ááºáá±áá±á¬ áááá¯áááºáá¬áá»á¬áž ááá¯á¡ááºáá±á¬ áá¯ááºáááºáá±á·áá»áºáá»á¬ážááᯠááœáŸááºážáááºá¡ááœáẠCloud Dataflow cloud storage ááá¯á· áááºážááŒá±á¬ááºážátemp_location
â ááá¯ááºááá¯ááºážáááºáááºáá±áá»áááºááœáẠáááºáá®ážáá¬ážáá±á¬ áá¬áá®á¡áá¯ááºááá¯ááºáá»á¬ážááᯠááááºážáááºážáááºá¡ááœáẠCloud Dataflow cloud storage ááá¯á· áááºážááŒá±á¬ááºážástreaming
python main_pipeline_stream.py
--runner DataFlow
--project $PROJECT
--temp_location $BUCKET/tmp
--staging_location $BUCKET/staging
--streaming
á€á¡áááá·áºááᯠáá¯ááºáá±á¬ááºáá±áá»áááºááœááºá áá»áœááºá¯ááºááá¯á·ááẠgoogle console ááŸá DataFlow áááºááºááá¯á· ááœá¬ážáᬠáá»áœááºá¯ááºááá¯á·á ááá¯ááºááá¯ááºážááᯠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá ááá¯ááºááá¯ááºážááᯠááŸáááºááá¯ááºáá±á¬á¡áá«á áá¯á¶ 4 ááŸáá·áº áááºáá°ááá·áº á¡áá¬áá áºáá¯ááᯠááœá±á·ááá«áááºá á¡ááŸá¬ážááŸá¬ááŒááºáž áááºááœááºáá»ááºá¡ááœááºá á¡áá±ážá áááºááŸááºáááºážáá»á¬ážááᯠááŒáá·áºááŸá¯ááẠLogs ááá¯á·ááœá¬ážááŒá®ážáá±á¬áẠStackdriver ááá¯á· á¡ááœááºá¡áá¯á¶ážáááºáá«áááºá áá«á ááá á¹á á¡áá±á¬áºáá»á¬ážáá»á¬ážááŸá¬ ááá¯ááºááá¯ááºážááŒá¿áá¬ááœá±ááᯠáá°áá®ááŒá±ááŸááºážáá±ážáááºá
áá¯á¶ 4: Beam conveyor
BigQuery ááœáẠáá»áœááºá¯ááºááá¯á·ááá±áá¬ááᯠáááºáá±á¬ááºááŒáá·áºááŸá¯áá«á
ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·áááá¬ážáá²ááá¯á· áá±áá¬á á®ážáááºážááŸá¯ááŸáá·áºá¡áá° ááœááºáááºážáá¬ážáá±á¬ ááá¯ááºááá¯ááºážáá áºáᯠááŸáááá·áºááŒá®ážááŒá áºáááºá áááºážááá¯á ááºážáááºáááºá¡ááœáẠBigQuery ááá¯á·ááœá¬ážá áá±áá¬ááá¯ááŒáá·áºááŸá¯ááá¯ááºáá«áááºá á¡á±á¬ááºáá« command ááá¯áá¯á¶ážááŒá®ážáá±á¬áẠdataset áááááááºážá¡áááºážáááºááá¯ááœá±á·ááá«áááºá ááᯠáá»áœááºá¯ááºááá¯á·ááœáẠBigQuery ááœáẠááááºážáááºážáá¬ážáá±á¬ áá±áá¬ááᯠáááºáá¶ááœá²ááŒááºážá áááºááŒá¬ááá¯ááºááá·áºá¡ááŒáẠáá±áá¬áá»á¬ážááᯠáá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬ážááŸáá·áº áá»áŸáá±áᬠáá¯ááºáááºážááá¯ááºáá¬áá±ážááœááºážáá»á¬ážááᯠá áááºááŒá±ááá¯ááá¯ááºáá«áááºá
SELECT * FROM `user-logs-237110.userlogs.logdata` LIMIT 10;
áá¯á¶ 5- BigQuery
áá±á¬ááºáá»ááº
á€ááá¯á·á áºááẠááá¯ááºááá¯ááºáá¯ááºááœáŸáá·áºááá·áºáá±áá¬ááá¯ááºááá¯ááºážáááºáá®ážááŒááºážá¡ááœáẠá¡áá¯á¶ážáááºáá±á¬á¥ááá¬áá áºáá¯á¡ááŒá Ạá¡áá¯á¶ážááŒá¯ááá¯ááºááá·áºá¡ááŒáẠáá±áá¬ááá¯ááá¯áááŸáááá¯ááºá á±ááẠáááºážáááºážáá»á¬ážááŸá¬ááœá±ááẠáá»áœááºá¯ááºááá¯á·áá»áŸá±á¬áºááá·áºáá«áááºá á€áá±á¬áºáááºááœáẠáá±áá¬ááááºážáááºážááŒááºážááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž á¡áá»áá¯ážáá»á±ážáá°ážáá»á¬ážá áœá¬ áá±ážáá«áááºá ááᯠáá»áœááºá¯ááºááá¯á·ááá¯ááºáá¯ááºááᯠáá°áááºááŸá áºáá±á¬ááºá¡áá¯á¶ážááŒá¯áááºáá²á·ááá¯á·áá±á¬ á¡áá±ážááŒá®ážáá±ážááœááºážáá»á¬ážááᯠá áááºááŒá±ááá¯ááá¯ááºáá«ááŒá®á ááá·áºá¡áá¯á¶ážááŒá¯áá°á¡ááŒá±áá¶ááẠá¡áá»áááºááŸáá·áºá¡áá»áŸ ááá¯ážáááºáá±áá«ááá¬ážá áá¯ááºáá á¹á ááºážáá²á· áááºá¡áá»ááºááœá±á áá°ááœá±áá²á· á¡áá»á¬ážáá¯á¶áž ááááœá±á·áááºáá¶ááá²á áááŒá áºááá·áºáá²á·áá±áá¬ááœá±ááŸá¬ á¡ááŸá¬ážááœá±ááŸááá¬ážá áá«ááœá±á á¡ááœá²á·á¡á ááºážá¡ááœáẠá áááºáááºá á¬ážáááá·áº áá±ážááœááºážááœá±áá«á á€áá±ážááœááºážáá»á¬ážá á¡ááŒá±áá»á¬ážá០ááœááºáá±á«áºáá¬áá±á¬ ááá¯ážááœááºážááááŒááºááŸá¯áá»á¬ážá¡áá±á«áº á¡ááŒá±áá¶á áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáá¯ááºááᯠááŒáŸáá·áºáááºááá¯ááºááŒá®áž áá¯á¶ážá áœá²áá°áá»á¬ážá ááááœá±á·áááºáá¶ááŸá¯ááᯠááá¯ážááŒáŸáá·áºááá¯ááºáá«áááºá
Beam ááẠá€áá±á·áá»áá·áºáááºážá¡áá»áá¯ážá¡á á¬ážá¡ááœáẠá¡ááŸááºááááºá¡áá¯á¶ážáááºááŒá®áž á¡ááŒá¬ážá áááºáááºá á¬ážááœááºáá±á¬ááºážáá±á¬ á¡áá¯á¶ážááŒá¯ááŸá¯ááá á¹á áá»á¬ážá áœá¬áááºážáá«ááŸááááºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºááẠá áá±á¬á·ááºá¡ááŸááºá¡áá¬áž á¡áá»ááºá¡áááºááᯠá¡áá»áááºááŸáá·áºáááŒá±ážáá® ááœá²ááŒááºážá áááºááŒá¬ááŒá®áž ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡áá±á«áº á¡ááŒá±áá¶á á¡áá±á¬ááºážá¡áááºááŒá¯áá¯ááºááá¯ááá¯ááºáááºá ááá·áºááœáẠáá¬ááºáá»á¬ážááŸáá¬áá±á¬ á¡á¬áá¯á¶áá¶áááááá¬áá±áá¬ááŸáááŒá®áž áá¬ááºá¡ááœá¬ážá¡áá¬á¡ááá·áº ááœááºáá»ááºááŸá¯áá»á¬ážááᯠááœááºáá»ááºááá¯áá±áááºá á¥ááá¬á¡á¬ážááŒáá·áº áááºááẠáá¯á¶ážá áœá²áá°áá±áá¬ááᯠá á¯áá±á¬ááºážááŒá®áž áá±á¬á·áááºááá áºáá»á¬ážááᯠááŒá±áá¬áá¶ááẠáááºááŸáºáá¯ááºáá»á¬ážáááºáá®ážááẠáááºážááá¯á¡áá¯á¶ážááŒá¯ááá·áº ááááºážáá¯áá¹ááá®áá áºáá¯áááºáž ááŒá áºááá¯ááºáááºá á¡áá¯áá±á áá°ááŒá®ážáááºážá á€á¡ááŒá±á¬ááºážá¡áá¬ááẠáááºááŸá¯ááŒááºážá¡ááœáẠáá»á±ážáá°ážáááºáá«áááºá áá¯ááºá¡ááŒáá·áºá¡á á¯á¶ááᯠááŒáá·áºááá¯áá°áá»á¬ážá¡ááœáẠá¡á±á¬ááºááœáẠáá»áœááºá¯ááºá GitHub ááá·áºááºááᯠáááºááŸá¯ááá¯ááºáá«áááºá
áá«á¡á¬ážáá¯á¶ážáá«áá²
source: www.habr.com