きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

PySparkのadd_monthsでカラムを使う

EMRのバージョンの関係で今、PySpark 2.4.5を使っている。

Pythonという言語にはオーバーロードがないためなのか、Scalaでは用意されてるメソッドが呼び出せないなんてことが稀にある。

PySparkのadd_months(start, months)の
docstringの例で、startはColumnでmonthsは数値リテラルになっていて、monthsにColumnを渡すと、「TypeError: Column is not iterable」が発生してしまう。


解決策はexprを使うことが一番楽だった。
Is there an add_months with data driven number of months? - Databricks Community Forum

PySparkのコードを読む限りでは、
monthsをjavaカラムに変換してない。
Columnが来たら変換してくれればいいのに。
そのため、現状では絶対に数値リテラルしか無理だと言える。(litで包んでも意味がない)

Scala側は、add_months(Colum, int)の他に、
add_months(Column, Column)を持っている。

というわけで、PySpark→Py4Jのルートを一部迂回するのにexprを使うのが一番早い。


そもそもなんで「Column is not iterable」なんかになる理由は、深くは追えてないけど、だいたいこんな理由だろう。

py4jのpython側は、コマンドを作って、java側と通信する。コマンドを作る際、すでにJavaObjectになってるもの(javaカラムになっているもの)はコンバートしないが、そうではないものは複数あるコンバーターをループさせて変換をかける。コンバーターはコンバート可能かをチェックする関数があり、ListConverterは__iter__を持っていることをチェックしている。python側のColumnは__iter__を持っているので、ListConverterが適用されるのだが、いざ__iter__を呼び出してみるとTypeErrorが即座に返される。



私の使い方では、日付に対してたくさん計算するので、数値リテラルで実現するのは困難なので方法を調べていた。

日付
2020-01

みたいなデータに一旦arrayで加算したい月数を作る。リスト内包表記とlitを使って、arrayに渡す形。

日付 加算月
2020-01 [1,2,3,4,...]

ここからexplodeで行を増やす。

日付 加算月
2020-01 1
2020-01 2
2020-01 3
2020-01 4
2020-01 ...

で、これらを加算するのにadd_monthsを使う。

日本語を含むCloudFormtionテンプレート

Windows上でAWS CLI V2を使って
aws cloudformation create-stackする時に
日本語を含むテンプレートが読み込めずにエラーになると相談されたので、夜中まで調べた。

相談の際に引用されたURLはこれだった。
CloudFormationに日本語コメントを含めるとエラーになる場合の解決方法 | LaptrinhX

ちなみに例外の箇所はここだ。
aws-cli/paramfile.py at 96359d999dffc0357eaba4d150f2ffe4d2a68ce7 · aws/aws-cli · GitHub

こんなメッセージがでる。
Unable to load paramfile (%s), text contents could not be decoded. If this is a binary file, please use the fileb:// prefix instead of the file:// prefix.


それでは私の結論を言おう。
AWS CLI V2の新しめのやつなら出来るよ。

AWS_CLI_FILE_ENCODING環境変数を使う。

AWS CLI を設定する環境変数 - AWS Command Line Interface

[v2] Add support for AWS_CLI_FILE_ENCODING environment variable to cloudformation and eks customizations by vz10 · Pull Request #5304 · aws/aws-cli · GitHub

確かに、PyIntallerで作ってると、sysがfrozenになる(変更できない)とかで、PYTHONUTF8などは効かなくなるようだ。素のままのgithub上のコードであれば、bin/aws.cmdを書き換えれば、-X utf8を与えられるだろうが、PyInstallerで作られたものでは、この手のスクリプト類がなくなって出来ない。PyInstallerのspecでbin/awsを指定してる箇所があるので、もしかしたらLC_CTYPEは効くかなと試したがダメだった。

AWS_CLI_FILE_ENCODING環境変数が出来たのは、2.0.13かららしいが、CloudFormationで使えるようになったのは2.0.24かららしい。(2020年6月19日リリース)
Unable to load file:// with non-English char in UTF-8 encoding on Windows · Issue #5086 · aws/aws-cli · GitHub

まあ、日本語で登録できるけど、AWSコンソールで日本語が化けるところは多い。化けないところもある。AWSコンソールがUTF-8に対応できてないってだけ。

