Intr Intro o to Spark to Spark and Spark and Spark SQL SQL AMP - - PowerPoint PPT Presentation

intr intro o to spark to spark and spark and spark sql sql
SMART_READER_LITE
LIVE PREVIEW

Intr Intro o to Spark to Spark and Spark and Spark SQL SQL AMP - - PowerPoint PPT Presentation

Intr Intro o to Spark to Spark and Spark and Spark SQL SQL AMP Camp 2014 Michael Armbrust - @michaelarmbrust What is Apache Spark? Fast and general cluster computing system, interoperable with Hadoop, included in all major distros


slide-1
SLIDE 1

Intr Intro

  • to Spark

to Spark and Spark and Spark SQL SQL

Michael Armbrust - @michaelarmbrust AMP Camp 2014

slide-2
SLIDE 2

What is Apache Spark?

Fast and general cluster computing system, interoperable with Hadoop, included in all major distros Improves efficiency through:

> In-memory computing primitives > General computation graphs

Improves usability through:

> Rich APIs in Scala, Java, Python > Interactive shell

Up to 100× faster (2-10× on disk) 2-5× less code

slide-3
SLIDE 3

Spark Model

Write programs in terms of transformations on distributed datasets Resilient Distributed Datasets (RDDs)

> Collections of objects that can be stored in memory

  • r disk across a cluster

> Parallel functional transformations (map, filter, …) > Automatically rebuilt on failure

slide-4
SLIDE 4

More than Map & Reduce

map filter groupBy sort union join leftOuterJoin rightOuterJoin reduce count fold reduceByKey groupByKey cogroup cross zip sample take first partitionBy mapWith pipe save ... ...

slide-5
SLIDE 5

Example: Log Mining

Load error messages from a log into memory, then interactively search for various patterns

