python at facebook

34

Upload: angelo-michele-failla

Post on 13-Jun-2015

574 views

Category:

Technology


15 download

DESCRIPTION

Facebook is a company that operates at massive scale. In this talk we’ll talk about how we use Python at Facebook. Be it building back-end services, fast prototyping, automation, scaling operations, or simply gluing together various pieces of our infrastructure, Python is at the heart of it and allows our engineers to quickly deliver working solutions. We’ll talk about our review process, unit testing, deployment workflow and various open-source framework we use.

TRANSCRIPT

Page 1: Python at Facebook
Page 2: Python at Facebook

Python @ Facebook

Angelo FaillaProduction Engineer @ Facebook DublinOctober 11th, 2014 -- PyCon Ireland 2014

Page 3: Python at Facebook

How do we use Python at Facebook?1

Description of a production system based on Python2

Questions3

Agenda

Page 4: Python at Facebook

How do we use

Python at Facebook?

Page 5: Python at Facebook
Page 6: Python at Facebook

• Centralized repo for back-end systems

• A LOT of code.

• All Python code hosted there

• 3rd most used language(PHP/Hack => C++ => Python)

• Still a LOT of code :P

Page 7: Python at Facebook

Idreamlikecrazy @ https://www.flickr.com/photos/purple-lover/13583362554 (cc 2.0 license)

ONE BUILD TOOL

TO RULE THEM ALL

Page 8: Python at Facebook

Everything is built from HEADC++ binaries are statically linked

http://cdn.instapop.com/assets/memes/Skeptical%20Baby/4302/thumb.jpeg?1383838705

Page 9: Python at Facebook

PAR file

How about the same in Python? We use .par files

Short shell script header

Zipped content

__main__.py

.py, .pyc files

.so and other files needed by the application

Page 10: Python at Facebook

