hatunina’s blog

メモと日記です

「AWS 基礎からのネットワーク&サーバー構築」を読んだ

読みました。

www.nikkeibp.co.jp
帯にもあるようにアプリ開発者に超絶おすすめ
WordPress, MySQLをEC2に構築するためのネットワーク周りについて学べます。
vartualBoxとかを使う場合にはもっと細々とコマンドを打ったりしてネットワークを作る必要があるんだろうけど、AWSではGUICLIで簡単に作れちゃうので、GUIの操作も含めて把握できます。
ただ、当然だけどぱらぱらめくっただけの部分はほとんど理解できてないかも。ゲートウェイよくわからん。

CHAPTER9冒頭のまとめ部分は今後何回も見返しそうだし、ネットワーク構築で迷った際には全体的に辞書として使えそう。

aws-cliでCERTIFICATE_VERIFY_FAILEDが出た時の対処

一時的な対処なのでご了承ください。

下記バージョンです。
OSはWin10です。

aws --version
# aws-cli/1.16.10 Python/2.7.9 Windows/8 botocore/1.12.0


configureAPI keyやプロキシ等諸々を設定した後、ネットワークを繋ごうとすると下記エラー

aws s3 ls

# SSL validation failed for https://s3.ap-northeast-1.amazonaws.com/ [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)


そんな時は--no-verifyオプションをつければとりあえずなんとかなる。

aws s3 ls --no-verify
# C:\Program Files\Amazon\AWSCLI\.\urllib3\connectionpool.py:857: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: # https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl
# -warnings
# C:\Program Files\Amazon\AWSCLI\.\dateutil\parser\_parser.py:1175: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
# 2018-07-31 16:55:08 hoge
# 2018-08-09 11:24:58 huga


まあwarning出るけど。。。

参考

https://github.com/aws/aws-cli/issues/3009

「プログラマのためのDocker教科書」を読んでPython環境を作った

読みました。

www.shoeisha.co.jp

業務でDockerの機運が高まっていたので読んだ。 前半の基本的なインフラ周りやdockerコマンド、Dockerfile等についてちゃんとまとまっていてよかった。 正直、ググれば集まるような情報ではあるけど、検索力が低いので断片的な情報しか見つからず、こういうのは時間はかかるけど書籍を読んだ方が良い。 後半はGKEの話が中心だけどさっぱりわからん。 これはこの本が悪いとかじゃなくて、規模が大きくなると具体的なイメージがわからないのでそもそも理解できない。 実際のサービスで稼働しているものを触るとかしないと自分はダメそう。

Python環境作ってみた

で、読んだついでにPython(anaconda), jupyter notebook環境を作ってみました。 lightgbmも入れてます。

# Dockerfile
FROM ubuntu:18.04

LABEL maintainer="ore"

RUN apt-get -y update \
 && apt-get -y upgrade \
 && apt-get install -y language-pack-ja-base language-pack-ja

#日本語環境設定
RUN update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja

#環境変数設定
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV LC_CTYPE ja_JP.UTF-8
ENV TZ JST-9

RUN apt-get update \
 && apt-get install -y vim \
 && apt-get install -y git \
 && apt-get install -y tmux \
 && apt-get install -y bzip2 \
 && apt-get install -y wget \
 && apt-get install -y htop \
 && apt-get install -y cmake \
 && apt-get install -y build-essential \
 && apt-get install -y gcc \
 && apt-get install -y g++

# Get anaconda installation script.
# RUN wget --quiet https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh -O ~/anaconda.sh
RUN wget https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh -O ~/anaconda.sh

# -b run install in batch mode (without manual intervention), it is expected the license terms are agreed upon.
# -p PREFIX install prefix, defaults to /root/anaconda3, must not contain spaces.
RUN /bin/bash ~/anaconda.sh -b -p /opt/conda
RUN rm ~/anaconda.sh
RUN ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh
RUN echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc
RUN echo "conda activate base" >> ~/.bashrc

#RUN /bin/bash -c "jupyter notebook --generate-config"
RUN mkdir -p -m 700 /root/.jupyter/
COPY jupyter_notebook_config.py /root/.jupyter/

