O documento discute o framework Spark para processamento de grandes dados. Spark é um framework open-source que facilita o processamento de grandes volumes de dados de forma distribuída através de recursos como DataFrames, SQL, machine learning e streaming. O documento também descreve como a Globo.com usa Spark para análises, recomendações e machine learning com volumes de dados de até 3.5 bilhões de eventos por dia.
5. NÃO É DE COMER, EU ACHO..
É UM FRAMEWORK
▸ Simples e Performático
▸ Processamento de grandes dados
▸ Descomplicando “big data”
▸ Para desenvolvedores
▸ Estatísticos Friendly
▸ DataFrames estilo Pandas e R
▸ Multi linguagens e databases
▸ Além do Map/Reduce
8. DATASET É A FORMA QUE O SPARK
CONSEGUE SER PERFORMÁTICO, ELE CRIA
“MAGICAMENTE" UM PLANO DE AÇÃO
DISTRIBUÍDO SOBRE AQUELA AÇÃO.
DATASET É LINDO - DATAFRAME É O NOVO DATASET[ROW]
9. GRANDESDADOS.COM
PRA QUE USAMOS NA GLOBO.COM
▸ recommendation
▸ machine learning
▸ analytics
▸ a/b test
▸ pipeline
▸ workflow
▸ data driven organization
10. ▸ + 50 jobs em produção nesse
momento
▸ Streaming e Batch
▸ Scala e Python
▸ MLlib e SQL
▸ Desde a versão 0.9, 2013
▸ +120 pessoas já usaram na
globo.com
E AÍ VCS USAM MESMO?
11. UM DOS MAIORES CASES DO BRASIL
SHOW ME THE NUMBERS
▸ 50 milhões de usuários únicos
mês
▸ 3.5 bilhões de eventos por dia
▸ 100 mil novos conteúdos
▸ 1 milhão de conexões
simultâneas
12. ▸ SQL
▸ Algoritmos prontos
▸ Otimizações gratuitas
▸ Open-Souce
▸ Comunidade enorme
▸ maior projeto da apache
▸ n consultorias
VOU TER QUE APRENDER UM MUNDO NOVO?
17. val pageview = spark.read.parquet(path)
val pvByUserAndProduct = pageview
.groupBy("user", "product")
.count()
pvByUserAndProduct.describe().show()
summary count
count 25236
mean 2.45276
stddev 2.02837
min 1
max 40
18. val pvValidUsers = removeFromPartitions(pvByUserAndProduct)
def removeFromPartitions(df: DataFrame): DataFrame = {
df.cache()
val partitions = df.select("product").distinct().collect()
val cleanedPartitionsData = partitions.par.map { row =>
val partition = row(0)
val partitionData = df.filter(df("product") === partition)
val cutted = cut99(partitionData)
partitionData.filter(partitionData("count") < cutted)
}
val result = cleanedPartitionsData.reduce[DataFrame] {
case (leftDF, rightDF) => leftDF union rightDF
}
result
}
def cut99(df: DataFrame): Double = {
df.stat.approxQuantile("count", Array(0.99), 0.001).head
}
19. val pvValidUsers = removeFromPartitions(pvByUserAndProduct)
pvValidUsers.describe().show()
summary count
count 24983
mean 2.33754
stddev 1.79223
min 1
max 9