複数行のCSVファイルを処理したいので、そのためにカスタムCSVInputFormatを作成しました。
各HadoopノードでCSV行を処理するスレッドを約40個にしたいです。ただし、5台のマシン(1つのマスターと4つのコア)を使用してAmazon EMRでクラスターを作成すると、使用可能なマップスロットが6つある場合でも、実行されているマップタスクは2つだけであることがわかります。
inputFormatにgetSplitsを実装したので、NLineInputFormatのように動作します。これで、より多くのものが並行して実行されることを期待していましたが、効果はありませんでした。また、引数を設定してみ-s,mapred.tasktracker.map.tasks.maximum=10 --args -jobconf,mapred.map.tasks=10
ましたが、効果がありませんでした。
ラインを並行して処理するにはどうすればよいですか?Hadoopの実行方法は、スケーラブルではありません。クラスターに割り当てるインスタンスの数に関係なく、最大で2つのマップタスクのみが実行されます。
更新:非圧縮ファイル(zip)を起点として使用すると、より多くのマップタスクが作成され、130万行で約17になります。それでも、なぜそれ以上にすべきではないのか、データが圧縮されたときになぜより多くのマッパーが作成されないのか疑問に思います。