RUN git clone --recursive https://github.com/Microsoft/LightGBM

RUN cd LightGBM/python-package \
 && export PATH="/opt/conda/bin:$PATH" \
 && python setup.py install

CMD [ "/bin/bash" ]


Dockerfileと同じ場所に下記のupyter_notebook_config.pyを置いておく。

# jupyter_notebook_config.py
c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 7777
c.NotebookApp.token = ''


下記ビルド等コマンド

# ビルド
docker build -t ml-env .
# 7777ポートでコンテナ起動
docker run -it -p 7777:7777 ml-env:latest bin/bash
# コンテナ内でnotebook起動
jupyter notebook --allow-root


本当はnotebookのパスワードとか設定しないといけないんですが、、、お察し、、、

参考

https://hub.docker.com/r/continuumio/anaconda3/

apache sparkの本を読んだ

2つ読みました。

これと

www.oreilly.co.jp

これ

www.shuwasystem.co.jp

周りに詳しい人がいないので、得意なこと苦手なこと、使い方の全体像、PythonJavaでの書き方が知りたくてざっとまとめて読みました。

「アプリケーションエンジニアの〜」の方は全体像の把握ができて、まあ普通によかったです。

オライリーの方は2015年出版ということもあって、DatasetAPIではなくRDD中心のコードなんだけどそれが逆にめちゃくちゃ役に立ってる。 特に諸事情で古めのJavaを使う必要があるので、ネット上で見つからない情報が載っていたりして助かる。 あとラムダ式すら使っていないので、最初の理解として読みやすかったりもする。 JavaDocを見る前にこっちを参照したりもしてる。

apache sparkでファイル名を指定して保存する

メモです!
stackoverflowまとめただけです!

以下バージョンです。

>> pyspark --version
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/spark/jars/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-2.7.3/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.3.1
      /_/
                        
Using Scala version 2.11.8, OpenJDK 64-Bit Server VM, 1.8.0_171

概要

例えば、こんな感じでデータセットを保存すると。。。

df.coalesce(1).write.json('./data/hoge/', mode='overwrite')


ディレクトリ名までしか指定できない。

$ tree
.
└── hoge
    ├── _SUCCESS
    └── part-00000-0f5a725e-c34d-4c59-9627-debe270aa558-c000.json


そもそもデータでかいんだから一つにまとめんなって話でディレクトリ単位がデータの区分になっていることを想定しているからっぽい。
それでもファイル名を指定したい!っていう時の対処法です。

PySpark

普通に保存してからHadoop APIを使ってリネーム&デリートしてあげる。

df.coalesce(1).write().json("./data/hoge", "overwrite");

from py4j.java_gateway import java_import
java_import(spark._jvm, "org.apache.hadoop.fs.Path");

fs = spark._jvm.org.apache.hadoop.fs.FileSystem.get(spark._jsc.hadoopConfiguration())
file = fs.globStatus(sc._jvm.Path('./data/hoge/part*'))[0].getPath().getName()
fs.rename(sc._jvm.Path('./data/hoge/' + file), sc._jvm.Path('./data/output/output.json'))
fs.delete(sc._jvm.Path('./data/hoge/'), True)

Java

PySparkと同じ。

import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

dataset.coalesce(1).write()
       .mode("overwrite")
       .format("json")
       .save("./data/hoge");

try {
    FileSystem fs = org.apache.hadoop.fs.FileSystem.get(spark.sparkContext().hadoopConfiguration());
    String oldFileName = fs.globStatus(new Path("./data/hoge"+ "/part-*"))[0].getPath().getName();

    fs.rename(new Path("./data/hoge", oldFileName), new Path("./data/output/output.json"));
    fs.delete(new Path("./data/hoge"), true);
} catch (IOException e) {
    e.printStackTrace();
}

Scala

PySparkとJavaと同じ。
Scala知らないのでこれ見てください。

stackoverflow.com

参考

stackoverflow.com

FileSystem (Apache Hadoop Main 2.7.3 API)