Building AWS Glue Data Catalog Client for Apache Hive Metastore

長い道のりを経て、なんとかCodeBuildで、Sparkを動かすためのなんちゃってEMR(without EMRFS)を用意したときの記録です。

GitHub - awslabs/aws-glue-data-catalog-client-for-apache-hive-metastore: The AWS Glue Data Catalog is a fully managed, Apache Hive Metastore compatible, metadata repository. Customers can use the Data Catalog as a central repository to store structural and operational metadata for their data. AWS Glue provides out-of-box integration with Amazon EMR that enables customers to use the AWS Glue Data Catalog as an external Hive Metastore. This is an open-source implementation of the Apache Hive Metastore client on Amazon EMR clusters that uses the AWS Glue Data Catalog as an external Hive Metastore. It serves as a reference implementation for building a Hive Metastore-compatible client that connects to the AWS Glue Data Catalog. It may be ported to other Hive Metastore-compatible platforms such as other Hadoop and Apache Spark distributions

最終的に、CodeBuildからpytestを動かす。
テストケースでpysparkが動いて、spark.sqlからGlueデータカタログに繋がって、ロケーション情報からS3のデータを拾ってデータフレームを得られるようになる。


初めの頃に目指した構成は断念

初めはSparkとHadoopを別々に用意するつもりだった。
without Hadoopには、Hadoopだけではなく、Hiveも入ってない。これが最後の方でクラスパス地獄になったので諦めた。


最終的にはSparkのディストリビューション用のシェルに頼った部分がある。

  • Spark with Hadoop
  • Glue Metastore client


こう見ると、簡単に思うかもしれないが、そんなことはない。
Hiveを2回ビルドして、Glue Clientをビルドして、Sparkもビルドする。
1回通すのに40分は覚悟しないといけない。
CodeBuildはレイヤーのキャッシュが効かないので、まじで辛い。
もしも同じことをやるなら、EC2にdocker入れて、ある程度動くDockerfileを作ってからCodeBuildに持っていった方が試行錯誤の時間を短縮できる。

javascalapythonを知っていて、mavenのpomやapache ivyを知っていて、gitも軽く使えて、dockerも知っていて、AWSのCodeBuildとECRとIAMの知識があれば同じことが出来る。

今回のビルドに使う主なバージョン

Spark 2.4.5
Hadoop 2.8.5
Scala(binary version) 2.11
Hive 2.3.5
Hive 1.2.1-spark2
使うEMRのバージョンに合わせて、Spark/Hadoopのバージョンを決めた形。

Hive 2.3系のビルド

Hiveのbranch-2.3でビルドする手順になっているが、Hiveの2.3.6で入った変更で、Glue Client側でコンパイルエラーが発生する。
そのため、2.3.5でビルドした。
Hiveにはパッチを当てる。
はっきり言って、欲しいのはSpark用のGlue Clientなので、Hive 2.3.5はビルドしたくない。しかし、Glue Clientの手順を通すのために、渋々とビルドしている。
hadoop.versionも変更。
junitが見つからないエラーがでたりするが、pomの変更で対応可能、HiveのJIRAにパッチがある。

Hive 1.2.1-spark2のビルド

手順では何も言及がないが、forkされたHiveを使う。
GitHub - JoshRosen/hive at release-1.2.1-spark2
SparkはforkしたHiveに本当に依存している。
これにもパッチを当てる。
gpgは-Dgpg.skip=trueで省略。
hadoop-23.versionも変更。

JDK差異の対応

Hiveのビルドで、java8でのコンパイルが失敗する場合、コンパイルオプションに-Dignore.symbol.fileを付けるようにsedを書いた。
sedは最長一致になるので書き方に気を付ける。

Glue Clientのビルド

手順ではHiveのバージョンを書き換えることになってるが、普通に-Dで渡せば良い。
そのとき、xmllintを使ったりする。
xmllintでpom.xmlのようにスキーマ情報のあるエレメントの抽出はググればでてくる。
後で収集するので、installまでしておく。

spark.hive.metastore.jars用のjarの収集