val ¡lines ¡= ¡spark.textFile(“hdfs://...”) ¡ val ¡errors ¡= ¡lines.filter(_ ¡startswith ¡“ERROR”) ¡ val ¡messages ¡= ¡errors.map(_.split(“\t”)(2)) ¡ messages.cache() ¡ lines Block 1 lines Block 2 lines Block 3

Worker Worker Worker Driver

messages.filter(_ ¡contains ¡“foo”).count() ¡ messages.filter(_ ¡contains ¡“bar”).count() ¡ . . . tasks results messages Cache 1 messages Cache 2 messages Cache 3

Base RDD Transformed RDD Action

Result: Result: full-text search of Wikipedia in <1 sec (vs 20 sec for on-disk data) Result: Result: scaled to 1 TB data in 5-7 sec (vs 170 sec for on-disk data)

slide-6
SLIDE 6

A General Stack

Spark

Spark Streaming

real-time

Spark

SQL

GraphX

graph

MLlib

machine learning

Spark

SQL

slide-7
SLIDE 7

20000 40000 60000 80000 100000 120000 140000 Hadoop MapReduce Storm (Streaming) Impala (SQL) Giraph (Graph) Spark non-test, non-example source lines

Powerful Stack – Agile Development

slide-8
SLIDE 8

20000 40000 60000 80000 100000 120000 140000 Hadoop MapReduce Storm (Streaming) Impala (SQL) Giraph (Graph) Spark non-test, non-example source lines Streaming

Powerful Stack – Agile Development

slide-9
SLIDE 9

20000 40000 60000 80000 100000 120000 140000 Hadoop MapReduce Storm (Streaming) Impala (SQL) Giraph (Graph) Spark non-test, non-example source lines SparkSQL Streaming

Powerful Stack – Agile Development

slide-10
SLIDE 10

Powerful Stack – Agile Development

20000 40000 60000 80000 100000 120000 140000 Hadoop MapReduce Storm (Streaming) Impala (SQL) Giraph (Graph) Spark non-test, non-example source lines GraphX Streaming SparkSQL

slide-11
SLIDE 11

Powerful Stack – Agile Development

20000 40000 60000 80000 100000 120000 140000 Hadoop MapReduce Storm (Streaming) Impala (SQL) Giraph (Graph) Spark non-test, non-example source lines GraphX Streaming SparkSQL Your App?

slide-12
SLIDE 12

Community Growth

20 40 60 80 100 120 140 160 180 200 0.6.0 0.7.0 0.8.0 0.9.0 1.0.0 1.1.0

slide-13
SLIDE 13

Not Just for In-Memory Data

Hadoop Record Spark 100TB Spark 1PB Data Size 102.5TB 100TB 1000TB Time 72 min 23 min 234 min # Cores 50400 6592 6080 Rate 1.42 TB/min 4.27 TB/min 4.27 TB/min Environment Dedicate Cloud (EC2) Cloud (EC2)

slide-14
SLIDE 14

SQL Overview

  • Newest component of Spark initially

contributed by databricks (< 1 year old)

  • Tightly integrated way to work with structured

data (tables with rows/columns)

  • Transform RDDs using SQL
  • Data source integration: Hive, Parquet, JSON,

and more

slide-15
SLIDE 15

Shark modified the Hive backend to run over Spark, but had two challenges:

> Limited integration with Spark programs > Hive optimizer not designed for Spark

Spark SQL reuses the best parts of Shark:

Relationship to

Borrows

  • Hive data loading
  • In-memory column store

Adds

  • RDD-aware optimizer
  • Rich language interfaces
slide-16
SLIDE 16

Adding Schema to RDDs

Spark + RDDs

Functional transformations on partitioned collections of opaque

  • bjects.

SQL + SchemaRDDs

Declar Declarati ative ve transformations on partitioned collections of tuples. .

User User User User User User Name Age Height Name Age Height Name Age Height Name Age Height Name Age Height Name Age Height

slide-17
SLIDE 17

SchemaRDDs: More than SQL

{JSON} ¡

SchemaRDD

Image credit: http://barrymieny.deviantart.com/

SQL

QL

Parquet

MLlib

Unified interface for structured data

JDBC ODBC

slide-18
SLIDE 18

Getting Started: Spark SQL

SQLContext/HiveContext ¡

  • Entry point for all SQL functionality
  • Wraps/extends existing spark context

from ¡pyspark.sql ¡import ¡SQLContext ¡ sqlCtx ¡= ¡SQLContext(sc) ¡ ¡

slide-19
SLIDE 19

Example Dataset

A text file filled with people’s names and ages: ¡ Michael, ¡30 ¡ Andy, ¡31 ¡ … ¡

slide-20
SLIDE 20

RDDs as Relations (Python)

¡ ¡ # Load a text file and convert each line to a dictionary. lines = sc.textFile("examples/…/people.txt") parts = lines.map(lambda lambda l: l.split(",")) people = parts.map(lambda lambda p: Row(name=p[0],age=int(p[1]))) # Infer the schema, and register the SchemaRDD as a table peopleTable = sqlCtx.inferSchema(people) peopleTable.registerAsTable("people")

slide-21
SLIDE 21

RDDs as Relations (Scala)

val ¡sqlContext ¡= ¡new ¡org.apache.spark.sql.SQLContext(sc) ¡ import ¡sqlContext._ ¡ ¡ // ¡Define ¡the ¡schema ¡using ¡a ¡case ¡class. ¡ case ¡class ¡Person(name: ¡String, ¡age: ¡Int) ¡ // ¡Create ¡an ¡RDD ¡of ¡Person ¡objects ¡and ¡register ¡it ¡as ¡a ¡table. ¡ val ¡people ¡= ¡ ¡ ¡sc.textFile("examples/src/main/resources/people.txt") ¡ ¡ ¡ ¡ ¡.map(_.split(",")) ¡ ¡ ¡ ¡ ¡.map(p ¡=> ¡Person(p(0), ¡p(1).trim.toInt)) ¡ ¡ people.registerAsTable("people") ¡ ¡ ¡

slide-22
SLIDE 22

RDDs as Relations (Java)

public ¡class ¡Person ¡implements ¡Serializable ¡{ ¡ ¡ ¡private ¡String ¡_name; ¡ ¡ ¡private ¡int ¡_age; ¡ ¡ ¡public ¡String ¡getName() ¡{ ¡return ¡_name; ¡ ¡} ¡ ¡ ¡public ¡void ¡setName(String ¡name) ¡{ ¡_name ¡= ¡name; ¡} ¡ ¡ ¡public ¡int ¡getAge() ¡{ ¡return ¡_age; ¡} ¡ ¡ ¡public ¡void ¡setAge(int ¡age) ¡{ ¡_age ¡= ¡age; ¡} ¡ } ¡ ¡ JavaSQLContext ¡ctx ¡= ¡new ¡org.apache.spark.sql.api.java.JavaSQLContext(sc) ¡ JavaRDD<Person> ¡people ¡= ¡ctx.textFile("examples/src/main/resources/ people.txt").map( ¡ ¡ ¡new ¡Function<String, ¡Person>() ¡{ ¡ ¡ ¡ ¡ ¡public ¡Person ¡call(String ¡line) ¡throws ¡Exception ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡String[] ¡parts ¡= ¡line.split(","); ¡ ¡ ¡ ¡ ¡ ¡ ¡Person ¡person ¡= ¡new ¡Person(); ¡ ¡ ¡ ¡ ¡ ¡ ¡person.setName(parts[0]); ¡ ¡ ¡ ¡ ¡ ¡ ¡person.setAge(Integer.parseInt(parts[1].trim())); ¡ ¡ ¡ ¡ ¡ ¡ ¡return ¡person; ¡ ¡ ¡ ¡ ¡} ¡ ¡ ¡}); ¡ JavaSchemaRDD ¡schemaPeople ¡= ¡sqlCtx.applySchema(people, ¡Person.class); ¡ ¡ ¡ ¡

