54
Python 札札 201406 >>> "Python3 札 " >>> "Django 札札札札札札札札札札札札札札札 " >>> "ApacheSpark 札 Python 札札札札札札札札札 "

Python札幌201406

Embed Size (px)

Citation preview

Page 1: Python札幌201406

Python 札幌 201406>>> "Python3 へ ">>> "Django フレームワークの近況とこれから ">>> "ApacheSpark と Python を使ってデータ分析"

Page 2: Python札幌201406

お前、誰よ ?

• 岡野 真也 (tokibito)• 住んでた場所 : 大阪→和歌山→北海道 ( 北見 )→ 北海道 ( 札幌 )→ 東京• 株式会社ビープラウド

• 受託開発 (Web システム、 Android/iOS アプリなど )• システム開発コンサルティング• プログラミング研修

• Python は 8 年ぐらい使ってます• Django は 7 年ぐらい使ってます (0.95 ~ )

↑  ビープラウドが作ってる

Page 3: Python札幌201406

今日のテーマ

>>> "Python3 へ ">>> "Django フレームワークの近況とこれから ">>> "ApacheSpark と Python を使ってデータ処理 "

3 つのうち、後ろ 2 つはアンケートで希望の多かったものです。

Page 4: Python札幌201406

Python3 へ

Page 5: Python札幌201406

Python3 とは ?

• 最新版の Python• 最新バージョンは 3.4.1

Page 6: Python札幌201406

言いたいこと

• できるだけ Python3 を使いましょう

Page 7: Python札幌201406

Python のバージョンについて

• 現在、 Python のバージョンは 2 系 (2.x) と 3 系 (3.x) がある• 2 系はまだ現役で使われている• 機能追加は 3 系のみ

• 2 系はバグ・セキュリティの対応のみ• 2 系の最新版は 2.7.7• 2.8 はリリースされません ( 重要 )

• PEP-404 Python 2.8 Un-release Schedule• 2.7 からのアップグレードは Python3 系です

Page 8: Python札幌201406

なぜ最新版を使ってないの ?

• 2 系から 3 系になるときに、互換性の無い変更があった• → 移行にはコードの修正が必須

• Python3 リリース当初は、 2 系で動いていたサードパーティモジュールがほとんど動かなかった• → 移行するためにはサードパーティモジュールの Python3 対応も必要

• 既存のコード資産が多く移行が大変• → 移行にはコスト・時間がかかる• 一部の Linux ディストリビューションでは Python 製のツールが多く、

一度にすべて移行するのが難しかった

Page 9: Python札幌201406

2 系と 3 系の違い

• print• 2.x: print "hoge"• 3.x: print("hoge")

• 文字列型 (str)• 2.x: " 日本語 " ← !!!• 3.x: " 日本語 ".encode('utf8') # 2 系の str 型に相当するものは bytes 型

• 文字列型 (Unicode)• 2.x: u" 日本語 "• 3.x: " 日本語 " ← !!! # 2 系の unicode 型に相当するのは str 型

• 3.3 以降では u" 日本語 " が使えるようになった

• 除算• 2.x: 5 / 2 # => 2• 3.x: 5 / 2 # => 2.5

Page 10: Python札幌201406

2 系と 3 系の違い

• 辞書の items メソッド• 2.x: {"a": 1}.items() # => [('a', 1)] というリストが返される• 3.x: {"a": 1}.items() # => dict_items([('a', 1)]) というイテレータが返され

る• 標準モジュールの Unicode 対応

• 2 系では入力が str 型 ( 非 Unicode) だったものが、 3 系の str 型 (2 系のunicode 型相当 ) に対応した• csv モジュール

• 標準モジュールの API 変更• パッケージ名が変更されていたり• urllib

• 2.x: urllib.urlopen()• 3.x: urllib.request.urlopen()

• 他多数

Page 11: Python札幌201406

2 系はいつまで使えるの ?

• 公式の Python2.7 系メンテナンス期限は 2020 年まで• Linux などのディストリビューションのサポート期限まで

• RHEL7 は Python2.7 だけど 2024 年までサポートされるらしいよ

Page 12: Python札幌201406

Python3 を使う利点は ?

• 文字列型が Unicode になったのでマルチバイトの文字列操作のハマりどころが減ってる• csv モジュールとか !

※3 系で追加された機能の多くは 2.7 にバックポートされてる→ 移行しやすくするためです

Page 13: Python札幌201406

サードパーティモジュールの Python3対応状況• 大きめのプロジェクトでも、おおむね対応済み

• 2.7 と 3.3, 3.4 に対応してるものが多い• 2.6 をサポートしなくなってきている

