Como construir sua primeira aplicação de Big Data na AWS

Preview:

Citation preview

© 2015, Amazon Web Services, Inc. or its Affiliates. All rights reserved.

Hugo Rozestraten, Arquiteto de Soluções

14 de Setembro de 2016

Criação do seu primeiro aplicativo de big data na AWS

Amazon S3

Amazon Kinesis

Amazon DynamoDB

Amazon RDS (Aurora)

AWS Lambda

KCL Apps

Amazon EMR

Amazon Redshift

Amazon MachineLearning

Coletar Processar AnalisarArmazenar

Coleta de dadose armazenamento

Processamentode dados

Processamentode eventos

Análise de dados

Dados Respostas

Ecossistema de big data na AWS

Seu primeiro aplicativo de big data na AWSR

egis

tros

Kinesis EMR RedshiftS3

?

Ecossistema de big data na AWS - Coletar

Kinesis

Reg

istro

s

S3

Coletar Processar AnalisarArmazenar

Dados Respostas

EMR

Ecossistema de big data na AWS - Processar

EMRS3

Coletar Processar

AnalisarArmazenar

Dados Respostas

Ecossistema de big data na AWS - Analisar

S3 Redshift

Coletar Processar

AnalisarArmazenar

Dados Respostas

SQL

Configuração

Recursos

1. Interface da linha de comando da AWS (aws-cli) configurada

2. Fluxo do Amazon Kinesis com um único fragmento

3. Bucket do Amazon S3 para manter os arquivos

4. Cluster do Amazon EMR (dois nós) com Spark e Hive

5. Cluster de data warehouse do Amazon Redshift (nó único)

Amazon Kinesis

Criar um fluxo do Amazon Kinesis para manter os dados de entrada:

aws kinesis create-stream \ --stream-name AccessLogStream \ --shard-count 1

Amazon S3

Criar um bucket do Amazon S3 para manter os arquivos para processamento do Amazon EMR, e arquivos de entrada para o Amazon Redshift:

aws s3 mb s3://NOME DO SEU BUCKET

Amazon EMR

Iniciar um cluster de três instâncias com Spark e Hive instalados:

aws emr create-cluster \ --name "demo" \ --instance-type m3.xlarge \ --instance-count 2 \ --region=SUA REGIÃO DA AWS \ --release-label emr-4.0.0 \ --ec2-attributes KeyName=SUA CHAVE SSH DA AWS \ --use-default-roles \ --applications Name=Hive Name=Spark

Amazon Redshift

Criar data warehouse do Amazon Redshift de nó único:

aws redshift create-cluster \ --cluster-identifier demo \ --db-name demo \ --node-type dc1.large \ --cluster-type single-node \ --master-username master \ --master-user-password ESCOLHA UMA SENHA DO REDSHIFT \ --publicly-accessible \ --port 8192

Seu primeiro aplicativo de big data na AWS

Reg

istro

s

1. COLETAR: Fluxo de dados para o Kinesis com Log4J

2. PROCESSAR: Processar dadoscom EMR usando Spark e Hive

Kinesis

EMRS3

Redshift

3. ANALISAR: Analisar dados no Redshift usando SQL

ARMAZENAR

SQL

1. Coletar

Amazon Kinesis Log4J Appender

Baixe o Log4J Appender:

wget http://emr-kinesis.s3.amazonaws.com/publisher/\kinesis-log4j-appender-1.0.0.jar

Baixe e salve o arquivo de registro Apache de amostra:

wget http://elasticmapreduce.s3.amazonaws.com/samples/\pig-apache/input/access_log_1

Amazon Kinesis Log4J Appender

Arquivo de credenciais AwsCredentials.properties com estas credenciais o usuário do IAM que tenha permissão para acesso ao Amazon Kinesis:

accessKey=YOUR-IAM-ACCESS-KEYsecretKey=YOUR-SECRET-KEY

Então inicie o Amazon Kinesis Log4J Appender:

java -cp .:kinesis-log4j-appender-1.0.0.jar \com.amazonaws.services.kinesis.log4j.FilePublisher \access_log_1 &

Formato do arquivo de registro

75.35.230.210 - - [20/Jul/2009:22:22:42 -0700] "GET /images/pigtrihawk.jpg HTTP/1.1" 200 29236 "http://www.swivel.com/graphs/show/1163466" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)"

Spark

•Mecanismo rápido e básico para processamento de dados em grande escala

•Grave aplicativos rapidamente em Java, Scala ou Python

•Combine SQL, streaming e análises complexas.