slide-23
SLIDE 23

Querying Using SQL

# ¡SQL ¡can ¡be ¡run ¡over ¡SchemaRDDs ¡that ¡have ¡been ¡registered ¡ # ¡as ¡a ¡table. ¡ teenagers ¡= ¡sqlCtx.sql(""" ¡ ¡ ¡SELECT ¡name ¡FROM ¡people ¡WHERE ¡age ¡>= ¡13 ¡AND ¡age ¡<= ¡19""") ¡ ¡ # ¡The ¡results ¡of ¡SQL ¡queries ¡are ¡RDDs ¡and ¡support ¡all ¡the ¡normal ¡ # ¡RDD ¡operations. ¡ teenNames ¡= ¡teenagers.map(lambda ¡p: ¡"Name: ¡" ¡+ ¡p.name) ¡ ¡

slide-24
SLIDE 24

Spark SQL includes a server that exposes its data using JDBC/ODBC

  • Query data from HDFS/S3,
  • Including formats like Hive/Parquet/JSON*
  • Support for caching data in-memory

* Coming in Spark 1.2

¡ ¡

Existing Tools, New Data Sources

slide-25
SLIDE 25

Caching Tables In-Memory

Spark SQL can cache tables using an in-memory columnar format:

  • Scan only required columns
  • Fewer allocated objects (less GC)
  • Automatically selects best compression

cacheTable("people") schemaRDD.cache() – *Requires Spark 1.2

slide-26
SLIDE 26

Caching Comparison

Spark MEMORY_ONLY Caching SchemaRDD Columnar Caching

ByteBuffer ByteBuffer ByteBuffer

User Object User Object User Object User Object User Object User Object Name Age Height Name Age Height Name Age Height Name Age Height Name Age Height Name Age Height java.lang.String java.lang.String java.lang.String java.lang.String java.lang.String java.lang.String

slide-27
SLIDE 27

Language Integrated UDFs

registerFunction(“countMatches”, ¡ ¡ ¡lambda ¡(pattern, ¡text): ¡ ¡ ¡ ¡ ¡ ¡re.subn(pattern, ¡'', ¡text)[1]) ¡ ¡ sql("SELECT ¡countMatches(‘a’, ¡text)…") ¡

slide-28
SLIDE 28

SQL and Machine Learning

