View
2.210
Download
0
Category
Preview:
Citation preview
Python 札幌 201406>>> "Python3 へ ">>> "Django フレームワークの近況とこれから ">>> "ApacheSpark と Python を使ってデータ分析"
お前、誰よ ?
• 岡野 真也 (tokibito)• 住んでた場所 : 大阪→和歌山→北海道 ( 北見 )→ 北海道 ( 札幌 )→ 東京• 株式会社ビープラウド
• 受託開発 (Web システム、 Android/iOS アプリなど )• システム開発コンサルティング• プログラミング研修
• Python は 8 年ぐらい使ってます• Django は 7 年ぐらい使ってます (0.95 ~ )
↑ ビープラウドが作ってる
今日のテーマ
>>> "Python3 へ ">>> "Django フレームワークの近況とこれから ">>> "ApacheSpark と Python を使ってデータ処理 "
3 つのうち、後ろ 2 つはアンケートで希望の多かったものです。
Python3 へ
Python3 とは ?
• 最新版の Python• 最新バージョンは 3.4.1
言いたいこと
• できるだけ Python3 を使いましょう
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 系です
なぜ最新版を使ってないの ?
• 2 系から 3 系になるときに、互換性の無い変更があった• → 移行にはコードの修正が必須
• Python3 リリース当初は、 2 系で動いていたサードパーティモジュールがほとんど動かなかった• → 移行するためにはサードパーティモジュールの Python3 対応も必要
• 既存のコード資産が多く移行が大変• → 移行にはコスト・時間がかかる• 一部の Linux ディストリビューションでは Python 製のツールが多く、
一度にすべて移行するのが難しかった
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
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()
• 他多数
2 系はいつまで使えるの ?
• 公式の Python2.7 系メンテナンス期限は 2020 年まで• Linux などのディストリビューションのサポート期限まで
• RHEL7 は Python2.7 だけど 2024 年までサポートされるらしいよ
Python3 を使う利点は ?
• 文字列型が Unicode になったのでマルチバイトの文字列操作のハマりどころが減ってる• csv モジュールとか !
※3 系で追加された機能の多くは 2.7 にバックポートされてる→ 移行しやすくするためです
サードパーティモジュールの Python3対応状況• 大きめのプロジェクトでも、おおむね対応済み
• 2.7 と 3.3, 3.4 に対応してるものが多い• 2.6 をサポートしなくなってきている
• PyPI のダウンロード数上位の Python3 対応状況• 163/200 (2014/6/7)
• フォークされたプロジェクトで対応してるものもある• http://python3wos.appspot.com/
2 系と 3 系どちらを使えばいいの ?
• 今現在、業務で使うなら 2 系 ( 問題なければ 3 系でも可 )• 弊社で使ってるモジュールのうち 2 系でしか動かないもの
• mercurial• fabric• ansible• Skype4Py
• GoogleAppEngine や Azure などの PaaS がサポートしているのは 2 系• これから勉強を始めるなら 3 系
• 3 系の最新バージョン (3.4)
3 系に対応するには
• 2 系に対応しない場合• 3 系の文法に書き換える• 3 系の標準モジュールに対応させる
• 2 系と 3 系で動くようにする場合• 2 系と 3 系で動く文法に書き換える (2 系の古いバージョンを切り捨て
る )• try .. except など• 3.0 ~ 3.2 に対応しようとすると大変なので切り捨てても良い
• 互換性を吸収するモジュールを用意する (compat)• 2to3 や six を使う
2 系から 3 系への移行に便利なツール
• 2to3• Python2 のコードを Python3 対応に変換する
• 変換したコードが必ず正しく動く保証はない• 変換に時間がかかるため開発時のテンポが悪い
• six• Python2 と Python3 の差異を吸収するための API や定数を提供
• 型の差異 (例 . Python2: int & long, Python3: int)• 文法の差異 (例 . metaclass,)• バイナリ列と文字列の扱い
• tox• マルチバージョンでのテスト実行 ( コマンド一発で復数の virtualenv 作成 )• GitHub+TravisCI で使うとさらに良い
2 系から 3 系への移行のアプローチ例
1. テストコードがない場合→テストコードを書く2. tox でテストできるようにする3. 2.7未満のバージョンを使っている場合→まずは 2.7 で動くよう
にする4. サードパーティモジュールを 3 系対応のものに変更する
• バージョンアップで対応できるものもある• Python3 に対応したフォークを使う手もある
5. 2 系でしか動かない文法を、 2.7 と 3.4 で動くものに修正する• six を利用するのも良い
6. 2 系と 3 系で互換性がない部分が動くように修正する• six を利用するのも良い• ファイル入出力や文字列のエンコーディング周り• 標準モジュールの違い
まとめ
• 業務なら Python2 を使わざるを得ない状況がまだある• サードパーティ製モジュールは割と Python3 に対応してきてる• できるだけ Python3 を使いましょう
参考
• http://www.slideshare.net/naoina/python-kyoto-study• http://www.slideshare.net/aodag/bpstudy54-python3• http://docs.python.jp/3.3/howto/pyporting.html
Django フレームワークの
近況とこれから
Django の近況
• 最新の安定バージョンは 1.6.5• 1.6 のリリースは 2013/11/6
• 最新の LTS リリースバージョンは 1.4.13• 開発中の 1.7 系は 1.7.b4
• alpha→beta→RC→final
Django のメンテナンスポリシー
• 1 つ前の安定版までメンテナンスされる• 1.7 がリリースされると、 1.5 はメンテナンス終了
最近のリリースのペース
• Django 1.3 (2011/05)• Django 1.4 (2012/03)• Django 1.5 (2013/02)• Django 1.6 (2013/11)
9 ~ 11ヶ月ぐらいでリリースされてる→ リリースから 2 年程度でメンテナンス終了する可能性
が高い
LTS リリースとは ?
•長期サポート (Long-term support) リリース• Django1.4 が最初の LTS リリース (2013/09 の DjangoCon でアナウンスさ
れた )
•安定版のリリースから 3 年以上のサポートが保証される• Django1.4 のリリースは 2012 年 3月• 1.4LTS は 2015 年 3月までメンテナンスされる
最近のリリースの内容
• 1.4 ~ 1.6
Django1.4
• タイムゾーンサポート• デフォルトのプロジェクトレイアウトを変更• Python2.5 以上•その他
• https://docs.djangoproject.com/en/dev/releases/1.4/
タイムゾーンサポート
• データベースに UTC で保存し、設定でローカル日時に変換して使用• settings.USE_TZ = True の場合のみ• django.utils.timezone モジュール
import datetimefrom django.utils.timezone import utcnow = datetime.datetime.utcnow().replace(tzinfo=utc)
デフォルトのプロジェクトレイアウトを変更•旧
• 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 が重なる問題が解消した
Django1.5
•カスタムユーザーモデルのサポート• Python3 サポート (実験的 )• Python2.6.5 以上•その他
• https://docs.djangoproject.com/en/dev/releases/1.5/
カスタムユーザーモデルのサポート
• django.contrib.auth の User モデルを差し替えられるようになった• settings.AUTH_USER_MODEL = 'myapp.MyUser'• 以前は追加の情報を別モデル (別テーブル ) に持たせて JOIN
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"
Django1.6
• プロジェクトとアプリケーションのテンプレートをシンプルに• データベース接続の持続 (Persistent database connection) をサ
ポート• Python3(3.2, 3.3) 正式サポート•その他
• https://docs.djangoproject.com/en/dev/releases/1.6/
プロジェクトとアプリケーションのテンプレートをシンプルに•旧
• settings.py 158 行• アプリケーションのテンプレート
• tests.py にサンプルコードが含まれてた• view.py はコメントのみ
• 新• settings.py 82 行• アプリケーションのテンプレート
• tests.py は import のみ• views.py に render関数の import 追加• admin.py 追加
Django1.7 ( 開発中のバージョン )
• スキーママイグレーション• アプリケーションロードのリファクタリング•カスタムクエリセットのメソッドをマネージャから呼び出し可
能に• Python 2.6 サポートを削除• Python 3.4 正式サポート•その他
• https://docs.djangoproject.com/en/dev/releases/1.7/
スキーママイグレーション
• 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 # マイグレーションの作成
アプリケーションロードのリファクタリング• アプリケーションロード時のフックポイントが増えた
• 今までは models.py がロードされた際にシグナルの登録などをしていた• urls.py で実行していた admin.autodiscover() は ready メソッド内で実行
に変更• 新しく追加された AppConfig クラスをアプリケーションとして
INSTALLED_APPS に指定可能• 同じアプリケーションで設定だけを変更して復数登録したりできるよ
うになった•参考
• http://d.hatena.ne.jp/nullpobug/20140301/1393660554
カスタムクエリセットのメソッドをマネージャから呼び出し可能に• models.QuerySet.as_manager() が追加され、 Manager インスタン
スを生成できるようになった•カスタムで定義した QuerySet のメソッドをメソッドチェーンで
使いやすくなった• 今までは QuerySet と Manager の両方にメソッドを用意しないといけな
かった
カスタムクエリセットのメソッド
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() # メソッドチェーンで利用可能
どのバージョンを使えば良い ?
•基本的に最新の安定バージョンを使えばよい• 非公開 ( ドキュメントに書かれてない ) の API と非推奨の API を
使っていなければ、マイナーバージョンの 1 つか 2 つぐらいまでなら移行は楽• Python3 なら Django1.6 以上
まとめ
• Django の開発は今も活発です• メンテナンス期限をバージョンではなく期間で保証する LTS リ
リースというものがでました• Django は Python3 で使えます
Apache Spark とPython を
使ってデータ分析
Apache Spark とは ?
• Hadoop の MapReduce を置き換えるプログラミングモデル•繰り返し処理を高速にするため HDFS の入出力をキャッシュ• データ処理の記述は DSL
• scala• Java• Python
Spark についての詳しくはドキュメントとか @oza_x86 さんのスライドを見るとよさそうhttp://www.slideshare.net/ozax86/spark-shark
Apache Hadoop
• 分散処理基盤•構成
• HDFS ( 分散ファイルシステム )• MapReduce ( 分散処理フレームワーク )
Spark の処理で Python を使う
• Python で HDFS 上のデータを処理できる• pyspark コマンド• Python の対話モード
• ipython も使える
これで何がうれしいの ?
• 1台のマシンでは処理しきれないような大容量のデータに対して、たくさんのマシンリソース ( メモリリソース ) を使って、 Python でデータを処理できる• 自前でリソース管理とか分散処理の仕組みを実装しなくていい
pyspark コマンドを使ってみる
マスターノードを指定して起動$ MASTER=spark://localhost.localdomain:7077 pyspark
IPYTHON を使う場合$ IPYTHON=1 MASTER=spark://localhost.localdomain:7077 pyspark
スクリプトファイルを実行 (pyspark モジュールの関数やクラスを使用 )$ pyspark main.py
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
スクリプトファイルで実行
# 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()
データセットを操作する 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 を使ってデータを処理、分析する
ハマったところ
• 日本語の扱い• 半角カナ混じりの cp932エンコードされたファイル (KEN_ALL.CSV) を直接使おうとしたら、 filter でマッチしなかった• エンコードエラーにもならなかったので、どこかで強制変換されておかしくなっ
てるかも?• UTF-8 のファイルにしてみたら問題なかった
• Python のバージョン• Spark を動かしている Python バージョンと pyspark コマンドで使用す
る Python のバージョンが一致していないと動かなかった• Python3未対応
試してみるには ?
• Cloudera の quickstart-vm(5.0 以上 ) に ApacheSpark が含まれているので、これを使うのが簡単
まとめ
• ApacheSpark を利用すると HDFS 上のファイルを処理できる• pyspark コマンドを使って ApacheSpark を Python で利用できる• pyspark モジュールの API を使ってデータの加工、変形、解析が
できる
→ApacheSpark + Python(pyspark) で大容量のデータ解析できる!
参考
• http://spark.apache.org/docs/latest/• http://www.slideshare.net/ozax86/spark-shark
Recommended