hatunina’s blog

メモと日記です

AWS S3でData not foundと表示され削除できない時の対処

現象

バケットを削除したはずなのに、バケット配下のフォルダのみ削除されバケットは残っている状態。。。 また、Data not foundと表示されコンソール上で何も操作できない。。。

対処

削除が反映されるまで時間がかかるのでちょっと待ちましょうとのこと。

参考

https://forums.aws.amazon.com/thread.jspa?threadID=262821

「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

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)

apache sparkでInvalid maximum heap sizeって言われた時の対処

結論から言うとJDKが32bitのせいなので64bitをインストール&環境変数の設定をしましょう。

結論にたどり着くまでに色々ハマったので以下メモ(微妙な情報が混ぜってるかも)

sparkの処理中にjava.io.IOException: ディスクに十分な空き領域がありません。というエラーが出たので--driver-memoryを指定するとこんな感じのエラーが発生

>>> spark-submit --driver-memory 4g my_app.py
Invalid maximum heap size: -Xmx4g
The specified size exceeds the maximum representable size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.


ググってみるとJDKが32bitだとヒープ領域として1.5Gしか確保できないので64bitを入れろとのこと。
確認のためjava --version

>>> java --version
java 10.0.1 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)


ちゃんと64bitになっている。。。
てきとーにHelloWorldを作ってヒープ領域の設定が効くか確認

>>> java -Xms4G -Xmx4G HelloWorld
HelloWorld


動くやんけ。。。
でも、環境変数にはJava1.8を設定しているので、そもそもjava --verisonでJava10が表示されることがおかしいと気づく。
複数のバージョンのJDKがインストールされていて環境変数がごっちゃになっているのかも?

ググるとこんな記事が。 web.plus-idea.net
上記の通りにjava.exe周辺のリネームと余分な環境変数が設定されていたのでそれを削除
そしてもう一度確認

>>> java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) Client VM (build 25.171-b11, mixed mode)

>>> java -Xms4G -Xmx4G HelloWorld
Invalid initial heap size: -Xms4G
The specified size exceeds the maximum representable size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.


すると、使用されるJavaは1.8になったけどヒープ領域の指定はできず。
というよりインストーラーを見るとまんまと32bitをインストールしていた。

1.8の64bitを再度インストールし各コマンド実行

>>> java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

>>> java -Xms4G -Xmx4G HelloWorld
Hello World!

>>> spark-submit --driver-memory 4g my_app.py


動いた!

よくわからん状況だけどまとめると
JDKたくさんインストールして環境変数も複数設定されていた
・$JAVA_HOMEはJava10, 64bitを見ていたのでjavaコマンドでのヒープ領域指定はうまくいくが、spark-submitではうまくいかない
spark-submitではJava1.8, 32bitを見ていた?
JDK, 環境変数を整理してJava1.8, 64bitを設定することで解決