いまだにこれが正解とは言い切れない。
spark-project:hive-execのruntimeを収集し、Glue Client側からはSpark Clientのjar(shaded済)を収集して、1つのディレクトリに集める。
除外しないといけないJarもあって、SparkのHiveUtilsとIsolatedClientLoaderあたりを読まないと分からない。

maven-dependency-pluginに悩まされる

古いPOMが多く、当然プラグインもバージョンが古い。何がどうなってるか分からないので、githubプラグインのコード(Mojo)も読みながら対応していった。
バージョン2.1でrepositoryUrlの指定についてメッセージが出るようなら、新しいバージョンを使って、remoteRepositoriesを使うのが良い。

Sparkのビルド

dev/change-scala-version.sh
dev/make-distribution.sh
を使った。
自分が使わないRなどは除外。
最終的にPython3で色々準備したいので、
make-distribution.shもpython3を使うようにsedで置換。
setuptoolsは先に入れておかないといけない。

zincの問題

alpineでSparkのビルドをやっていたとき、zinc周りの問題が解消出来なかった。installされたはずのzincがいつの間にか消えてしまう、no such file or directoryな問題。
このせいでalpineを諦めた。

javac 137の対応

Sparkのビルドでjavacが137を返していた。
特にspark-sqlの箇所でよく発生。
Hiveではjava8の問題があったが、同じようなログはなく、これは関係していなくて、137に気付かない限り解決に至らない。
メモリが足りてないのでCodeBuildの設定で、7GBメモリに変更。

sparkのインストール

tgzを作ったので、好きなところに展開して、シンボリックリンクを貼ったりした。

$SPARK_HOME/spark-defaults.confの作成

spark.master
spark.submit.deployMode
spark.pyspark.python
spark.pyspark.driver.python
spark.sql.hive.metastore.version
spark.sql.hive.metastore.jars
spark.sql.catalogImplementation

spark.sql.hive.metastore.jarsには、一箇所に集めておいたjarに対して、lsコマンドとtrコマンド(改行コードをコロンに置換)でクラスパスを作成したものを与える。

$SPARK_HOME/hive-site.xmlの作成

hive.metastore.client.factory.class
aws.region
aws.glue.endpoint
regionとendpointは、EC2だったら設定しなくても動くはずだが、CodeBuildのようなコンテナ環境では設定しないと動かない。
今回は、docker build中に埋め込んだが、CodeBuildでAWS_REGION環境変数が使えるなら、そのタイミングで作成した方が良い。

hadoop-awsの追加

実際に動作確認をしていたら、
s3のファイルシステムが見つからない問題が発生。
sparkのdistributionには、hadoop-awsは含まれていないのだった。
mvn dependey:getでhadoop-awsaws-java-sdk-bundleを各々単品で入手して、$SPARK_HOME/jarsに配置。

aws-java-sdk-bundleには依存ライブラリも名前空間を変えて含まれているので楽。

$SPARK_HOME/core-site.xmlの作成

fs.s3.impl
fs.s3a.aws.credential.provider

Glueのデータカタログにはs3で登録してあるため、s3スキーマが来た時に、S3Aの実装が使われるように設定。

CodeBuildで動かす場合、
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI環境変数が渡ってくるので、今回はEC2ContainerCredentialsProviderWrapperを使ってみた。このクラスの話は、hadoop awsのページには載ってない。最新版のhadoopにはこのクラスを使用したコードがあるが、今回使う2.8.5にはそれは含まれていない。
このクラスを使うと、アクセスキーなどは設定ファイルに書かなくても動く。

pysparkのインストール

Sparkの資材の中にあるものを利用して、python3 setup.py installした。
これはjarsにあるものをコピーしたりするので、もろもろ整ったあとに実施する。

aws-cliはインストールしないこと

Glue Clientだったり、hadoop-awsだったりの認証プロバイダの探索順の関係で干渉したりするので、入れないこと。hadoop-awsの方は認証プロバイダを変更できる。Glue Clientの方も変更できないことはないが、aws sdkのものを直接指定できないので、DefaultAWSCredentialsProviderChainが使われると考えると、~/.aws/credentialsが読み込まれないようにインストールしない方が良い。

HiveSessionStateBuilderが見つからない