Uso do Spark no EMR

Use SSH para fazer login no cluster:

ssh -i SUA CHAVE SSH DA AWS NOME DO HOST DO EMR

Inicie o shell do Spark:

spark-shell --jars /usr/lib/spark/extras/lib/spark-streaming-kinesis-asl.jar,amazon-kinesis-client-1.5.1.jar

Amazon Kinesis e streaming do Spark

Produtor AmazonKinesis

AmazonS3

DynamoDB

KCL

O streaming do Spark usa KCL para o Kinesis

AmazonEMR

O aplicativo de streaming do Spark para ler do Kinesis e gravar no S3

Streaming do Spark - Leitura do Kinesis

/* Setup the KinesisClient */val kinesisClient = new AmazonKinesisClient(new DefaultAWSCredentialsProviderChain())

/* Determine the number of shards from the stream */val numShards = kinesisClient.describeStream(streamName).getStreamDescription().getShards().size()

/* Create a streaming context and then create one worker per shard */val ssc = new StreamingContext(sc, outputInterval)val kinesisStreams = (0 until numShards).map { i => KinesisUtils.createStream(ssc, streamName, endpointUrl,outputInterval,InitialPositionInStream.LATEST, StorageLevel.MEMORY_ONLY)}

Streaming do Spark - Gravação no S3

/* Merge the worker Dstreams and translate the byteArray to string */val unionStreams = ssc.union(kinesisStreams)val accessLogs = unionStreams.map(byteArray => new String(byteArray))

/* Write each RDD to Amazon S3*/accessLogs.foreachRDD( (rdd,time) => { if (rdd.count > 0) { val outPartitionFolder = new java.text.SimpleDateFormat("'year='yyyy/'month='MM/'day='dd/'hour='hh/'min='mm").format(new Date(time.milliseconds)) rdd.saveAsTextFile("%s/%s".format(outputDir,outPartitionFolder),classOf[GzipCodec])}})

Visualizar os arquivos de saída no Amazon S3Liste todos os prefixos de partição:

aws s3 ls s3://SEU BUCKET DO S3/access-log-raw/ --recursive

Liste todos os arquivos de saída:

aws s3 ls s3://SEU BUCKET DO S3/access-log-raw/year=aaaa/month=mm/day=dd/hour=HH/

2. Processar

Hive do Amazon EMR

Adapta a consulta como SQL (HiveQL) para execução no Hadoop

Esquema na leitura: mapeie a tabela para os dados de entrada

Acessar dados em Amazon S3, Amazon DymamoDB e Amazon Kinesis

Consultar formatos de entrada complexos usando SerDe

Transformar dados com funções definidas pelo usuário (UDF)

Uso do Hive no Amazon EMR

Use SSH para fazer login no cluster:

ssh -i SUA CHAVE SSH DA AWS NOME DO HOST DO EMR

Iniciar Hive:

hive

Criar uma tabela que aponte para o bucket do Amazon S3

CREATE EXTERNAL TABLE access_log_raw( host STRING, identity STRING, user STRING, request_time STRING, request STRING, status STRING, size STRING, referrer STRING, agent STRING)PARTITIONED BY (year INT, month INT, day INT, hour INT, min INT)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?") LOCATION 's3://SEU BUCKET DO S3/access-log-raw';

msck repair table access_log_raw;

Processar dados usando o Hive

Transformaremos os dados que são retornados pela consulta antes de gravá-los na tabela Hive externa armazenada no Amazon S3

Funções definidas pelo usuário (UDF) do Hive em uso para as transformações de texto: from_unixtime, unix_timestamp e hour

O valor de "hour" é importante: ele é usado para dividir e organizar os arquivos de saída antes de gravar no Amazon S3. Com essas divisões, podemos carregar os dados com mais eficiência no Amazon Redshift depois no laboratório com o comando "COPY" paralelo

Criar uma tabela Hive externa no Amazon S3

