AWS関連の技術とか触った時のこと
以下の記事の続きっぽいのです。
たぶん内容はかぶってないはず・・・。
■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