without hadoopでやってたときに発生。
Sparkのspark-hiveが足りてない。

HiveConfが見つからない

Hiveのhive-commonが足りてない。
これは、パッチが当たってないといけないため、簡単に入手できるSparkのディストリビューションはそのまま使えない。

Py4jの問題

without hadoopでやってたときに発生。
バージョンの異なるPy4jが混ざると発生。
GatewayServerBuilderが、GatewayServerの staticメソッドを呼ぶ箇所だったはず。
異なるpomでjarを集めるのはやはり無理が多い。

whichコマンドが必要

without hadoopでやってたときに発生。
かつalpineでやってた時。
hadoopのどこかのシェルでwhichコマンドがないと正しく動かないものがいた。

S3アクセス時に403エラー

クレデンシャルの設定がおかしいのか、
普通にIAMロールに権限が不足している。

VPC内で動かすとき

GlueとS3のVPCエンドポイントの設定を忘れずに行うこと。

spark_env.shはなくても良い

without hadoopのときは、SPARK_DIST_CLASSPATH環境変数を設定するものだが、with hadoopのときは不要。

Install Python36 on Amazon Linux2 based container

いまは2020年12月ですが、
なかなかどうして、上手くPython36を入れる方法というのがありません。
過去にうまく入れてる例は多いですが、それらの情報は古く、整理しないといけません。


最終的に、アーカイブされてるFedoraのEPELリポジトリから入れることにしました。

動機

EMRで使用するPythonバージョンが3.6と分かっているので、単体試験用の環境として、諸々インストールしたdockerイメージを準備したくCodeBuildでamazoncorretto:8をベースにDockerfileを作ってるところ。
今のCodeBuildの機能ではPython 3.7か3.8しか選べない。

古いFedoraのArchiveされたEPELから入れる

Index of /pub/archive/epel/7.2019-05-29/x86_64/Packages/p
Python 3.6.8がある。
自分でrepoファイルを作らないといけない。

yum install -y https://archives.fedoraproject.org/pub/archive/epel/7.2019-05-29/x86_64/Packages/e/epel-release-7-11.noarch.rpm
sed -i "s/metalink=/#metalink/g/" /etc/yum.repos.d/epel.repo
sed -i "#baseurl=http:\/\/download\.fedoraproject\.org\/pub\/epel\/7\//baseurl=https:\/\/archives\.fedoraproject\.org\/pub\/archive\/epel\/7\.2019-05-29\//g" /etc/yum.repos.d/epel.repo
yum clean all
yum install -y --enablerepo=epel python36

先にepel-releaseを入れる。
epel.repoファイルは出来るが、アーカイブにあったとしてもurlは本物。
metalinkを無効化して、baseurlでアーカイブに向ける。repomd.xmlの問題(更新時刻が古い)がでたりするのでcleanする。/var/yum/cacheを消すまではやらなくても動いた。
enablerepoは付けなくてもいけたかも??

amazon-linux-extrasの方法

この方法は、python3のトピックがdeprecatedになっており、使えなくなるはず。amazon-linux-extras listでpython3のトピックはもう表示されておらずpython3.8が見えてます。
隠れてるのを無理やり使ってます。

amazon-linux-extras enable python3
yum install -y python3-3.6

この方法ではPython 3.6.2が入りました。

amazon-linux-extras enable python3
yum install -y --disablerepo=amzn2-core python3

python3の指定でやるときは念のため、amzn2-coreの方にならないようにした方が良い。さもなくばpython 3.7とかが入ることになったりする。

どんなトピックがあるのか調べてみたときにdeprecatedだと気付いた。
http://amazonlinux.default.amazonaws.com/2/extras-catalog-x86_64.json

amazon-linux-extrasでEPELからはもう無理

amazon-linux-extras install epel -y
yum install -y --enablerepo=epel python36

この方法は、fedora 7のEPELを見るrepoが追加される。
しかし、fedoraのEPELにpython36はもういない。
Index of /pub/epel/7/x86_64/Packages/p
1739804 – Retired python36 breaks CentOS
簡単に言うと、Centos 7.7で、Python3.6はメインのリポジトリに移動して、EPELから消えた。2019年8月頃の話です。