CREATE EXTERNAL TABLE access_log_processed ( request_time STRING, host STRING, request STRING, status INT, referrer STRING, agent STRING)PARTITIONED BY (hour STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION 's3://SEU BUCKET DO S3/access-log-processed';

Configurar partição e compactação

-- configurar "particionamento dinâmico" do Hive-- isso dividirá os arquivos de saída ao gravar no Amazon S3SET hive.exec.dynamic.partition.mode=nonstrict;SET hive.exec.dynamic.partition=true;

-- compactar arquivos de saída no Amazon S3 usando GzipSET mapred.output.compress=true;SET hive.exec.compress.output=true;SET mapred.output.compression.codec= org.apache.hadoop.io.compress.GzipCodec;SET io.compression.codecs= org.apache.hadoop.io.compress.GzipCodec;

Consultar Hive e gravar saída no Amazon S3

-- converter carimbo de data/hora do registro do Apache em um carimbo de data/hora do UNIX-- dividir arquivos no Amazon S3 pela hora nas linhas do registroINSERT OVERWRITE TABLE access_log_processed PARTITION (hour) SELECT from_unixtime(unix_timestamp(request_time, '[dd/MMM/yyyy:HH:mm:ss Z]')), host, request, status, referrer, agent, hour(from_unixtime(unix_timestamp(request_time, '[dd/MMM/yyyy:HH:mm:ss Z]'))) como hora FROM access_log_raw;

Visualização do status da tarefahttp://127.0.0.1/9026

Visualizar os arquivos de saída no Amazon S3

Liste todos os prefixos de partição:

aws s3 ls s3://SEU BUCKET DO S3/access-log-processed/

Liste um dos arquivos de saída divididos:

aws s3 ls s3://SEU BUCKET DO S3/access-log-processed/hour=22/

Spark SQL

Módulo do Spark para trabalhar com dados estruturados usando SQL

Execute consultas Hive não modificadas nos dados existentes.

Uso do Spark-SQL no Amazon EMR

Use SSH para fazer login no cluster:

ssh -i SUA CHAVE SSH DA AWS NOME DO HOST DO EMR

Iniciar Hive:

spark-sql

Consultar os dados com o Spark

-- retornar a primeira linha no fluxoSELECT * FROM access_log_raw LIMIT 1;

-- retornar todos os itens contados no fluxoSELECT COUNT(1) FROM access_log_raw ;

-- encontrar os 10 hosts principaisSELECT host, COUNT(1) FROM access_log_raw GROUP BY host ORDER BY 2 DESC LIMIT 10;

3. Analisar

Conectar ao Amazon Redshift

# using the PostgreSQL CLIpsql -h ENDPOINT DO REDSHIFT \ -p 8192 -U master demo

Ou use qualquer cliente JDBC ou ODBC SQL com os drivers PostgreSQL 8.x ou suporte nativo do Redshift

• Aginity Workbench para Amazon Redshift• SQL Workbench/J

Criar uma tabela do Amazon Redshift para manter os dadosCREATE TABLE accesslogs ( request_time timestamp, host varchar(50), request varchar(1024), status int, referrer varchar(1024), agent varchar(1024))DISTKEY(host)SORTKEY(request_time);

Carregamento de dados no Amazon Redshift

O comando "COPY" carrega arquivos paralelamente

COPY accesslogs FROM 's3://SEU BUCKET DO S3/access-log-processed' CREDENTIALS 'aws_access_key_id=SUA CHAVE DE ACESSO DO IAM; aws_secret_access_key=SUA CHAVE SECRETA DO IAM'DELIMITER '\t' IGNOREHEADER 0 MAXERROR 0 GZIP;

Consultas de teste do Amazon Redshift

-- encontrar distribuição de códigos de status ao longo dos diasSELECT TRUNC(request_time),status,COUNT(1) FROM accesslogs GROUP BY 1,2 ORDER BY 1,3 DESC;

-- encontrar os códigos de status 404SELECT COUNT(1) FROM accessLogs WHERE status = 404;

-- mostrar todas as solicitações de status como PÁGINA NÃO ENCONTRADASELECT TOP 1 request,COUNT(1) FROM accesslogs WHERE status = 404 GROUP BY 1 ORDER BY 2 DESC;

Seu primeiro aplicativo de big data na AWSR

egi

stro

s

Kinesis EMR RedshiftS3

Um favicon corrigiria 398 dos 977 erros de PÁGINA NÃO ENCONTRADA (404) no total

... pelo mesmo preço de uma xícara de café

Experimente na nuvem AWS...

Serviço Custo estimado*

Amazon Kinesis $1.00

Amazon S3 (nível gratuito) $0

Amazon EMR $0.44

Amazon Redshift $1.00

Total estimado $2.44*O custo estimado presume: uso do nível gratuito onde disponível, instâncias de custo mais baixo, conjunto de dados com no máximo 10 MB e instâncias em execução por menos de 4 horas. Os custos podem variar dependendo das opções selecionadas, do tamanho do conjunto de dados e do uso.

$3.50

Obrigado

Blog de Big Data da AWSblogs.aws.amazon.com/bigdata

Recommended