■ はじめに
Amazon EMR(外部接続不可) に wheelファイルを pip install しようとした時に エラー「Read time out」が発生したので、その際の出来事をメモする
目次
【1】概要 【2】原因 補足:問題の切り分けに使ったコマンド「--no-deps」 【3】解決案 補足:boto3をEMRにネットワーク経由せずにインストールするには
【1】概要
外部接続不可の Amazon EMR に対して、 S3上にある Python の wheelファイルをダウンロードして (今回の場合、boto3 「boto3-1.17.107-py2.py3-none-any.whl」) pip install した際にエラー「Read time out」が発生した。 ローカルファイルにあるものをインストールしているのに なぜ外部ネットワークに繋ぐって(当初は)思ってしまった。。。
コマンド / エラー内容例
$ aws s3 cp s3://your-bucket-name/xxx/boto3-1.17.107-py2.py3-none-any.whl ./ download: s3://your-bucket-name/xxx/boto3-1.17.107-py2.py3-none-any.whl to ./boto3-1.17.107-py2.py3-none-any.whl $ sudo pip-3.6 install boto3-1.17.107-py2.py3-none-any.whl Processing ./boto3-1.17.107-py2.py3-none-any.whl Collecting botocore<1.21.0> >= 1.20.107 (from boto3==1.17.107) Retrying (Retry(total=4, connectNone, read=None, readirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool (host='pypi.python.org', port=443); Read time out. (read timeout=15)",)": /simple/s3transfer/ Retrying (...
【2】原因
インストールしたWheelファイルの依存するモジュールが 現状の環境にインストールされていない又は必要バージョン未満だったため。 => エラーのこの部分「Collecting botocore<1.21.0> >= 1.20.107 (from boto3==1.17.107)」 その結果、pip install で取得しに行こうとして、 外部ネットワークに繋がらないので、エラーになっていた。
補足:問題の切り分けに使ったコマンド「--no-deps」
問題の切り分けに、 依存パッケージをインストールしないオプション「--no-deps」 を付加して実行したらすんなりインストールできた。
https://e-tec-memo.herokuapp.com/article/295/
コマンド例
# 「--no-deps」を付加 $ sudo pip-3.6 install --no-deps boto3-1.17.107-py2.py3-none-any.whl # これでエラーが起こらずにインストールできたら、同じ現象かと思います。
【3】解決案
1)外部ネットワークに接続できるように交渉する 2)インストールされているAMIを作成しそれをもとにEMRを作成する 3)依存関係のパッケージを地道にダウンロードしてくる 4)boto3を使わずに AWS CLIで頑張る などなど...
補足:boto3をEMRにネットワーク経由せずにインストールするには
「3)依存関係のパッケージを地道にダウンロードしてくる」を選択した場合 以下の依存パッケージを順番にインストール(★)する必要がある ★2021/07/10追記 「順番にインストール」と書いたが 順番を気にせずインストールする方法を以下の関連記事に記載した。
オフライン環境下で pip install するには
https://dk521123.hatenablog.com/entry/2021/07/10/164833
上記の実行環境で「boto3-1.17.107-py2.py3-none-any.whl」を ネットワーク経由せずにインストールするには、 以下を順番にpip3 インストールする必要があった。 (Try-And-Errorで地道に依存パッケージを調べていった) 実行環境(以下「実行環境」を参照)や インストールするパッケージにより他にも必要かも。
boto3に必要な依存パッケージ
1)python-dateutil (botocoreの依存パッケージ)
https://pypi.org/project/python-dateutil/
2)urllib3 (botocoreの依存パッケージ)
https://pypi.org/project/urllib3/
3)botocore (boto3の依存パッケージ)
https://pypi.org/project/botocore/
4)s3transfer (boto3の依存パッケージ)
https://pypi.org/project/s3transfer/
実行環境
Amazon EMR : emr-5.29.0 Python3 : v3.6.8 Python : v2.7.16
関連記事
パッケージ管理 ~ pip / wheel, egg ~
https://dk521123.hatenablog.com/entry/2019/11/09/001342
オフライン環境下で pip install するには
https://dk521123.hatenablog.com/entry/2021/07/10/164833
仮想環境 ~ pyenv / virtualenv / venv / pipenv ~
https://dk521123.hatenablog.com/entry/2020/02/11/141852
egg / wheel ファイルを作成する
https://dk521123.hatenablog.com/entry/2020/02/09/234350