Improving Python and Spark (PySpark) Performance and Interoperability

Wes McKinney
Wes McKinneyDirector of Ursa Labs, Open Source Developer at Ursa Labs
www.twosigma.com
Improving Python and Spark
Performance and Interoperability
February 9, 2017All Rights Reserved
Wes McKinney @wesmckinn
Spark Summit East 2017
February 9, 2017
Me
February 9, 2017
•  Currently: Software Architect at Two Sigma Investments
•  Creator of Python pandas project
•  PMC member for Apache Arrow and Apache Parquet
•  Other Python projects: Ibis, Feather, statsmodels
•  Formerly: Cloudera, DataPad, AQR
•  Author of Python for Data Analysis
All Rights Reserved 2
Important Legal Information
The information presented here is offered for informational purposes only and should not be
used for any other purpose (including, without limitation, the making of investment decisions).
Examples provided herein are for illustrative purposes only and are not necessarily based on
actual data. Nothing herein constitutes: an offer to sell or the solicitation of any offer to buy any
security or other interest; tax advice; or investment advice. This presentation shall remain the
property of Two Sigma Investments, LP (“Two Sigma”) and Two Sigma reserves the right to
require the return of this presentation at any time.
Some of the images, logos or other material used herein may be protected by copyright and/or
trademark. If so, such copyrights and/or trademarks are most likely owned by the entity that
created the material and are used purely for identification and comment as fair use under
international copyright and/or trademark laws. Use of such image, copyright or trademark does
not imply any association with such organization (or endorsement of such organization) by Two
Sigma, nor vice versa.
Copyright © 2017 TWO SIGMA INVESTMENTS, LP. All rights reserved
This talk
4February 9, 2017
•  Why some parts of PySpark are “slow”
•  Technology that can help make things faster
•  Work we have done to make improvements
•  Future roadmap
All Rights Reserved
Python and Spark
February 9, 2017
•  Spark is implemented in Scala, runs on the Java virtual machine (JVM)
•  Spark has Python and R APIs with partial or full coverage for many parts of
the Scala Spark API
•  In some Spark tasks, Python is only a scripting front-end.
•  This means no interpreted Python code is executed once the Spark
job starts
•  Other PySpark jobs suffer performance and interoperability issues that we’re
going to analyze in this talk
All Rights Reserved 5
Spark DataFrame performance
February 9, 2017All Rights Reserved
Source: https://databricks.com/blog/2015/02/17/introducing-dataframes-in-spark-for-large-scale-data-science.html
6
Spark DataFrame performance can be misleading
February 9, 2017
•  Spark DataFrames are an example of Python as a DSL / scripting front end
•  Excepting UDFs (.map(…) or sqlContext.registerFunction), no Python code is
evaluated in the Spark job
•  Python API calls create SQL query plans inside the JVM — so Scala and
Python versions are computationally identical
All Rights Reserved 7
Spark DataFrames as deferred DSL
February 9, 2017
	
young	=	users[users.age	<	21]	
young.groupBy(“gender”).count()	
All Rights Reserved 8
Spark DataFrames as deferred DSL
February 9, 2017
SELECT	gender,	COUNT(*)	
FROM	users		
WHERE	age	<	21	
GROUP	BY	1	
All Rights Reserved 9
Spark DataFrames as deferred DSL
February 9, 2017
Aggregation[table]	
		table:	
				Table:	users	
		metrics:	
				count	=	Count[int64]	
						Table:	ref_0	
		by:	
				gender	=	Column[array(string)]	'gender'	from	users	
		predicates:	
				Less[array(boolean)]	
						age	=	Column[array(int32)]	'age'	from	users	
						Literal[int8]	
								21	
All Rights Reserved 10
Where Python code and Spark meet
February 9, 2017
•  Unfortunately, many PySpark jobs cannot be expressed entirely as
DataFrame operations or other built-in Scala constructs
•  Spark-Scala interacts with in-memory Python in key ways:
•  Reading and writing in-memory datasets to/from the Spark driver
•  Evaluating custom Python code (user-defined functions)
All Rights Reserved 11
How PySpark lambda functions work
February 9, 2017
•  The anatomy of
All Rights Reserved
rdd.map(lambda	x:	…	)	
df.withColumn(py_func(...))	
Scala
RDD
Python worker
Python worker
Python worker
Python worker
Python worker
see PythonRDD.scala
12
PySpark lambda performance problems
February 9, 2017
•  See 2016 talk “High Performance Python on Apache Spark”
•  http://www.slideshare.net/wesm/high-performance-python-on-apache-spark
•  Problems
•  Inefficient data movement (serialization / deserialization)
•  Scalar computation model: object boxing and interpreter overhead
•  General summary: PySpark is not currently designed to achieve high
performance in the way that pandas and NumPy are.
All Rights Reserved 13
Other issues with PySpark lambdas
February 9, 2017
•  Computation model unlike what pandas users are used to
•  In dataframe.map(f), the Python function f	only sees one Row at a time
•  A more natural and efficient vectorized API would be:
•  dataframe.map_pandas(lambda	df:	…)	
All Rights Reserved 14
February 9, 2017All Rights Reserved
Apache
Arrow
15
Apache Arrow: Process and Move Data Fast
February 9, 2017
•  New Top-level Apache project as of February 2016
•  Collaboration amongst broad set of OSS projects around shared needs
•  Language-independent columnar data structures
•  Metadata for describing schemas / chunks of data
•  Protocol for moving data between processes with minimal serialization
overhead
All Rights Reserved 16
High performance data interchange
February 9, 2017All Rights Reserved
Today With Arrow
Source: Apache Arrow
17
What does Apache Arrow give you?
February 9, 2017
•  Zero-copy columnar data: Complex table and array data structures that can
reference memory without copying it
•  Ultrafast messaging: Language-agnostic metadata, batch/file-based and
streaming binary formats
•  Complex schema support: Flat and nested data types
•  C++, Python, and Java Implementations: with integration tests
All Rights Reserved 18
Arrow binary wire formats
February 9, 2017All Rights Reserved 19
Extreme performance to pandas from Arrow streams
February 9, 2017All Rights Reserved 20
PyArrow file and streaming API
February 9, 2017
from	pyarrow	import	StreamReader	
	
reader	=	StreamReader(stream)	
	
#	pyarrow.Table	
table	=	reader.read_all()	
	
