Post on 07-Jan-2017
© 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;
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