IUS版から入れる方法

Amazon Linuxでは推奨しない。
IUS - FAQ

yum install -y https://centos7.iuscommunity.org/ius-release.rpm
yum install -y python36u

iusのrepoはinstall時に有効化されてるタイプ。

Fedora 32等からは入らない

yum install -y https://dl.fedoraproject.org/pub/fedora/linux/releases/32/Everything/x86_64/os/Packages/f/fedora-repos-32-1.noarch.rpm
yum install -y python36

Fedora 32にはPython 3.6.10がある。
Fedora 33にはPython 3.6.12がある。
インストール失敗。
Python36がEPELにいないので、fedora-reposを入れてみようとしましたが、
system-release(32)が必要と怒られた。
まあ、そうだわな。
うちらFedoraの7がベースだもの。
これは仕方ない。
rpmを直指定すれば入るかもしれないが依存関係とかの問題に当たりそうで諦める。

ソースからビルド

ここでは説明しない。
依存ライブラリのインストールなど大変だ。

AWS Glueのデータカタログでの日本語カラムの話

少しだけの実験をしている。

Hive互換な名前ってなんだ?

Hive互換な名前にするには、
英数小文字とアンダースコアのみらしい。

それはGlue側のマニュアルの話。

Hiveのマニュアルも調べておく。

LanguageManual DDL - Apache Hive - Apache Software Foundation

Hive 0.12では確かにそうだ。
Hive 0.13以降はもっと緩い。
カラム名ユニコードを使えるようになった、ただしバックチックで囲む必要がある。
文章的にはテーブル名に言及してないが、バックチックで使えるはずだ。
Hive 1.2.0以降ではドットとコロンが使えなくなった。

GlueのデータカタログがどのバージョンのHiveに相当するだろうか。
Glueの元になってるEMRとHiveのバージョン関係はリリースノートから読み取れる。
GlueとEMRの関係は恐らくSparkバージョンが同じになるだろう。
Glue1.0と2.0はSpark 2.4.3だから、EMR5.25.0のHive2.3.5と考えるのが自然。
そのため、一部制限はあるものの、漢字は十分に使えると考えられる。

EMR Spark Hive
6.0.0 2.4.5 3.1.2
5.30.0 2.4.4 2.3.6
5.29.0 2.4.4 2.3.6
5.28.1 2.4.4 2.3.6
5.28.0 2.4.4 2.3.6
5.27.0 2.4.4
5.26.0
5.25.0 2.4.3 2.3.5
5.24.1
5.24.0 2.4.2
5.23.0
5.22.0
5.21.0
5.20.0 2.4.0 2.3.4
5.19.0
5.18.0 2.3.2
5.17.1
5.17.0
5.16.0 2.3.1


Glue2.0において、Spark SQLを書いてみたとき、
漢字テーブル名と漢字カラム名は、バックチックで囲んで処理できた。
ドットとコロンはまだ試してない。

S3の漢字フォルダ内に、漢字ヘッダーを含めたcsvを配置して、クローラにテーブルを作らせたら、漢字が文字数分のアンダースコアになったテーブル名になった。漢字カラムは問題ない。

AWSコンソールからテーブルを作る場合、漢字のテーブル名は使える。そのため、クローラによる既存テーブル更新の動かし方は出来た。

Athenaから漢字テーブル名、漢字カラム名を使う場合は、ダブルクォートで囲めば動いた。

リモートワークでの低価格ダイエット方法

寄る年波には勝てぬ。

また太ってきたのでダイエットを開始したのは
例年のようにGWあたりでした。
現在も継続中。

今回は財布に優しいダイエットを目指す。
めちゃくちゃズボラで誰にでも出来る。

コロナの影響でリモートワークになり、昼夜決まった食事が取れるのはダイエットに追い風です。夕飯も決まった時間に食べれる。

体重の経過

GW頃 81kg
7月中旬時(ダイエット方法確定後) 78kg
9月下旬(本ブログ執筆時) 69kg
最近は週に1kg痩せる感じ。

今回のダイエットの特徴

  • 炭水化物中心
  • カロリー制限
  • 財布に優しい低価格志向
  • 海産物
  • 運動しない

主に利用したスーパー