• PyPI のダウンロード数上位の Python3 対応状況• 163/200 (2014/6/7)

• フォークされたプロジェクトで対応してるものもある• http://python3wos.appspot.com/

Page 14: Python札幌201406

2 系と 3 系どちらを使えばいいの ?

• 今現在、業務で使うなら 2 系 ( 問題なければ 3 系でも可 )• 弊社で使ってるモジュールのうち 2 系でしか動かないもの

• mercurial• fabric• ansible• Skype4Py

• GoogleAppEngine や Azure などの PaaS がサポートしているのは 2 系• これから勉強を始めるなら 3 系

• 3 系の最新バージョン (3.4)

Page 15: Python札幌201406

3 系に対応するには

• 2 系に対応しない場合• 3 系の文法に書き換える• 3 系の標準モジュールに対応させる

• 2 系と 3 系で動くようにする場合• 2 系と 3 系で動く文法に書き換える (2 系の古いバージョンを切り捨て

る )• try .. except など• 3.0 ~ 3.2 に対応しようとすると大変なので切り捨てても良い

• 互換性を吸収するモジュールを用意する (compat)• 2to3 や six を使う

Page 16: Python札幌201406

2 系から 3 系への移行に便利なツール

• 2to3• Python2 のコードを Python3 対応に変換する

• 変換したコードが必ず正しく動く保証はない• 変換に時間がかかるため開発時のテンポが悪い

• six• Python2 と Python3 の差異を吸収するための API や定数を提供

• 型の差異 (例 . Python2: int & long, Python3: int)• 文法の差異 (例 . metaclass,)• バイナリ列と文字列の扱い

• tox• マルチバージョンでのテスト実行 ( コマンド一発で復数の virtualenv 作成 )• GitHub+TravisCI で使うとさらに良い

Page 17: Python札幌201406

2 系から 3 系への移行のアプローチ例

1. テストコードがない場合→テストコードを書く2. tox でテストできるようにする3. 2.7未満のバージョンを使っている場合→まずは 2.7 で動くよう

にする4. サードパーティモジュールを 3 系対応のものに変更する

• バージョンアップで対応できるものもある• Python3 に対応したフォークを使う手もある

5. 2 系でしか動かない文法を、 2.7 と 3.4 で動くものに修正する• six を利用するのも良い

6. 2 系と 3 系で互換性がない部分が動くように修正する• six を利用するのも良い• ファイル入出力や文字列のエンコーディング周り• 標準モジュールの違い

Page 18: Python札幌201406

まとめ

• 業務なら Python2 を使わざるを得ない状況がまだある• サードパーティ製モジュールは割と Python3 に対応してきてる• できるだけ Python3 を使いましょう

Page 19: Python札幌201406

参考

• http://www.slideshare.net/naoina/python-kyoto-study• http://www.slideshare.net/aodag/bpstudy54-python3• http://docs.python.jp/3.3/howto/pyporting.html

Page 20: Python札幌201406

Django フレームワークの

近況とこれから

Page 21: Python札幌201406

Django の近況

• 最新の安定バージョンは 1.6.5• 1.6 のリリースは 2013/11/6

• 最新の LTS リリースバージョンは 1.4.13• 開発中の 1.7 系は 1.7.b4

• alpha→beta→RC→final

Page 22: Python札幌201406

Django のメンテナンスポリシー

• 1 つ前の安定版までメンテナンスされる• 1.7 がリリースされると、 1.5 はメンテナンス終了

Page 23: Python札幌201406

最近のリリースのペース

• Django 1.3 (2011/05)• Django 1.4 (2012/03)• Django 1.5 (2013/02)• Django 1.6 (2013/11)

9 ~ 11ヶ月ぐらいでリリースされてる→ リリースから 2 年程度でメンテナンス終了する可能性

が高い

Page 24: Python札幌201406

LTS リリースとは ?

•長期サポート (Long-term support) リリース• Django1.4 が最初の LTS リリース (2013/09 の DjangoCon でアナウンスさ

れた )

•安定版のリリースから 3 年以上のサポートが保証される• Django1.4 のリリースは 2012 年 3月• 1.4LTS は 2015 年 3月までメンテナンスされる

Page 25: Python札幌201406

最近のリリースの内容

• 1.4 ~ 1.6

Page 26: Python札幌201406

Django1.4

• タイムゾーンサポート• デフォルトのプロジェクトレイアウトを変更• Python2.5 以上•その他

• https://docs.djangoproject.com/en/dev/releases/1.4/

Page 27: Python札幌201406

タイムゾーンサポート