#	Convert	to	pandas	
df	=	table.to_pandas()	
All Rights Reserved 21
For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no
guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of
this presentation for important disclosure information.
Making DataFrame.toPandas faster
February 9, 2017
•  Background
•  Spark’s toPandas transfers in-memory from the Spark driver to Python and
converts it to a pandas.DataFrame. It is very slow
•  Joint work with Bryan Cutler (IBM), Li Jin (Two Sigma), and Yin Xusen
(IBM). See SPARK-13534 on JIRA
•  Test case: transfer 128MB Parquet file with 8 DOUBLE columns
All Rights Reserved 22
February 9, 2017All Rights Reserved
conda	install	pyarrow	-c	conda-forge	
23
For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no
guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of
this presentation for important disclosure information.
Making DataFrame.toPandas faster
February 9, 2017All Rights Reserved
df	=	sqlContext.read.parquet('example2.parquet')	
df	=	df.cache()	
df.count()	
Then
%%prun	-s	cumulative	
dfs	=	[df.toPandas()	for	i	in	range(5)]	
24
For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no
guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of
this presentation for important disclosure information.
Making DataFrame.toPandas faster
February 9, 2017All Rights Reserved
	94483943	function	calls	(94478223	primitive	calls)	in	62.492	seconds	
	
			ncalls		tottime		percall		cumtime		percall	filename:lineno(function)	
								5				1.458				0.292			62.492			12.498	dataframe.py:1570(toPandas)	
								5				0.661				0.132			54.759			10.952	dataframe.py:382(collect)	
	10485765				0.669				0.000			46.823				0.000	rdd.py:121(_load_from_socket)	
						715				0.002				0.000			46.139				0.065	serializers.py:141(load_stream)	
						710				0.002				0.000			45.950				0.065	serializers.py:448(loads)	
	10485760				4.969				0.000			32.853				0.000	types.py:595(fromInternal)	
					1391				0.004				0.000				7.445				0.005	socket.py:562(readinto)	
							18				0.000				0.000				7.283				0.405	java_gateway.py:1006(send_command)	
								5				0.000				0.000				6.262				1.252	frame.py:943(from_records)	
25
For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no
guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of
this presentation for important disclosure information.
Making DataFrame.toPandas faster
February 9, 2017All Rights Reserved
Now,	using	pyarrow	
	