利用する器具

  • 炊飯器
  • 電子レンジ
  • 耐熱容器
  • パスタ鍋
  • 測れるパスタ容器
  • レトルト絞りカッター
  • 丼や皿
  • ハサミ

ダイエットする目的は?

血液検査のALT(GPT)の項目がいつも異常値、要治療のレベル。
痩せたときは正常値になったことがある。
アルコールはもう飲んでないし、痩せれば下がるのでウイルス性ではなかろう。
非アルコール性脂肪肝(NAFL)か非アルコール性脂肪肝炎(NASH)だろうと個人的に解釈している。
体重を減らすのが主目的というのではなく、食習慣を見直すことで肝機能の数値を改善させると、同時に体重も減るよねって流れ。


食事は昼夜の2食派です。

カレーとパスタをメインに食べる

財布に優しくするには、米とパスタは欠かせません。
カレーはレトルトカレーを利用する。
1食100円くらいでレトルトカレーはある。
お米は好きなのを使えばいい。
米は1食で0.6〜0.7合くらいにする。
米1合のカロリーは534kcalのため、0.6〜0.7合は320〜373kcalあたりです。グラムでいうと100g前後になればいいです。

パスタは1食100gで約365kcal(これは購入した商品の栄養表示)
パスタソースも1食100円くらいのものがある。
だいたい決まった量を食べるのは経過観察も含めて意味がある。
量も決めてるので、緩めの糖質制限(1日糖質130g以下)に近い状態にある。

ビタミン類はサプリメントで補充

マルチミネラルマルチビタミンのやつを薬局で購入。
栄養を食材によって取ろうとすると、経済的ではなくなるので、マルチビタミンに頼る。

大塚製薬 ネイチャーメイド マルチビタミン&ミネラル 200粒

大塚製薬 ネイチャーメイド マルチビタミン&ミネラル 200粒

  • 発売日: 2007/04/23
  • メディア: ヘルスケア&ケア用品

小腹が空いたら煮干しを食べる

カレーとパスタ、マルチビタミンで足りてこなくなるのはタンパク質で、それを補給します。
煮干しは塩無添加のものを利用。

目安カロリー1400kcal

基本1200kcal+アルファ
カレーやパスタで昼夜2食を食べると、だいたい1200kcalになる。そこに煮干しなどを食べることで1400kcalくらいまでにする。
朝食を取るときはファミマでスムージー購入して追加で約200kcal。
活動時間1時間に対して100kcal程度取るなら問題ない。

カレーのこだわり

レトルトカレーのカロリーはだいたい100〜200kcalあたりです。
ご飯と合わせて600kcal以下になる。
これを食べなくちゃいけないというのはないです。自由に様々なカレーを愉しみます。
レトルトカレーの温め時間は600wで1分〜1分半と短く、昼休み向きです。

最安価格は、まいばすけっとで購入可能なTOPVALUベストプライス(PB)の「程よくスパイスをきかせた カレー 中辛」の54円(税抜)、200gです。
残念ながらコクはないですが、コスパ最強のレトルトカレーのひとつです。
程よくスパイスをきかせた カレー 中辛-イオンのプライベートブランド TOPVALU(トップバリュ) - イオンのプライベートブランド TOPVALU(トップバリュ)

まいばすけっとでは他にもレトルトカレーを扱っており、78円のものもあります。

まだダイエット始めたてのお腹の空く頃は、ローソンストア100で購入可能なバリューライン(PB)の「特盛カレー 大辛」、100円(税抜)の300gです。
特盛カレー大辛|ローソンストア100~生鮮・100円・くらし支えるストア~

ローソンストア100以外で買うなら、類似の300g系統で、Hachiの「メガ盛りカレー」約100円(税抜)の300gです。
価格的にはネット購入するより、近くのお店を探した方が良いです。キャンドゥやドンキあたりで売ってるはずです。

ローソンストア100は、けっこう100円のレトルトカレーが充実していて良いです。


もっと辛いのを求めるなら、まいばすけっとでLEE20倍が売ってることがあります。30倍は稀にファミマに置いてることがありました。