• データベースに UTC で保存し、設定でローカル日時に変換して使用• settings.USE_TZ = True の場合のみ• django.utils.timezone モジュール

import datetimefrom django.utils.timezone import utcnow = datetime.datetime.utcnow().replace(tzinfo=utc)

Page 28: Python札幌201406

デフォルトのプロジェクトレイアウトを変更•旧

• project/manage.py• project/settings.py• project/urls.py• project/app/models.py # アプリケーションのレイアウトは変更無し

• 新• project/manage.py• project/project/settings.py• project/project/urls.py• project/project/wsgi.py• project/app/models.py

• PYTHONPATH が重なる問題が解消した

Page 29: Python札幌201406

Django1.5

•カスタムユーザーモデルのサポート• Python3 サポート (実験的 )• Python2.6.5 以上•その他

• https://docs.djangoproject.com/en/dev/releases/1.5/

Page 30: Python札幌201406

カスタムユーザーモデルのサポート

• django.contrib.auth の User モデルを差し替えられるようになった• settings.AUTH_USER_MODEL = 'myapp.MyUser'• 以前は追加の情報を別モデル (別テーブル ) に持たせて JOIN

Page 31: Python札幌201406

Python3 サポート

•エンコーディング変換周りが Python3 に対応• django.utils.encoding.force_text や django.utils.encoding.smart_bytes など

• モデルの __unicode__ メソッドは、 Python3 では __str__• @python_2_unicode_compatible デコレータ

from __future__ import unicode_literalsfrom django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatibleclass MyClass(object): def __str__(self): return "Instance of my class"

Page 32: Python札幌201406

Django1.6

• プロジェクトとアプリケーションのテンプレートをシンプルに• データベース接続の持続 (Persistent database connection) をサ

ポート• Python3(3.2, 3.3) 正式サポート•その他

• https://docs.djangoproject.com/en/dev/releases/1.6/

Page 33: Python札幌201406

プロジェクトとアプリケーションのテンプレートをシンプルに•旧

• settings.py 158 行• アプリケーションのテンプレート

• tests.py にサンプルコードが含まれてた• view.py はコメントのみ

• 新• settings.py 82 行• アプリケーションのテンプレート

• tests.py は import のみ• views.py に render関数の import 追加• admin.py 追加

Page 34: Python札幌201406

Django1.7 ( 開発中のバージョン )

• スキーママイグレーション• アプリケーションロードのリファクタリング•カスタムクエリセットのメソッドをマネージャから呼び出し可

能に• Python 2.6 サポートを削除• Python 3.4 正式サポート•その他

• https://docs.djangoproject.com/en/dev/releases/1.7/

Page 35: Python札幌201406

スキーママイグレーション

• migrate, makemigrations コマンドの追加• South の統合 (KickStarter での募金により 17,952ユーロ (245万円程度 )集まった )• South からの移行についてもドキュメントに書かれている• https://docs.djangoproject.com/en/dev/topics/migrations/

syncdb コマンドは非推奨となり migrate に置き換えられた

$ python manage.py migrate # マイグレーションの実行$ python manage.py makemigrations # マイグレーションの作成

Page 36: Python札幌201406

アプリケーションロードのリファクタリング• アプリケーションロード時のフックポイントが増えた

• 今までは models.py がロードされた際にシグナルの登録などをしていた• urls.py で実行していた admin.autodiscover() は ready メソッド内で実行

に変更• 新しく追加された AppConfig クラスをアプリケーションとして

INSTALLED_APPS に指定可能• 同じアプリケーションで設定だけを変更して復数登録したりできるよ

うになった•参考

• http://d.hatena.ne.jp/nullpobug/20140301/1393660554

Page 37: Python札幌201406

カスタムクエリセットのメソッドをマネージャから呼び出し可能に• models.QuerySet.as_manager() が追加され、 Manager インスタン

スを生成できるようになった•カスタムで定義した QuerySet のメソッドをメソッドチェーンで

使いやすくなった• 今までは QuerySet と Manager の両方にメソッドを用意しないといけな

かった

Page 38: Python札幌201406

カスタムクエリセットのメソッド

class FoodQuerySet(models.QuerySet):

def pizzas(self):

return self.filter(kind='pizza')

def vegetarian(self):

return self.filter(vegetarian=True)

class Food(models.Model):

kind = models.CharField(max_length=50)

vegetarian = models.BooleanField()

objects = FoodQuerySet.as_manager() # Managerインスタンス生成

Food.objects.pizzas().vegetarian() # メソッドチェーンで利用可能

Page 39: Python札幌201406

どのバージョンを使えば良い ?