%%prun	-s	cumulative	
dfs	=	[df.toPandas(useArrow)	for	i	in	range(5)]	
26
For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no
guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of
this presentation for important disclosure information.
Making DataFrame.toPandas faster
February 9, 2017All Rights Reserved
	38585	function	calls	(38535	primitive	calls)	in	9.448	seconds	
	
			ncalls		tottime		percall		cumtime		percall	filename:lineno(function)	
								5				0.001				0.000				9.448				1.890	dataframe.py:1570(toPandas)	
								5				0.000				0.000				9.358				1.872	dataframe.py:394(collectAsArrow)	
					6271				9.330				0.001				9.330				0.001	{method	'recv_into'	of	'_socket.socket‘}	
							15				0.000				0.000				9.229				0.615	java_gateway.py:860(send_command)	
							10				0.000				0.000				0.123				0.012	serializers.py:141(load_stream)	
								5				0.085				0.017				0.089				0.018	{method	'to_pandas'	of	'pyarrow.Table‘}	
27
pip	install	memory_profiler	
February 9, 2017All Rights Reserved
%%memit	-i	0.0001	
pdf	=	None	
pdf	=	df.toPandas()	
gc.collect()	
	
peak	memory:	1223.16	MiB,		
increment:	1018.20	MiB	
	
	
28
Plot thickens: memory use
February 9, 2017All Rights Reserved
%%memit	-i	0.0001	
pdf	=	None	
pdf	=	df.toPandas(useArrow=True)	
gc.collect()	
	
peak	memory:	334.08	MiB,		
increment:	258.31	MiB	
	
29
Summary of results
February 9, 2017
•  Current version: average 12.5s (10.2 MB/s)
•  Deseralization accounts for 88% of time; the rest is waiting for Spark to
send the data
•  Peak memory use 8x (~1GB) the size of the dataset
•  Arrow version
•  Average wall clock time of 1.89s (6.61x faster, 67.7 MB/s)
•  Deserialization accounts for 1% of total time
•  Peak memory use 2x the size of the dataset (1 memory doubling)
•  Time for Spark to send data 25% higher (1866ms vs 1488 ms)
All Rights Reserved 30
Aside: reading Parquet directly in Python
February 9, 2017
import	pyarrow.parquet	as	pq	
	
%%timeit		
df	=	pq.read_table(‘example2.parquet’).to_pandas()	
10	loops,	best	of	3:	175	ms	per	loop	
	
	
All Rights Reserved 31
Digging deeper
February 9, 2017
•  Why does it take Spark ~1.8 seconds to send 128MB of data over the wire?
val	collectedRows	=	queryExecution.executedPlan.executeCollect()	
cnvtr.internalRowsToPayload(collectedRows,	this.schema)	
All Rights Reserved
Array[InternalRow]	
32
Digging deeper
February 9, 2017
•  In our 128MB test case, on average:
•  75% of time is being spent collecting Array[InternalRow]	from the task
executors
•  25% of the time is spent on a single-threaded conversion of all the data
from Array[InternalRow] to ArrowRecordBatch	
•  We can go much faster by performing the Spark SQL -> Arrow
conversion locally on the task executors, then streaming the batches to
Python
All Rights Reserved 33
Future architecture
February 9, 2017All Rights Reserved
Task executor
Task executor
Task executor
Task executor
Arrow RecordBatch
Arrow RecordBatch
Arrow RecordBatch
Arrow RecordBatch
Arrow Schema
Spark driver
Python
34
For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no
guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of
this presentation for important disclosure information.
Hot off the presses
February 9, 2017All Rights Reserved
			ncalls		tottime		percall		cumtime		percall	filename:lineno(function)	
								5				0.000				0.000				5.928				1.186	dataframe.py:1570(toPandas)	
								5				0.000				0.000				5.838				1.168	dataframe.py:394(collectAsArrow)	
					5919				0.005				0.000				5.824				0.001	socket.py:561(readinto)	
					5919				5.809				0.001				5.809				0.001	{method	'recv_into'	of	'_socket.socket‘}	
...	
								5				0.086				0.017				0.091				0.018	{method	'to_pandas'	of	'pyarrow.Table‘}	
35
Patch from February 8: 38% perf improvement
The work ahead
February 9, 2017
•  Luckily, speeding up toPandas and speeding up Lambda / UDF functions is
architecturally the same type of problem
•  Reasonably clear path to making toPandas even faster
•  How can you get involved?
•  Keep an eye on Spark ASF JIRA
•  Contribute to Apache Arrow (Java, C++, Python, other languages)
•  Join the Arrow and Spark mailing lists
All Rights Reserved 36
Thank you
February 9, 2017
•  Bryan Cutler, Li Jin, and Yin Xusen, for building the integration Spark-Arrow
integration
•  Apache Arrow community
•  Spark Summit organizers
•  Two Sigma and IBM, for supporting this work
All Rights Reserved 37
1 of 37

Recommended

Deep Dive: Memory Management in Apache Spark by
Deep Dive: Memory Management in Apache SparkDeep Dive: Memory Management in Apache Spark
Deep Dive: Memory Management in Apache SparkDatabricks
14.5K views54 slides
Programming in Spark using PySpark by
Programming in Spark using PySpark      Programming in Spark using PySpark
Programming in Spark using PySpark Mostafa Elzoghbi
5.9K views25 slides
PySpark Programming | PySpark Concepts with Hands-On | PySpark Training | Edu... by
PySpark Programming | PySpark Concepts with Hands-On | PySpark Training | Edu...PySpark Programming | PySpark Concepts with Hands-On | PySpark Training | Edu...
PySpark Programming | PySpark Concepts with Hands-On | PySpark Training | Edu...Edureka!
1.4K views23 slides
Apache Spark Core—Deep Dive—Proper Optimization by
Apache Spark Core—Deep Dive—Proper OptimizationApache Spark Core—Deep Dive—Proper Optimization
Apache Spark Core—Deep Dive—Proper OptimizationDatabricks
6.1K views50 slides
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P... by
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...Databricks
1K views25 slides
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc... by
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...Databricks
10.8K views45 slides

More Related Content

What's hot

Internals of Speeding up PySpark with Arrow by
 Internals of Speeding up PySpark with Arrow Internals of Speeding up PySpark with Arrow
Internals of Speeding up PySpark with ArrowDatabricks
993 views156 slides
Spark SQL by
Spark SQLSpark SQL
Spark SQLJoud Khattab
6.5K views71 slides
Introduction to Spark Internals by
Introduction to Spark InternalsIntroduction to Spark Internals
Introduction to Spark InternalsPietro Michiardi
19.2K views80 slides
Advanced Apache Spark Meetup Project Tungsten Nov 12 2015 by
Advanced Apache Spark Meetup Project Tungsten Nov 12 2015Advanced Apache Spark Meetup Project Tungsten Nov 12 2015
Advanced Apache Spark Meetup Project Tungsten Nov 12 2015Chris Fregly
12.1K views60 slides
From DataFrames to Tungsten: A Peek into Spark's Future-(Reynold Xin, Databri... by
From DataFrames to Tungsten: A Peek into Spark's Future-(Reynold Xin, Databri...From DataFrames to Tungsten: A Peek into Spark's Future-(Reynold Xin, Databri...
From DataFrames to Tungsten: A Peek into Spark's Future-(Reynold Xin, Databri...Spark Summit
5K views27 slides
Spark SQL Deep Dive @ Melbourne Spark Meetup by
Spark SQL Deep Dive @ Melbourne Spark MeetupSpark SQL Deep Dive @ Melbourne Spark Meetup
Spark SQL Deep Dive @ Melbourne Spark MeetupDatabricks
9K views57 slides

What's hot(20)

Internals of Speeding up PySpark with Arrow by Databricks
 Internals of Speeding up PySpark with Arrow Internals of Speeding up PySpark with Arrow
Internals of Speeding up PySpark with Arrow
Databricks993 views
Introduction to Spark Internals by Pietro Michiardi
Introduction to Spark InternalsIntroduction to Spark Internals
Introduction to Spark Internals
Pietro Michiardi19.2K views
Advanced Apache Spark Meetup Project Tungsten Nov 12 2015 by Chris Fregly
Advanced Apache Spark Meetup Project Tungsten Nov 12 2015Advanced Apache Spark Meetup Project Tungsten Nov 12 2015
Advanced Apache Spark Meetup Project Tungsten Nov 12 2015
Chris Fregly12.1K views
From DataFrames to Tungsten: A Peek into Spark's Future-(Reynold Xin, Databri... by Spark Summit
From DataFrames to Tungsten: A Peek into Spark's Future-(Reynold Xin, Databri...From DataFrames to Tungsten: A Peek into Spark's Future-(Reynold Xin, Databri...
From DataFrames to Tungsten: A Peek into Spark's Future-(Reynold Xin, Databri...
Spark Summit5K views
Spark SQL Deep Dive @ Melbourne Spark Meetup by Databricks
Spark SQL Deep Dive @ Melbourne Spark MeetupSpark SQL Deep Dive @ Melbourne Spark Meetup
Spark SQL Deep Dive @ Melbourne Spark Meetup
Databricks9K views
Parallelizing with Apache Spark in Unexpected Ways by Databricks
Parallelizing with Apache Spark in Unexpected WaysParallelizing with Apache Spark in Unexpected Ways
Parallelizing with Apache Spark in Unexpected Ways
Databricks5.6K views
Introduction to Apache Spark by Rahul Jain
Introduction to Apache SparkIntroduction to Apache Spark
Introduction to Apache Spark
Rahul Jain24.8K views
Continuous Application with FAIR Scheduler with Robert Xue by Databricks
Continuous Application with FAIR Scheduler with Robert XueContinuous Application with FAIR Scheduler with Robert Xue
Continuous Application with FAIR Scheduler with Robert Xue
Databricks3.2K views
Spark SQL Join Improvement at Facebook by Databricks
Spark SQL Join Improvement at FacebookSpark SQL Join Improvement at Facebook
Spark SQL Join Improvement at Facebook
Databricks463 views
Cost-Based Optimizer in Apache Spark 2.2 by Databricks
Cost-Based Optimizer in Apache Spark 2.2 Cost-Based Optimizer in Apache Spark 2.2
Cost-Based Optimizer in Apache Spark 2.2
Databricks5.5K views
A Thorough Comparison of Delta Lake, Iceberg and Hudi by Databricks
A Thorough Comparison of Delta Lake, Iceberg and HudiA Thorough Comparison of Delta Lake, Iceberg and Hudi
A Thorough Comparison of Delta Lake, Iceberg and Hudi
Databricks11.1K views
Spark SQL: Another 16x Faster After Tungsten: Spark Summit East talk by Brad ... by Spark Summit
Spark SQL: Another 16x Faster After Tungsten: Spark Summit East talk by Brad ...Spark SQL: Another 16x Faster After Tungsten: Spark Summit East talk by Brad ...
Spark SQL: Another 16x Faster After Tungsten: Spark Summit East talk by Brad ...
Spark Summit3.9K views
Experience of Running Spark on Kubernetes on OpenStack for High Energy Physic... by Databricks
Experience of Running Spark on Kubernetes on OpenStack for High Energy Physic...Experience of Running Spark on Kubernetes on OpenStack for High Energy Physic...
Experience of Running Spark on Kubernetes on OpenStack for High Energy Physic...
Databricks1.1K views
Extreme Apache Spark: how in 3 months we created a pipeline that can process ... by Josef A. Habdank
Extreme Apache Spark: how in 3 months we created a pipeline that can process ...Extreme Apache Spark: how in 3 months we created a pipeline that can process ...
Extreme Apache Spark: how in 3 months we created a pipeline that can process ...
Josef A. Habdank25.4K views
Introduction to spark by Duyhai Doan
Introduction to sparkIntroduction to spark
Introduction to spark
Duyhai Doan3.5K views
Introducing DataFrames in Spark for Large Scale Data Science by Databricks
Introducing DataFrames in Spark for Large Scale Data ScienceIntroducing DataFrames in Spark for Large Scale Data Science
Introducing DataFrames in Spark for Large Scale Data Science
Databricks41K views
Apache Arrow Workshop at VLDB 2019 / BOSS Session by Wes McKinney
Apache Arrow Workshop at VLDB 2019 / BOSS SessionApache Arrow Workshop at VLDB 2019 / BOSS Session
Apache Arrow Workshop at VLDB 2019 / BOSS Session
Wes McKinney2.5K views
Spark overview by Lisa Hua
Spark overviewSpark overview
Spark overview
Lisa Hua7.3K views
Scalable Monitoring Using Prometheus with Apache Spark Clusters with Diane F... by Databricks
 Scalable Monitoring Using Prometheus with Apache Spark Clusters with Diane F... Scalable Monitoring Using Prometheus with Apache Spark Clusters with Diane F...
Scalable Monitoring Using Prometheus with Apache Spark Clusters with Diane F...
Databricks2.7K views

Similar to Improving Python and Spark (PySpark) Performance and Interoperability

Improving Python and Spark Performance and Interoperability with Apache Arrow... by
Improving Python and Spark Performance and Interoperability with Apache Arrow...Improving Python and Spark Performance and Interoperability with Apache Arrow...
Improving Python and Spark Performance and Interoperability with Apache Arrow...Databricks
2.3K views48 slides
Future of pandas by
Future of pandasFuture of pandas
Future of pandasJeff Reback
5.4K views53 slides
Future of Pandas - Jeff Reback by
Future of Pandas - Jeff RebackFuture of Pandas - Jeff Reback
Future of Pandas - Jeff RebackTwo Sigma
919 views51 slides
Improving Pandas and PySpark performance and interoperability with Apache Arrow by
Improving Pandas and PySpark performance and interoperability with Apache ArrowImproving Pandas and PySpark performance and interoperability with Apache Arrow
Improving Pandas and PySpark performance and interoperability with Apache ArrowPyData
1.6K views44 slides
Improving Pandas and PySpark interoperability with Apache Arrow by
Improving Pandas and PySpark interoperability with Apache ArrowImproving Pandas and PySpark interoperability with Apache Arrow
Improving Pandas and PySpark interoperability with Apache ArrowLi Jin
143 views44 slides
Improving Python and Spark Performance and Interoperability with Apache Arrow by
Improving Python and Spark Performance and Interoperability with Apache ArrowImproving Python and Spark Performance and Interoperability with Apache Arrow
Improving Python and Spark Performance and Interoperability with Apache ArrowJulien Le Dem
4.4K views48 slides

Similar to Improving Python and Spark (PySpark) Performance and Interoperability(20)

Improving Python and Spark Performance and Interoperability with Apache Arrow... by Databricks
Improving Python and Spark Performance and Interoperability with Apache Arrow...Improving Python and Spark Performance and Interoperability with Apache Arrow...
Improving Python and Spark Performance and Interoperability with Apache Arrow...
Databricks2.3K views
Future of pandas by Jeff Reback
Future of pandasFuture of pandas
Future of pandas
Jeff Reback5.4K views
Future of Pandas - Jeff Reback by Two Sigma
Future of Pandas - Jeff RebackFuture of Pandas - Jeff Reback
Future of Pandas - Jeff Reback
Two Sigma919 views
Improving Pandas and PySpark performance and interoperability with Apache Arrow by PyData
Improving Pandas and PySpark performance and interoperability with Apache ArrowImproving Pandas and PySpark performance and interoperability with Apache Arrow
Improving Pandas and PySpark performance and interoperability with Apache Arrow
PyData1.6K views
Improving Pandas and PySpark interoperability with Apache Arrow by Li Jin
Improving Pandas and PySpark interoperability with Apache ArrowImproving Pandas and PySpark interoperability with Apache Arrow
Improving Pandas and PySpark interoperability with Apache Arrow
Li Jin143 views
Improving Python and Spark Performance and Interoperability with Apache Arrow by Julien Le Dem
Improving Python and Spark Performance and Interoperability with Apache ArrowImproving Python and Spark Performance and Interoperability with Apache Arrow
Improving Python and Spark Performance and Interoperability with Apache Arrow
Julien Le Dem4.4K views
How To Use Scala At Work - Airframe In Action at Arm Treasure Data by Taro L. Saito
How To Use Scala At Work - Airframe In Action at Arm Treasure DataHow To Use Scala At Work - Airframe In Action at Arm Treasure Data
How To Use Scala At Work - Airframe In Action at Arm Treasure Data
Taro L. Saito1.3K views
SQL Data Warehousing in SAP HANA (Sefan Linders) by Twan van den Broek
SQL Data Warehousing in SAP HANA (Sefan Linders)SQL Data Warehousing in SAP HANA (Sefan Linders)
SQL Data Warehousing in SAP HANA (Sefan Linders)
Twan van den Broek551 views
Deploying Enterprise Scale Deep Learning in Actuarial Modeling at Nationwide by Databricks
Deploying Enterprise Scale Deep Learning in Actuarial Modeling at NationwideDeploying Enterprise Scale Deep Learning in Actuarial Modeling at Nationwide
Deploying Enterprise Scale Deep Learning in Actuarial Modeling at Nationwide
Databricks648 views
A short introduction to Spark and its benefits by Johan Picard
A short introduction to Spark and its benefitsA short introduction to Spark and its benefits
A short introduction to Spark and its benefits
Johan Picard724 views
Introduction to pyspark new by Anam Mahmood
Introduction to pyspark newIntroduction to pyspark new
Introduction to pyspark new
Anam Mahmood335 views
Risk Management Framework Using Intel FPGA, Apache Spark, and Persistent RDDs... by Databricks
Risk Management Framework Using Intel FPGA, Apache Spark, and Persistent RDDs...Risk Management Framework Using Intel FPGA, Apache Spark, and Persistent RDDs...
Risk Management Framework Using Intel FPGA, Apache Spark, and Persistent RDDs...
Databricks731 views
5 things one must know about spark! by Edureka!
5 things one must know about spark!5 things one must know about spark!
5 things one must know about spark!
Edureka!4.1K views
5 reasons why spark is in demand! by Edureka!
5 reasons why spark is in demand!5 reasons why spark is in demand!
5 reasons why spark is in demand!
Edureka!1.1K views
Simplifying AI integration on Apache Spark by Databricks
Simplifying AI integration on Apache SparkSimplifying AI integration on Apache Spark
Simplifying AI integration on Apache Spark
Databricks112 views
Datameer6 for prospects - june 2016_v2 by Datameer
Datameer6 for prospects - june 2016_v2Datameer6 for prospects - june 2016_v2
Datameer6 for prospects - june 2016_v2
Datameer1.1K views
NRB - LUXEMBOURG MAINFRAME DAY 2017 - Data Spark and the Data Federation by NRB
NRB - LUXEMBOURG MAINFRAME DAY 2017 - Data Spark and the Data FederationNRB - LUXEMBOURG MAINFRAME DAY 2017 - Data Spark and the Data Federation
NRB - LUXEMBOURG MAINFRAME DAY 2017 - Data Spark and the Data Federation
NRB132 views
NRB - BE MAINFRAME DAY 2017 - Data spark and the data federation by NRB
NRB - BE MAINFRAME DAY 2017 - Data spark and the data federation NRB - BE MAINFRAME DAY 2017 - Data spark and the data federation
NRB - BE MAINFRAME DAY 2017 - Data spark and the data federation
NRB283 views
Overview and Walkthrough of the Application Programming Model with SAP Cloud ... by SAP Cloud Platform
Overview and Walkthrough of the Application Programming Model with SAP Cloud ...Overview and Walkthrough of the Application Programming Model with SAP Cloud ...
Overview and Walkthrough of the Application Programming Model with SAP Cloud ...

More from Wes McKinney

Solving Enterprise Data Challenges with Apache Arrow by
Solving Enterprise Data Challenges with Apache ArrowSolving Enterprise Data Challenges with Apache Arrow
Solving Enterprise Data Challenges with Apache ArrowWes McKinney
1.1K views31 slides
Apache Arrow: Open Source Standard Becomes an Enterprise Necessity by
Apache Arrow: Open Source Standard Becomes an Enterprise NecessityApache Arrow: Open Source Standard Becomes an Enterprise Necessity
Apache Arrow: Open Source Standard Becomes an Enterprise NecessityWes McKinney
1.1K views26 slides
Apache Arrow: High Performance Columnar Data Framework by
Apache Arrow: High Performance Columnar Data FrameworkApache Arrow: High Performance Columnar Data Framework
Apache Arrow: High Performance Columnar Data FrameworkWes McKinney
1.4K views53 slides
New Directions for Apache Arrow by
New Directions for Apache ArrowNew Directions for Apache Arrow
New Directions for Apache ArrowWes McKinney
1.9K views27 slides
Apache Arrow Flight: A New Gold Standard for Data Transport by
Apache Arrow Flight: A New Gold Standard for Data TransportApache Arrow Flight: A New Gold Standard for Data Transport
Apache Arrow Flight: A New Gold Standard for Data TransportWes McKinney
2.2K views31 slides
ACM TechTalks : Apache Arrow and the Future of Data Frames by
ACM TechTalks : Apache Arrow and the Future of Data FramesACM TechTalks : Apache Arrow and the Future of Data Frames
ACM TechTalks : Apache Arrow and the Future of Data FramesWes McKinney
2K views47 slides

More from Wes McKinney(20)

Solving Enterprise Data Challenges with Apache Arrow by Wes McKinney
Solving Enterprise Data Challenges with Apache ArrowSolving Enterprise Data Challenges with Apache Arrow
Solving Enterprise Data Challenges with Apache Arrow
Wes McKinney1.1K views
Apache Arrow: Open Source Standard Becomes an Enterprise Necessity by Wes McKinney
Apache Arrow: Open Source Standard Becomes an Enterprise NecessityApache Arrow: Open Source Standard Becomes an Enterprise Necessity
Apache Arrow: Open Source Standard Becomes an Enterprise Necessity
Wes McKinney1.1K views
Apache Arrow: High Performance Columnar Data Framework by Wes McKinney
Apache Arrow: High Performance Columnar Data FrameworkApache Arrow: High Performance Columnar Data Framework
Apache Arrow: High Performance Columnar Data Framework
Wes McKinney1.4K views
New Directions for Apache Arrow by Wes McKinney
New Directions for Apache ArrowNew Directions for Apache Arrow
New Directions for Apache Arrow
Wes McKinney1.9K views
Apache Arrow Flight: A New Gold Standard for Data Transport by Wes McKinney
Apache Arrow Flight: A New Gold Standard for Data TransportApache Arrow Flight: A New Gold Standard for Data Transport
Apache Arrow Flight: A New Gold Standard for Data Transport
Wes McKinney2.2K views
ACM TechTalks : Apache Arrow and the Future of Data Frames by Wes McKinney
ACM TechTalks : Apache Arrow and the Future of Data FramesACM TechTalks : Apache Arrow and the Future of Data Frames
ACM TechTalks : Apache Arrow and the Future of Data Frames
Wes McKinney2K views
Apache Arrow: Present and Future @ ScaledML 2020 by Wes McKinney
Apache Arrow: Present and Future @ ScaledML 2020Apache Arrow: Present and Future @ ScaledML 2020
Apache Arrow: Present and Future @ ScaledML 2020
Wes McKinney970 views
PyCon Colombia 2020 Python for Data Analysis: Past, Present, and Future by Wes McKinney
PyCon Colombia 2020 Python for Data Analysis: Past, Present, and Future PyCon Colombia 2020 Python for Data Analysis: Past, Present, and Future
PyCon Colombia 2020 Python for Data Analysis: Past, Present, and Future
Wes McKinney2.1K views
Apache Arrow: Leveling Up the Analytics Stack by Wes McKinney
Apache Arrow: Leveling Up the Analytics StackApache Arrow: Leveling Up the Analytics Stack
Apache Arrow: Leveling Up the Analytics Stack
Wes McKinney1.4K views
Apache Arrow: Leveling Up the Data Science Stack by Wes McKinney
Apache Arrow: Leveling Up the Data Science StackApache Arrow: Leveling Up the Data Science Stack
Apache Arrow: Leveling Up the Data Science Stack
Wes McKinney3.5K views
Ursa Labs and Apache Arrow in 2019 by Wes McKinney
Ursa Labs and Apache Arrow in 2019Ursa Labs and Apache Arrow in 2019
Ursa Labs and Apache Arrow in 2019
Wes McKinney4.2K views
PyCon.DE / PyData Karlsruhe keynote: "Looking backward, looking forward" by Wes McKinney
PyCon.DE / PyData Karlsruhe keynote: "Looking backward, looking forward"PyCon.DE / PyData Karlsruhe keynote: "Looking backward, looking forward"
PyCon.DE / PyData Karlsruhe keynote: "Looking backward, looking forward"
Wes McKinney1.1K views
Apache Arrow at DataEngConf Barcelona 2018 by Wes McKinney
Apache Arrow at DataEngConf Barcelona 2018Apache Arrow at DataEngConf Barcelona 2018
Apache Arrow at DataEngConf Barcelona 2018
Wes McKinney2K views
Apache Arrow: Cross-language Development Platform for In-memory Data by Wes McKinney
Apache Arrow: Cross-language Development Platform for In-memory DataApache Arrow: Cross-language Development Platform for In-memory Data
Apache Arrow: Cross-language Development Platform for In-memory Data
Wes McKinney6.6K views
Apache Arrow -- Cross-language development platform for in-memory data by Wes McKinney
Apache Arrow -- Cross-language development platform for in-memory dataApache Arrow -- Cross-language development platform for in-memory data
Apache Arrow -- Cross-language development platform for in-memory data
Wes McKinney2.9K views
Shared Infrastructure for Data Science by Wes McKinney
Shared Infrastructure for Data ScienceShared Infrastructure for Data Science
Shared Infrastructure for Data Science
Wes McKinney8.5K views
Data Science Without Borders (JupyterCon 2017) by Wes McKinney
Data Science Without Borders (JupyterCon 2017)Data Science Without Borders (JupyterCon 2017)
Data Science Without Borders (JupyterCon 2017)
Wes McKinney6.2K views
Memory Interoperability in Analytics and Machine Learning by Wes McKinney
Memory Interoperability in Analytics and Machine LearningMemory Interoperability in Analytics and Machine Learning
Memory Interoperability in Analytics and Machine Learning
Wes McKinney5.6K views
Raising the Tides: Open Source Analytics for Data Science by Wes McKinney
Raising the Tides: Open Source Analytics for Data ScienceRaising the Tides: Open Source Analytics for Data Science
Raising the Tides: Open Source Analytics for Data Science
Wes McKinney3.2K views
Python Data Wrangling: Preparing for the Future by Wes McKinney
Python Data Wrangling: Preparing for the FuturePython Data Wrangling: Preparing for the Future
Python Data Wrangling: Preparing for the Future
Wes McKinney12.5K views

Recently uploaded

Evolving the Network Automation Journey from Python to Platforms by
Evolving the Network Automation Journey from Python to PlatformsEvolving the Network Automation Journey from Python to Platforms
Evolving the Network Automation Journey from Python to PlatformsNetwork Automation Forum
13 views21 slides
Special_edition_innovator_2023.pdf by
Special_edition_innovator_2023.pdfSpecial_edition_innovator_2023.pdf
Special_edition_innovator_2023.pdfWillDavies22
17 views6 slides
Info Session November 2023.pdf by
Info Session November 2023.pdfInfo Session November 2023.pdf
Info Session November 2023.pdfAleksandraKoprivica4
12 views15 slides
Melek BEN MAHMOUD.pdf by
Melek BEN MAHMOUD.pdfMelek BEN MAHMOUD.pdf
Melek BEN MAHMOUD.pdfMelekBenMahmoud
14 views1 slide
Design Driven Network Assurance by
Design Driven Network AssuranceDesign Driven Network Assurance
Design Driven Network AssuranceNetwork Automation Forum
15 views42 slides
Democratising digital commerce in India-Report by
Democratising digital commerce in India-ReportDemocratising digital commerce in India-Report
Democratising digital commerce in India-ReportKapil Khandelwal (KK)
15 views161 slides

Recently uploaded(20)

Special_edition_innovator_2023.pdf by WillDavies22
Special_edition_innovator_2023.pdfSpecial_edition_innovator_2023.pdf
Special_edition_innovator_2023.pdf
WillDavies2217 views
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院 by IttrainingIttraining
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院
Unit 1_Lecture 2_Physical Design of IoT.pdf by StephenTec
Unit 1_Lecture 2_Physical Design of IoT.pdfUnit 1_Lecture 2_Physical Design of IoT.pdf
Unit 1_Lecture 2_Physical Design of IoT.pdf
StephenTec12 views
Case Study Copenhagen Energy and Business Central.pdf by Aitana
Case Study Copenhagen Energy and Business Central.pdfCase Study Copenhagen Energy and Business Central.pdf
Case Study Copenhagen Energy and Business Central.pdf
Aitana16 views
Future of AR - Facebook Presentation by ssuserb54b561
Future of AR - Facebook PresentationFuture of AR - Facebook Presentation
Future of AR - Facebook Presentation
ssuserb54b56114 views
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas... by Bernd Ruecker
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
Bernd Ruecker37 views

Improving Python and Spark (PySpark) Performance and Interoperability

  • 1. www.twosigma.com Improving Python and Spark Performance and Interoperability February 9, 2017All Rights Reserved Wes McKinney @wesmckinn Spark Summit East 2017 February 9, 2017
  • 2. Me February 9, 2017 •  Currently: Software Architect at Two Sigma Investments •  Creator of Python pandas project •  PMC member for Apache Arrow and Apache Parquet •  Other Python projects: Ibis, Feather, statsmodels •  Formerly: Cloudera, DataPad, AQR •  Author of Python for Data Analysis All Rights Reserved 2
  • 3. Important Legal Information The information presented here is offered for informational purposes only and should not be used for any other purpose (including, without limitation, the making of investment decisions). Examples provided herein are for illustrative purposes only and are not necessarily based on actual data. Nothing herein constitutes: an offer to sell or the solicitation of any offer to buy any security or other interest; tax advice; or investment advice. This presentation shall remain the property of Two Sigma Investments, LP (“Two Sigma”) and Two Sigma reserves the right to require the return of this presentation at any time. Some of the images, logos or other material used herein may be protected by copyright and/or trademark. If so, such copyrights and/or trademarks are most likely owned by the entity that created the material and are used purely for identification and comment as fair use under international copyright and/or trademark laws. Use of such image, copyright or trademark does not imply any association with such organization (or endorsement of such organization) by Two Sigma, nor vice versa. Copyright © 2017 TWO SIGMA INVESTMENTS, LP. All rights reserved
  • 4. This talk 4February 9, 2017 •  Why some parts of PySpark are “slow” •  Technology that can help make things faster •  Work we have done to make improvements •  Future roadmap All Rights Reserved
  • 5. Python and Spark February 9, 2017 •  Spark is implemented in Scala, runs on the Java virtual machine (JVM) •  Spark has Python and R APIs with partial or full coverage for many parts of the Scala Spark API •  In some Spark tasks, Python is only a scripting front-end. •  This means no interpreted Python code is executed once the Spark job starts •  Other PySpark jobs suffer performance and interoperability issues that we’re going to analyze in this talk All Rights Reserved 5
  • 6. Spark DataFrame performance February 9, 2017All Rights Reserved Source: https://databricks.com/blog/2015/02/17/introducing-dataframes-in-spark-for-large-scale-data-science.html 6
  • 7. Spark DataFrame performance can be misleading February 9, 2017 •  Spark DataFrames are an example of Python as a DSL / scripting front end •  Excepting UDFs (.map(…) or sqlContext.registerFunction), no Python code is evaluated in the Spark job •  Python API calls create SQL query plans inside the JVM — so Scala and Python versions are computationally identical All Rights Reserved 7
  • 8. Spark DataFrames as deferred DSL February 9, 2017 young = users[users.age < 21] young.groupBy(“gender”).count() All Rights Reserved 8
  • 9. Spark DataFrames as deferred DSL February 9, 2017 SELECT gender, COUNT(*) FROM users WHERE age < 21 GROUP BY 1 All Rights Reserved 9
  • 10. Spark DataFrames as deferred DSL February 9, 2017 Aggregation[table] table: Table: users metrics: count = Count[int64] Table: ref_0 by: gender = Column[array(string)] 'gender' from users predicates: Less[array(boolean)] age = Column[array(int32)] 'age' from users Literal[int8] 21 All Rights Reserved 10
  • 11. Where Python code and Spark meet February 9, 2017 •  Unfortunately, many PySpark jobs cannot be expressed entirely as DataFrame operations or other built-in Scala constructs •  Spark-Scala interacts with in-memory Python in key ways: •  Reading and writing in-memory datasets to/from the Spark driver •  Evaluating custom Python code (user-defined functions) All Rights Reserved 11
  • 12. How PySpark lambda functions work February 9, 2017 •  The anatomy of All Rights Reserved rdd.map(lambda x: … ) df.withColumn(py_func(...)) Scala RDD Python worker Python worker Python worker Python worker Python worker see PythonRDD.scala 12
  • 13. PySpark lambda performance problems February 9, 2017 •  See 2016 talk “High Performance Python on Apache Spark” •  http://www.slideshare.net/wesm/high-performance-python-on-apache-spark •  Problems •  Inefficient data movement (serialization / deserialization) •  Scalar computation model: object boxing and interpreter overhead •  General summary: PySpark is not currently designed to achieve high performance in the way that pandas and NumPy are. All Rights Reserved 13
  • 14. Other issues with PySpark lambdas February 9, 2017 •  Computation model unlike what pandas users are used to •  In dataframe.map(f), the Python function f only sees one Row at a time •  A more natural and efficient vectorized API would be: •  dataframe.map_pandas(lambda df: …) All Rights Reserved 14
  • 15. February 9, 2017All Rights Reserved Apache Arrow 15
  • 16. Apache Arrow: Process and Move Data Fast February 9, 2017 •  New Top-level Apache project as of February 2016 •  Collaboration amongst broad set of OSS projects around shared needs •  Language-independent columnar data structures •  Metadata for describing schemas / chunks of data •  Protocol for moving data between processes with minimal serialization overhead All Rights Reserved 16
  • 17. High performance data interchange February 9, 2017All Rights Reserved Today With Arrow Source: Apache Arrow 17
  • 18. What does Apache Arrow give you? February 9, 2017 •  Zero-copy columnar data: Complex table and array data structures that can reference memory without copying it •  Ultrafast messaging: Language-agnostic metadata, batch/file-based and streaming binary formats •  Complex schema support: Flat and nested data types •  C++, Python, and Java Implementations: with integration tests All Rights Reserved 18
  • 19. Arrow binary wire formats February 9, 2017All Rights Reserved 19
  • 20. Extreme performance to pandas from Arrow streams February 9, 2017All Rights Reserved 20
  • 21. PyArrow file and streaming API February 9, 2017 from pyarrow import StreamReader reader = StreamReader(stream) # pyarrow.Table table = reader.read_all() # Convert to pandas df = table.to_pandas() All Rights Reserved 21
  • 22. For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of this presentation for important disclosure information. Making DataFrame.toPandas faster February 9, 2017 •  Background •  Spark’s toPandas transfers in-memory from the Spark driver to Python and converts it to a pandas.DataFrame. It is very slow •  Joint work with Bryan Cutler (IBM), Li Jin (Two Sigma), and Yin Xusen (IBM). See SPARK-13534 on JIRA •  Test case: transfer 128MB Parquet file with 8 DOUBLE columns All Rights Reserved 22
  • 23. February 9, 2017All Rights Reserved conda install pyarrow -c conda-forge 23
  • 24. For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of this presentation for important disclosure information. Making DataFrame.toPandas faster February 9, 2017All Rights Reserved df = sqlContext.read.parquet('example2.parquet') df = df.cache() df.count() Then %%prun -s cumulative dfs = [df.toPandas() for i in range(5)] 24
  • 25. For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of this presentation for important disclosure information. Making DataFrame.toPandas faster February 9, 2017All Rights Reserved 94483943 function calls (94478223 primitive calls) in 62.492 seconds ncalls tottime percall cumtime percall filename:lineno(function) 5 1.458 0.292 62.492 12.498 dataframe.py:1570(toPandas) 5 0.661 0.132 54.759 10.952 dataframe.py:382(collect) 10485765 0.669 0.000 46.823 0.000 rdd.py:121(_load_from_socket) 715 0.002 0.000 46.139 0.065 serializers.py:141(load_stream) 710 0.002 0.000 45.950 0.065 serializers.py:448(loads) 10485760 4.969 0.000 32.853 0.000 types.py:595(fromInternal) 1391 0.004 0.000 7.445 0.005 socket.py:562(readinto) 18 0.000 0.000 7.283 0.405 java_gateway.py:1006(send_command) 5 0.000 0.000 6.262 1.252 frame.py:943(from_records) 25
  • 26. For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of this presentation for important disclosure information. Making DataFrame.toPandas faster February 9, 2017All Rights Reserved Now, using pyarrow %%prun -s cumulative dfs = [df.toPandas(useArrow) for i in range(5)] 26
  • 27. For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of this presentation for important disclosure information. Making DataFrame.toPandas faster February 9, 2017All Rights Reserved 38585 function calls (38535 primitive calls) in 9.448 seconds ncalls tottime percall cumtime percall filename:lineno(function) 5 0.001 0.000 9.448 1.890 dataframe.py:1570(toPandas) 5 0.000 0.000 9.358 1.872 dataframe.py:394(collectAsArrow) 6271 9.330 0.001 9.330 0.001 {method 'recv_into' of '_socket.socket‘} 15 0.000 0.000 9.229 0.615 java_gateway.py:860(send_command) 10 0.000 0.000 0.123 0.012 serializers.py:141(load_stream) 5 0.085 0.017 0.089 0.018 {method 'to_pandas' of 'pyarrow.Table‘} 27
  • 28. pip install memory_profiler February 9, 2017All Rights Reserved %%memit -i 0.0001 pdf = None pdf = df.toPandas() gc.collect() peak memory: 1223.16 MiB, increment: 1018.20 MiB 28
  • 29. Plot thickens: memory use February 9, 2017All Rights Reserved %%memit -i 0.0001 pdf = None pdf = df.toPandas(useArrow=True) gc.collect() peak memory: 334.08 MiB, increment: 258.31 MiB 29
  • 30. Summary of results February 9, 2017 •  Current version: average 12.5s (10.2 MB/s) •  Deseralization accounts for 88% of time; the rest is waiting for Spark to send the data •  Peak memory use 8x (~1GB) the size of the dataset •  Arrow version •  Average wall clock time of 1.89s (6.61x faster, 67.7 MB/s) •  Deserialization accounts for 1% of total time •  Peak memory use 2x the size of the dataset (1 memory doubling) •  Time for Spark to send data 25% higher (1866ms vs 1488 ms) All Rights Reserved 30
  • 31. Aside: reading Parquet directly in Python February 9, 2017 import pyarrow.parquet as pq %%timeit df = pq.read_table(‘example2.parquet’).to_pandas() 10 loops, best of 3: 175 ms per loop All Rights Reserved 31
  • 32. Digging deeper February 9, 2017 •  Why does it take Spark ~1.8 seconds to send 128MB of data over the wire? val collectedRows = queryExecution.executedPlan.executeCollect() cnvtr.internalRowsToPayload(collectedRows, this.schema) All Rights Reserved Array[InternalRow] 32
  • 33. Digging deeper February 9, 2017 •  In our 128MB test case, on average: •  75% of time is being spent collecting Array[InternalRow] from the task executors •  25% of the time is spent on a single-threaded conversion of all the data from Array[InternalRow] to ArrowRecordBatch •  We can go much faster by performing the Spark SQL -> Arrow conversion locally on the task executors, then streaming the batches to Python All Rights Reserved 33
  • 34. Future architecture February 9, 2017All Rights Reserved Task executor Task executor Task executor Task executor Arrow RecordBatch Arrow RecordBatch Arrow RecordBatch Arrow RecordBatch Arrow Schema Spark driver Python 34
  • 35. For illustration purposes only. Not an offer to buy or sell securities. Two Sigma may modify its investment approach and portfolio parameters in the future in any manner that it believes is consistent with its fiduciary duty to its clients. There is no guarantee that Two Sigma or its products will be successful in achieving any or all of their investment objectives. Moreover, all investments involve some degree of risk, not all of which will be successfully mitigated. Please see the last page of this presentation for important disclosure information. Hot off the presses February 9, 2017All Rights Reserved ncalls tottime percall cumtime percall filename:lineno(function) 5 0.000 0.000 5.928 1.186 dataframe.py:1570(toPandas) 5 0.000 0.000 5.838 1.168 dataframe.py:394(collectAsArrow) 5919 0.005 0.000 5.824 0.001 socket.py:561(readinto) 5919 5.809 0.001 5.809 0.001 {method 'recv_into' of '_socket.socket‘} ... 5 0.086 0.017 0.091 0.018 {method 'to_pandas' of 'pyarrow.Table‘} 35 Patch from February 8: 38% perf improvement
  • 36. The work ahead February 9, 2017 •  Luckily, speeding up toPandas and speeding up Lambda / UDF functions is architecturally the same type of problem •  Reasonably clear path to making toPandas even faster •  How can you get involved? •  Keep an eye on Spark ASF JIRA •  Contribute to Apache Arrow (Java, C++, Python, other languages) •  Join the Arrow and Spark mailing lists All Rights Reserved 36
  • 37. Thank you February 9, 2017 •  Bryan Cutler, Li Jin, and Yin Xusen, for building the integration Spark-Arrow integration •  Apache Arrow community •  Spark Summit organizers •  Two Sigma and IBM, for supporting this work All Rights Reserved 37