いままで食べたなかで旨いと思った掘り出し物のは、TOPVALUセレクトの「タスマニアビーフカレー 中辛」です。値段は258円。
神田カレーグランプリと同レベルか若干上回る程度に旨いです。
TOPVALUセレクトは、最上質のものを揃えているので、確かに旨いと感じた次第です。タスマニアビーフカレーはロングセラー商品らしい、知らなかったなぁ。

パウチのカッター

キャンドゥで購入した「レトルト絞り&カッター」です。

Amazonだと高いですね。
レトルト絞りは噛み合わせがあまり良くないですが、カッターは重宝します。パウチのまま温めが必要なときだけレトルト絞りの部分を使ってました。
基本は、パウチをカッターで切って耐熱容器に移してレンチンです。
パウチの切り口を手で切って微妙に残ると、再度切ろうとしてカレーの飛び跳ねに繋がるので、この手のカッターやハサミを使う方が安全。

測れるパスタ容器

東急ハンズで購入しましたが、ロフトの方が安かったです。ロフトなら619円。
イノマタ化学の「なるほどパスタ」です。

https://loft.omni7.jp/detail/4905596121107
簡単に100g相当が測れるので重宝します。
目分量というか手分量で測ってしまい、やけに量が少ない日ができてしまうのを防げます。

パスタのこだわり

とにかく安いので良いと選んだ結果、
ローソンストア100で購入可能なMARRE(マルレ)の「スパゲッティ 1.9mm 500g」の100円(税抜)です。
難点はゆで時間が11分と長い点です。
昼休みには11分は長いので昼パスタはやめて夜パスタに変更しました。
トルコ産のデュラム・セモリナ(デュラム小麦の粗挽き)。
100gあたり365kcalあります。
500gで100円はかなり安いです、これに勝てるのは業務スーパーくらいです。
1.9mmは太めです、普通のスパゲッティは1.6mmのものが多く流通してるはずです。
太いので食べ応えがある。
残念なのは、この商品は、ローソンストア100以外で見たことがない点かな。

元々はトルコ産加工食品の輸入をしていた株式会社バハールが自社ブランドMARREを立ち上げたのち、改名して株式会社マルレになってるようです。
パスタの輸入は、イタリア産の次に多いのがトルコ産らしいです。
3月パスタ供給量16%増に 国内生産量は9カ月続伸、輸入も26%増に(食品新聞) - Yahoo!ニュース

パスタソースのこだわり

最終的にメインにしたのは、まいばすけっとで売られているS&Bの「まぜるだけのスパゲッティソース 生風味からし明太子」

まぜるだけのスパゲッティソース 生風味からし明太子|まぜるだけのスパゲッティソース|S&B エスビー食品株式会社

初めの頃は、ローソンストア100で売られてるもので、2人前のものでした。1人前を探し求めた結果、S&Bのものに落ち着きました。

トマトソース系を使ってた頃もありますが、洗い物が面倒になるので辞めました。

パスタに追加する素材

西友で購入可能な「みなさまのお墨付き 焼きのり」です。
みなさまのお墨付き 焼のり|楽天西友ネットスーパー
パスタソースに元から海苔は付いてますが、海苔は食物繊維が多く、他にも効果があるので大目にします。
他にも、これまた西友で購入可能な「みなさまのお墨付き 徳用 かつおパック」です。
みなさまのお墨付き 徳用 かつおパック|楽天西友ネットスーパー
かつお入れたらどんなもんでも旨くなる。
かつおを入れると少しパサパサになるので、パスタの湯切りは軽めにした方が良い。

煮干しのこだわり

西友で購入可能な「みなさまのお墨付き 国産にぼし 塩無添加 150g」にしました。
西友 - みなさまのお墨付き - 国産にぼし 塩無添加 150g | SEIYU
無添加にしましょう。
3〜5日で1袋を食べる調子。
煮干し100gあたり70gがたんぱく質です。
小腹が空いたり、口元が寂しくなったら、ボリボリ食べましょう。
世の中には「出汁ダイエット」なんてのもありますが、面倒臭いので、煮干しボリボリ食べます。
サラダチキンの方が低カロリーですが、煮干しは汁気がないし、食べたい量を簡単に調整可能です。
そして、カルシウムに加えて、EPADHAが豊富なのも良い点です。EPADHAには、血液をサラサラにして、中性脂肪コレステロールを下げる効果があると言われてます。
魚って、肉に比べて高いし、なかなか手が出ないんだけど、煮干しなら躊躇なくいける。
他にもDHAには抗ガン作用があると、認知症の予防に良いとか言われてて、魚をもっと食べれば日本救われるんじゃないかと思うくらい魚は大事。

