なにかのきろく

ひっそりと戻ってきて自分のためになるべく頑張る・・・

AWS関連の技術とか触った時のこと

 以下の記事の続きっぽいのです。

seyoshinori.hateblo.jp

たぶん内容はかぶってないはず・・・。

 

■Reducerが2以上の時のOrderBy使用方法
 HiveQLでOrderByすると、Reducerを1にしないと正しく
 指定のカラムでSort出来ない。
 パーティションごとにSortされるから、
 SQLと同じOrderBy結果にはならない。
 DataStagePXのパラレル処理と同じ。

 HiveQLの対応策としては
 FROM hoge
 DISTRIBUTE BY hoge1 SORT BY hoge2;
 これで、hoge1のOrderByやってくれる。

 さぁ、Reducerを36に設定して、
 処理スピードを上げるんだ・・・。加速するんだ!


HDFSのセーフモードが発動した。
 それはトランザム界王拳とは違って、
 HiveへのInsert文の実行が不可能になる。
 (おそらく変更コマンドを受け付けなくなる)

 具体的なメッセージはこんなのです。
 FAILED: RuntimeException Cannot make directory: hdfs://<IPアドレス>:<ポート>/tmp/hive-hadoop/<ログファイル名>

 私の時は、hive -fでSelectした結果をファイルに
 出力していたのですが、途中でディスク容量が無くなって
 エラーになって終了・・・。
 その直後にセーフモード発動ですww

 セーフモード解除コマンド。
 dfsadmin -safemode leave


■s3からRedshiftへCopyコマンドでエラーが発生
 エラーメッセージは以下の通り。
 msg:ERROR: Load into table '<テーブル名>' failed. Check 'stl_load_errors' system table for details.

 というわけで、
 素直な気持ちでstl_load_errorsをSelectしてみる。

 select query, ::実行IDみたいな
 substring(filename,22,25) as filename,
 line_number as line,
 substring(colname,0,12) as column, エラーになったレコード列
 type,
 position as pos,
 substring(raw_line,0,30) as line_text, ::エラーになった列データ
 substring(raw_field_value,0,15) as field_text, :: エラーデータ
 substring(err_reason,0,45) as reason ::エラーメッセージ
 from stl_load_errors
 order by query desc
 limit 10;

 これでエラー原因が特定できる。


■HiveでCSVファイル形式のテーブル定義
 ものスゴック大きなデータはCSVで成型する。
 EMRには大容量が搭載できるためです。

 drop table if exists <テーブル名>;
 create table <テーブル名> (
 <カラム> string
 )
 row format delimited
 fields terminated by ','
 lines terminated by '\n';


■Hiveを動かす前に設定するパラメータ

 set hive.auto.convert.join=false;
 ↑これがtrueだとOutOfMemoryが出る。
  Joinのデータ量次第だけど。

 set hive.exec.dynamic.partition=true;
 set hive.optimize.sort.dynamic.partition=false;
 set hive.exec.dynamic.partition.mode=nonstrict;
 set hive.exec.max.dynamic.partitions=1000000;
 set hive.exec.max.dynamic.partitions.pernode=200000;
 set mapreduce.job.maps=36;
 set mapreduce.job.reduces=36;


■HiveQLはSQLではない・・・
 サブクエリは投げられないので、
 外部結合で実装する。

 

 

End