Thrift (https://thrift.apache.org/) in a nutshell

Client/Server app imports generated code

Thrift compiler generates language bindings

Write myservice.thrift

Page 11: Python at Facebook

# cat ~/repo/thrift_example/myservice.thrift

namespace py thrift_example.myservice

service Calculator { i32 add(1: i32 num1, 2: i32 num2)}

Page 12: Python at Facebook

$ thrift --gen py myservice.thrift

$ tree gen-py/gen-py/├── __init__.py└── myservice ├── Calculator.py ├── Calculator-remote ├── constants.py ├── __init__.py └── ttypes.py

Page 13: Python at Facebook

# cat ~/fbcode/thrift_example/server.py# import lines removed, see: http://tinyurl.com/p6a7cuw

1: class CalculatorHandler(Calculator.Iface): 2: def add(self, num1, num2): 3: return num1 + num2 4: 5: handler = CalculatorHandler() 6: socket = TSocket.TServerSocket(port=9090) 7: tfactory = TTransport.TBufferedTransportFactory() 8: pfactory = TBinaryProtocol.TBinaryProtocolFactory() 9: server = TServer.TSimpleServer(10: handler, socket, tfactory, pfactory)11: server.serve()

Page 14: Python at Facebook

# cat ~/fbcode/thrift_example/client.py# import lines removed, see: http://tinyurl.com/p6zz9ex

1: socket = TSocket.TSocket('localhost', 9090) 2: transport = TTransport.TBufferedTransport(socket) 3: protocol = TBinaryProtocol.TBinaryProtocol(transport) 4: client = Calculator.Client(protocol) 5: transport.open() 6: 7: sum = client.add(1, 2) 8: print(‘1 + 2 = %d’ % sum) 9: 10: transport.close()

Page 15: Python at Facebook

# cat ~/repo/thrift_example/TARGETSthrift_library( name = "myservice_thrift", languages = ["ruby", "php", "cpp", "python"], thrift_srcs = {"myservice.thrift": ["Calculator"]},)

python_binary( name = "myservice_server", main_module = "thrift_example.server", srcs = ["server.py"], deps = [":myservice_thrift-py"],)

python_binary( name = "myservice_client", main_module = "thrift_example.client", srcs = ["client.py"], deps = [":myservice_thrift-py"],)

Page 16: Python at Facebook

pallotron@dev:~/repo $ fbconfig thrift_example/Configuring 20 targetsWriting 208/208 rules to makefile [100%]Done

pallotron@dev:~/repo $ fbmake opt thrift/compiler/thriftl.ll common/memory/JEMalloc.cpp […]Linking _build/opt/thrift/compiler/thrift... _build/opt/thrift/compiler/thrift thrift_example/myservice.thrift _build/opt/thrift_example/myservice_thrift-Calculator-pyremote.lpar _build/opt/thrift_example/myservice_client.lpar _build/opt/thrift_example/myservice_server.lpar _build/opt/thrift_example/myservice_server.par _build/opt/thrift_example/myservice_thrift-Calculator-pyremote.par _build/opt/thrift_example/myservice_client.par

Page 17: Python at Facebook
Page 18: Python at Facebook

Python as a DSL

Page 19: Python at Facebook

Enter configerator…

Page 20: Python at Facebook

MAGIC!

Proxy disk

Application

JSON

Git Repo

Review and Commit

Thrift schema:

struct Job { 1: string name, 2: Scheduling scheduling,} struct Scheduling { 1: int priority,}

Python config:

importThrift(file)myConfig = Job( name = “ajobname”, scheduling = Scheduling( priority = 3))export(myConfig)

Python validator:

def validate_job(job): ensureNotEmpty(job.name) ensurePositive( job.scheduling.priority)

addValidator(myConfig, validate_job)

Distribution

Client lib

Composition

Page 21: Python at Facebook

1: def consume(): 2: 3: handle = dict() 4: ctc = ConfigeratorThriftClient() 5: fname = "example/config" 6: 7: def on_update(name): 8: handle['config'] = ctc.getJSONConfigContent(name) 9:10: ctc.startMonitoringConfig(fname)11: ctc.setUpdateCallback(on_update)12: on_update(fname)13: 14: return handle

Page 22: Python at Facebook

Benefits of using

configerator

Page 23: Python at Facebook

Code review on configuration changes

Automated validation

http://www.jasonawesome.com/wp-content/uploads/2010/06/sally-code-review-300x256.pnghttp://sounddesignlive.com/wp-content/uploads/2013/08/sound-design-live-automate_all_the_things.jpeg

Page 24: Python at Facebook

Clear representation of complex config

No service restart required to pick up changes

http://www.visualthinkingmagic.com/wp-content/uploads/2011/08/complex-simple.gif

http://social.microsoft.com/Forums/getfile/25914/

Page 25: Python at Facebook

Code review at FB

Page 26: Python at Facebook

• Code *is* peer reviewed

• We use Phabricator

• Originally developed @ FB by Evan Priestley

• Go check www.phabricator.org

• Supports git/svn/hg

Page 27: Python at Facebook

• (Some) PEPs enforced and push blocking

• Common code dir for accelerated development

• Unit tests results are clearly visible in our code review tool

http://memegenerator.net/Bill-Lumbergh-Office-Space

Page 28: Python at Facebook

Suggestions for reviewers:

• Reviewing code is not writing code

• Nitpicks are not enough

• Stop typing and have a conversation

• Build trust

• Find people to emulate

Page 29: Python at Facebook

Making diffs easier to be reviewed:

• One and only one thesis

• Do No Harm

• Mix and match reviewers

• Write good test plans

• You are not your code

Page 30: Python at Facebook

Production Python at

Facebook

Page 31: Python at Facebook

• Automated load tests of regions/clusters/hosts

• Implements feedback control loop

• No simulated traffic

• Goal is to find out “breaking point” == real capacity

• Runs daily• Peek time• When no incidents• Skips drained clusters

PROJECT KEANU

Page 32: Python at Facebook

KEANU

Page 33: Python at Facebook

Questions?

Page 34: Python at Facebook