その他の食品

乳酸飲料を少々。

ガゼリが良いという評価ではなく、乳酸飲料で手頃な量が欲しかっただけです。
紙パックのピルクルは容器のサイズ的に1日で全部飲むのは勧められないもので、カロリーオーバーになる。

黒酢飲料を少々。

ミツカンの「ちょっと黒酢 りんご味」は、表記上カロリーは0になってます。100g中に5kcal以下なので。本当は3kcalあります。
スッキリした味が好きというだけで、
黒酢のダイエット効果を期待してるわけではありません。
夕食後、しばらくして飲んでます。

運動しない

ジョギング、ランニングの類は今はしてません。
しかし、タバコを外で吸う習慣のせいで、近所の灰皿まで歩くことにより、日に5キロは歩いてます。
運動してるのではなく、タバコ吸いに行ってるだけなのでノーカウントです。
膝を痛めない程度には痩せたのでジョギングしてもいいけれど、このような低カロリー戦略のときは、ただ筋肉が溶けるだけなので、運動するならば、そのためのカロリーを摂取して、消費カロリーとトントンになるようにするでしょう。

Glueをローカルで動かすための考察

まだ未解決なのでアイデアを考え中。

実現できると分かってること

glueContext.create_dynamic_frame.from_optionsを使うケース
AWS Glueをローカル環境で実行してみた | Developers.IO
あと、こちらも。
AWS Glueの単体テスト環境の構築手順 | フューチャー技術ブログ

s3だけならば、localstack以外にもminioを使う選択肢はあるかもしれない。

やりたいが方法が見つかってないこと

glueContext.create_dynamic_frame.from_catalogを使うケース

なぜできてないか

localstackにはGlueのAPIはない。
Support AWS Glue · Issue #1446 · localstack/localstack · GitHub
型や場所に関する情報がデータカタログにあるが、それがないので何もしないと失敗するだろう。

考察1

sparkのenableHiveSupportを有効にする。
根拠はこれ。
Spark SQL ジョブの AWS Glue データカタログ サポート - AWS Glue
この根拠どおりなら、sparkがHiveを意識するように構成すれば良いことになる。

考察2

sparkがHiveを意識するとき、javax.jdo関連のプロパティを構成するようにする。spark-warehouseはまだ咀嚼できてない。
Hive Metastore · The Internals of Spark SQL
あとこれも。
Apache Hive メタストアを Amazon EMR に移行してデプロイする | Amazon Web Services ブログ
AWSの例の場合のうち、RDSを使う状態になれば良いと思っている。ローカルでやるにはMySQLpostgresqlを用意すれば良いだろう。

考察3

分けてもいいけど、Hadoop+Hive+MySQLを入れたコンテナを用意する。
S3用のlocalstackのコンテナを用意する。
Spark用のコンテナを用意する。
HiveもSparkもjdoの設定で、MySQLを見るように構成する。
Hiveのcreate databaseとcreate tableでMySQLに、Glueのカタログテーブルに相当するものを作成する。

考察4

HiveのテーブルとGlueのテーブル。
LanguageManual DDL - Apache Hive - Apache Software Foundation
CREATE TABLE - Amazon Athena
だいたいcreate tableの構文は同じはず。

考察5

やばそうなのは、カタログのアップデートをどうするかだな。enableUpdateCatalogは厳しい。単体試験なら困らないかな?いや、困るな。試験データのパーティションを作って消してを繰り返す必要がある。単体試験以降もローカルでやりたいときは、複数のSpark Jobを先行後続で動かしたときに、Hive Metastoreが更新されてないだろう。

考察6

リモートのmetastoreだから、thriftもいるかも。Hiveのhive.metastore.urisにthriftのホストとポートが必要そう。Spark側からはいらないかも。


道のりは遠いな。。。