training_data_table ¡= ¡sql(""" ¡ ¡ ¡SELECT ¡e.action, ¡u.age, ¡u.latitude, ¡u.logitude ¡ ¡ ¡ ¡ ¡FROM ¡Users ¡ ¡u ¡ ¡ ¡ ¡ ¡ ¡ ¡JOIN ¡Events ¡e ¡ON ¡u.userId ¡= ¡e.userId""") ¡ ¡ def ¡featurize(u): ¡ ¡LabeledPoint(u.action, ¡[u.age, ¡u.latitude, ¡u.longitude]) ¡ ¡ // ¡SQL ¡results ¡are ¡RDDs ¡so ¡can ¡be ¡used ¡directly ¡in ¡Mllib. ¡ training_data ¡= ¡training_data_table.map(featurize) ¡ model ¡= ¡new ¡LogisticRegressionWithSGD.train(training_data) ¡

slide-29
SLIDE 29

Machine Learning Pipelines

// ¡training:{eventId:String, ¡features:Vector, ¡label:Int} ¡ val ¡training ¡= ¡parquetFile("/path/to/training") ¡ val ¡lr ¡= ¡new ¡LogisticRegression().fit(training) ¡ ¡ // ¡event: ¡{eventId: ¡String, ¡features: ¡Vector} ¡ val ¡event ¡= ¡parquetFile("/path/to/event") ¡ val ¡prediction ¡= ¡ ¡ ¡ ¡lr.transform(event).select('eventId, ¡'prediction) ¡ ¡ prediction.saveAsParquetFile("/path/to/prediction”) ¡

slide-30
SLIDE 30

Reading Data Stored in Hive

from ¡pyspark.sql ¡import ¡HiveContext ¡ hiveCtx ¡= ¡HiveContext(sc) ¡ ¡ ¡ ¡ hiveCtx.hql(""" ¡ ¡ ¡ ¡CREATE ¡TABLE ¡IF ¡NOT ¡EXISTS ¡src ¡(key ¡INT, ¡value ¡STRING)""") ¡ ¡ hiveCtx.hql(""" ¡ ¡ ¡LOAD ¡DATA ¡LOCAL ¡INPATH ¡'examples/…/kv1.txt' ¡INTO ¡TABLE ¡src""") ¡ ¡ # ¡Queries ¡can ¡be ¡expressed ¡in ¡HiveQL. ¡ results ¡= ¡hiveCtx.hql("FROM ¡src ¡SELECT ¡key, ¡value").collect() ¡ ¡

slide-31
SLIDE 31

Parquet Compatibility

Native support for reading data in Parquet:

  • Columnar storage avoids reading unneeded data.
  • RDDs can be written to parquet files, preserving the

schema.

  • Convert other slower formats into Parquet for repeated

querying

slide-32
SLIDE 32

Using Parquet

# ¡SchemaRDDs ¡can ¡be ¡saved ¡as ¡Parquet ¡files, ¡maintaining ¡the ¡ # ¡schema ¡information. ¡ ¡ peopleTable.saveAsParquetFile("people.parquet") ¡ ¡ ¡ # ¡Read ¡in ¡the ¡Parquet ¡file ¡created ¡above. ¡ ¡Parquet ¡files ¡are ¡ ¡ # ¡self-­‑describing ¡so ¡the ¡schema ¡is ¡preserved. ¡The ¡result ¡of ¡ ¡ # ¡loading ¡a ¡parquet ¡file ¡is ¡also ¡a ¡SchemaRDD. ¡ parquetFile ¡= ¡sqlCtx.parquetFile("people.parquet”) ¡ ¡ # ¡Parquet ¡files ¡can ¡be ¡registered ¡as ¡tables ¡used ¡in ¡SQL. ¡ parquetFile.registerAsTable("parquetFile”) ¡ teenagers ¡= ¡sqlCtx.sql(""" ¡ ¡ ¡SELECT ¡name ¡FROM ¡parquetFile ¡WHERE ¡age ¡>= ¡13 ¡AND ¡age ¡<= ¡19""") ¡ ¡

slide-33
SLIDE 33

{JSON} Support

  • Use jsonFile or jsonRDD to convert a