•基本的に最新の安定バージョンを使えばよい• 非公開 ( ドキュメントに書かれてない ) の API と非推奨の API を

使っていなければ、マイナーバージョンの 1 つか 2 つぐらいまでなら移行は楽• Python3 なら Django1.6 以上

Page 40: Python札幌201406

まとめ

• Django の開発は今も活発です• メンテナンス期限をバージョンではなく期間で保証する LTS リ

リースというものがでました• Django は Python3 で使えます

Page 41: Python札幌201406

参考

• https://docs.djangoproject.com/en/dev/

Page 42: Python札幌201406

Apache Spark とPython を

使ってデータ分析

Page 43: Python札幌201406

Apache Spark とは ?

• Hadoop の MapReduce を置き換えるプログラミングモデル•繰り返し処理を高速にするため HDFS の入出力をキャッシュ• データ処理の記述は DSL

• scala• Java• Python

Spark についての詳しくはドキュメントとか @oza_x86 さんのスライドを見るとよさそうhttp://www.slideshare.net/ozax86/spark-shark

Page 44: Python札幌201406

Apache Hadoop

• 分散処理基盤•構成

• HDFS ( 分散ファイルシステム )• MapReduce ( 分散処理フレームワーク )

Page 45: Python札幌201406

Spark の処理で Python を使う

• Python で HDFS 上のデータを処理できる• pyspark コマンド• Python の対話モード

• ipython も使える

Page 46: Python札幌201406

これで何がうれしいの ?

• 1台のマシンでは処理しきれないような大容量のデータに対して、たくさんのマシンリソース ( メモリリソース ) を使って、 Python でデータを処理できる• 自前でリソース管理とか分散処理の仕組みを実装しなくていい

Page 47: Python札幌201406

pyspark コマンドを使ってみる

マスターノードを指定して起動$ MASTER=spark://localhost.localdomain:7077 pyspark

IPYTHON を使う場合$ IPYTHON=1 MASTER=spark://localhost.localdomain:7077 pyspark

スクリプトファイルを実行 (pyspark モジュールの関数やクラスを使用 )$ pyspark main.py

Page 48: Python札幌201406

Python 対話モードで操作

>>> sc # 対話モードで起動すると有効になっているコンテキスト変数<pyspark.context.SparkContext object at 0x182c150>

# HDFS 上のファイルからデータセットを作成>>> textFile = sc.textFile('/tmp/ken_all_utf8.csv')

# データセットに対して操作>>> textFile.filter(lambda row:u' 札幌 ' in row).count()823

Page 49: Python札幌201406

スクリプトファイルで実行

# coding: utf-8from pyspark import SparkContext

def main(): sc = SparkContext('local', 'MyApp') textFile = sc.textFile('/tmp/ken_all_utf8.csv') result = textFile.filter(lambda row: u'札幌 ' in row) print result.count()

if __name__ == '__main__': main()

Page 50: Python札幌201406

データセットを操作する API

• Transformations• map(func) # 行単位で func を実行してデータを変換、加工• filter(func) # 行単位で func を実行してデータをフィルタ• join(otherDataset, [num Tasks]) # データセットを結合• …

• Actions• reduce(func) # データセットを func で集約• count() # 行数を返す• saveAsTextFile(path) # データセットを HDFS へ保存• …

• http://spark.apache.org/docs/latest/programming-guide.html• これらの API を使ってデータを処理、分析する

Page 51: Python札幌201406

ハマったところ

• 日本語の扱い• 半角カナ混じりの cp932エンコードされたファイル (KEN_ALL.CSV) を直接使おうとしたら、 filter でマッチしなかった• エンコードエラーにもならなかったので、どこかで強制変換されておかしくなっ

てるかも?• UTF-8 のファイルにしてみたら問題なかった

• Python のバージョン• Spark を動かしている Python バージョンと pyspark コマンドで使用す

る Python のバージョンが一致していないと動かなかった• Python3未対応

Page 52: Python札幌201406

試してみるには ?

• Cloudera の quickstart-vm(5.0 以上 ) に ApacheSpark が含まれているので、これを使うのが簡単

Page 53: Python札幌201406

まとめ

• ApacheSpark を利用すると HDFS 上のファイルを処理できる• pyspark コマンドを使って ApacheSpark を Python で利用できる• pyspark モジュールの API を使ってデータの加工、変形、解析が

できる

→ApacheSpark + Python(pyspark) で大容量のデータ解析できる!

Page 54: Python札幌201406

参考

• http://spark.apache.org/docs/latest/• http://www.slideshare.net/ozax86/spark-shark