全国の「DWHというかちょっと大きめくらいじゃね?」くらいのデータを扱っている皆さんこんにちわ。

ついこの間、10万件くらいのデータに対して処理したのでメモ。

データの受け渡しから取り込みといった処理をしていると、どうしても送信側よりも受信側のほうが負荷が高まりがちです。

糞データデータの不備が多いため、開発時に取り込みエラーが発生した場合何が原因かといったことを調べる必要があるのです。そしてこれが超絶めんどくさい。
今回ボクは送信側なんですが、受信側からの報告の内容が要領を得ない情報が足りなかった為、どうしても自分で調べる必要があります。 

ただ、同じ環境を…ってのはいろいろな制約から難しいので、 今までの症例+現在の状況から原因をチェックする処理を作りました。10万件なんて目grepできるかぼけー。
#!/bin/sh

while read record
do
wc=`echo ${record} | nkf -e | sed -r "s#\|#\|\n#g" | wc -l`
i=`expr $i + 1`
echo ${i}
if [ "${wc}" != "${2}" ] ; then
     echo "${i}:${wc} ${record}" | nkf -e
fi
done < ${1}
パイプをデリミタとして使用しており、今までも文字化けが発生 -> デリミタが文字化けに引っ張られるといったパターンが多い為、それをチェックするプログラムです。

  1. ファイルを1行を読み込み、sedでデリミタを改行 -> 行数をチェック
  2. 行数が指定した値であれば行数を表示(何もないと動いてるんだか動いてないんだかわからない)
  3. (nkf しているのは環境の問題)

文字化けが発生した場合、↑のsed部分で処理止まってしまう為、発生した行数をチェックする、といった感じですね…因みにエラーチェックもタイマー(止まった時間をみてアラート投げるとか)も入れてません。言わせんな恥ずかしい。
 ./check.sh ./send.txt 205
みたいな感じで投げるんですが…遅い…遅すぎてカップラーメン作りはじめてから食べ終わってもまだやってるくらい遅い… どうにかならんもんかな…って思ってたら、どうやらこの環境コア結構あるやんってことに気づき、parallel使うことにする。

ただこの環境入ってなかったので、どっかからかっぱらってくる。parallelのいいところはそれだけあれば動く(厳密にはperlないとダメだけど)ので、ポータブルな感じがすごく良い。
元のファイルをsplitで分割して
[test@server est]$ split -l 10000 send.txt
[test@server est]$ ll x*
-rw-r--r-- 1 test users 12319086 10月 17 21:05 xaa
-rw-r--r-- 1 test users 13261756 10月 17 21:05 xab
-rw-r--r-- 1 test users 13585014 10月 17 21:05 xac
-rw-r--r-- 1 test users 13464577 10月 17 21:05 xad
-rw-r--r-- 1 test users 12913624 10月 17 21:05 xae
-rw-r--r-- 1 test users  9309327 10月 17 21:05 xaf
-rw-r--r-- 1 test users  5276854 10月 17 21:05 xag
-rw-r--r-- 1 test users  5997380 10月 17 21:05 xah
-rw-r--r-- 1 test users  7518248 10月 17 21:05 xai
-rw-r--r-- 1 test users 13378782 10月 17 21:05 xaj
-rw-r--r-- 1 test users 13151969 10月 17 21:05 xak
-rw-r--r-- 1 test users 11310048 10月 17 21:05 xal
[test@server est]$ ../parallel  -j 8 './check.sh {1} 205 > ./{1}.log' ::: `ls x*`
で終了した。

まとめるとparallel超便利に尽きるんだけど
  • 対象のファイルをコマンドで渡せる(やってみたらできた。そらそうか…)
  • ジョブ数気をつけよう(調子こくと逆に遅くなる)
  • splitのコマンドとパラメータは大事。とはいえ-lと -Cくらい覚えておけばいい気もするけど。

Add Comments

名前
 
  絵文字
 
 
プロフィール

john_doe_

Twitter
instagram(SnapWidget)
タグクラウド
  • ライブドアブログ