collection of JSON objects into a SchemaRDD

  • Infers and unions the schema of each record
  • Maintains nested structures and arrays
slide-34
SLIDE 34

{JSON} Example

# ¡Create ¡a ¡SchemaRDD ¡from ¡the ¡file(s) ¡pointed ¡to ¡by ¡path ¡ ¡ people ¡= ¡sqlContext.jsonFile(path) ¡ ¡ ¡ ¡ # ¡Visualized ¡inferred ¡schema ¡with ¡printSchema(). ¡ people.printSchema() ¡ ¡ # ¡root ¡ ¡ # ¡ ¡|-­‑-­‑ ¡age: ¡integer ¡ # ¡ ¡|-­‑-­‑ ¡name: ¡string ¡ ¡ # ¡Register ¡this ¡SchemaRDD ¡as ¡a ¡table. ¡ ¡ people.registerTempTable("people") ¡ ¡ ¡

slide-35
SLIDE 35

Data Sources API

Allow easy integration with new sources of structured data: CREATE ¡TEMPORARY ¡TABLE ¡episodes ¡ ¡ USING ¡com.databricks.spark.avro ¡ ¡ OPTIONS ¡( ¡ ¡ ¡path ¡”./episodes.avro” ¡ ) ¡ ¡

https://github.com/databricks/spark-­‑avro ¡

slide-36
SLIDE 36

Efficient Expression Evaluation

Interpreting expressions (e.g., ‘a + b’) can very expensive on the JVM:

  • Virtual function calls
  • Branches based on expression type
  • Object creation due to primitive boxing
  • Memory consumption by boxed primitive
  • bjects
slide-37
SLIDE 37

Interpreting “a+b”

  • 1. Virtual call to Add.eval()
  • 2. Virtual call to a.eval()
  • 3. Return boxed Int
  • 4. Virtual call to b.eval()
  • 5. Return boxed Int
  • 6. Integer addition
  • 7. Return boxed result

Add Attribute a Attribute b

slide-38
SLIDE 38

Using Runtime Reflection

def ¡generateCode(e: ¡Expression): ¡Tree ¡= ¡e ¡match ¡{ ¡ ¡ ¡case ¡Attribute(ordinal) ¡=> ¡ ¡ ¡ ¡ ¡q"inputRow.getInt($ordinal)" ¡ ¡ ¡case ¡Add(left, ¡right) ¡=> ¡ ¡ ¡ ¡ ¡q""" ¡ ¡ ¡ ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡val ¡leftResult ¡= ¡${generateCode(left)} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡val ¡rightResult ¡= ¡${generateCode(right)} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡leftResult ¡+ ¡rightResult ¡ ¡ ¡ ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡ ¡ ¡""" ¡ } ¡

slide-39
SLIDE 39

Code Generating “a + b”

val ¡left: ¡Int ¡= ¡inputRow.getInt(0) ¡ val ¡right: ¡Int ¡= ¡inputRow.getInt(1) ¡ val ¡result: ¡Int ¡= ¡left ¡+ ¡right ¡ resultRow.setInt(0, ¡result) ¡

  • Fewer function calls
  • No boxing of primitives
slide-40
SLIDE 40

Performance Comparison

5 10 15 20 25 30 35 40

Intepreted Evaluation Hand-written Code Generated with Scala Reflection

Milliseconds

Evaluating 'a+a+a' One Billion Times Evaluating 'a+a+a' One Billion Times

slide-41
SLIDE 41

Performance vs.

Deep Analytics Interactive Reporting

50 100 150 200 250 300 350 400 450 34 46 59 79 19 42 52 55 63 68 73 98 27 3 43 53 7 89

TPC-DS Shark Spark SQL

slide-42
SLIDE 42

What’s Coming in Spark 1.2?

  • MLlib pipeline support for SchemaRDDs
  • New APIs for developers to add external data

sources

  • Full support for Decimal and Date types.
  • Statistics for in-memory data
  • Lots of bug fixes and improvements to Hive

compatibility

slide-43
SLIDE 43

Questions Questions? ?