SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

最新イベントはこちら!

Data Tech 2024

2024年11月21日(木)オンライン開催

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けの講座「EnterpriseZine Academy」や、すべてのITパーソンに向けた「新エバンジェリスト養成講座」などの講座を企画しています。EnterpriseZine編集部ならではの切り口・企画・講師セレクトで、明日を担うIT人材の育成をミッションに展開しております。

お申し込み受付中!

EnterpriseZine(エンタープライズジン)

EnterpriseZine編集部が最旬ITトピックの深層に迫る。ここでしか読めない、エンタープライズITの最新トピックをお届けします。

『EnterpriseZine Press』

2024年秋号(EnterpriseZine Press 2024 Autumn)特集「生成AI時代に考える“真のDX人材育成”──『スキル策定』『実践』2つの観点で紐解く」

HadoopでTwitterを分析してみた

みなさん、元気にMapReduceしてますか?

003

前回はツイートに含まれる単語をカウントしたものの、その出力結果はどの単語がたくさん使われているのかがそのままではよくわからないものでした。今回は出現数が多い単語が一目でわかるようにMapReduceでキーを降順ソートする手順を紹介し、さらに追加の情報を加えて分析を続けます。

 みなさん、元気にMapReduceしてますか?HadoopのMapReduceをJavaで書くのはとっつきづらい、アドホックな処理に向かない、といった欠点があるため、それを克服するためのプロダクトがいろいろとあります。HiveやPigはMapReduceを楽にコーディングするための工夫ですね。最近ではClouderaからImpalaというプロダクトが出てきました。これはHiveの文法(HiveQL)が使え、かつMapReduceをせずに高速にクエリを実行できるという優れものです。新しいプロダクトが出てくるとわくわくしますね!でも本連載では今回もMapReduceをゴリゴリ書いていきます。よろしく!

 

 なお、今回は扱うソースコードが多いため、弊社Webサイトからソースコードをまとめてダウンロードできるようにしています。興味がある方は、弊社Webサイトの右上にある検索窓で「HadoopでTwitterを分析してみた」と検索してみてください!

ソートはどこで行っているの?

 前回作成した処理をおさらいしてみましょう。Mapフェーズでツイートは単語ごとに分解され、単語をkey、そのツイート内での出現回数をvalueとしたkey-valueペアでShuffleフェーズへと送られます。Shuffleフェーズでは各Map処理(Mapper)から送られてきたkey-valueのデータをkeyごとにまとめ、Reduceフェーズに送ります。この際、Reduce処理(Reducer)が複数あれば、各処理のデータ量が偏らないように分散してデータを送ります。Reduceフェーズではkey単位で送られてきたvalueのコレクションをすべて足し上げてkeyと共に出力します。

図1: 前回のおさらい。Mapperで出力されたkey-valueがShuffleでまとめられてReducerに送られる。
図1: 前回のおさらい。Mapperで出力されたkey-valueがShuffleでまとめられてReducerに送られる。

 このように、MapReduceではShuffleフェーズの際にデータがkey単位でまとめられます。これを行うためにshuffleフェーズでは自動的にkeyによるソートが行われます。よって、この自動ソートをうまく利用すればきれいにソートされた出力結果が得られそうです。

 しかし、今回行おうとしている「単語出現数の降順でのソート」を実現するためには大きな問題が3つあります。

  •  問題1: ソートはkeyに対してのみ実施される。
  •  問題2: ソート順はkeyに使用しているシリアライズ(オブジェクトをバイト列に変換)するためのクラスで定義されている。
  •  問題3: Reducerが複数ある場合、デフォルトではkeyのハッシュ値に基づいて各処理にデータが分散される。

 問題1から順に説明しましょう。ShuffleフェーズはMapフェーズの後に動作します。そのため、Mapperから出力されるkey項目でしかソートができません。今回は単語の出現数でソートしたいのですが、これはMapフェーズ終了時では未確定であり、しかもvalue項目に入っています。つまり、ソートするためには前回出力した結果をもう一度MapReduce処理にかける必要があるのです。前回作成した処理のReduceフェーズで最終出力を「key:出現数」、「value:単語」としたのはこのためです。

 問題2は、ソート順を変更するにはクラスに手を入れなければならないことを意味しています。SQLのORDER BY句のような手軽さはありません。そのため、Hadoopの解説書ではPigやHiveなどのプロダクトを使用してソートすることを勧めていたりします。

 問題3は、複数のReducerからの出力をそのままつなげても全体としてはソートされないことを意味しています。図2を見ていただくとわかる通り、処理されるkeyはReducerへハッシュ値を使って(言い換えればランダムに)割り振られていくため、各Reducer内ではソートされているものの、それぞれのReducerから出力されたファイル同士をつなげてもソートされた状態にはなりません。なお、動かすReducerを1つだけにすれば全体でソートされたファイルが1つ出来上がります。ただし、これではせっかく並列処理をさせるためにHadoopを使っているのに、魅力が半減してしまいますね。

 それでは、どのような処理を追加・変更すればよいのでしょうか。具体的に見ていきましょう。

図2: Shuffleフェーズでデータがソートされる仕組み
図2: Shuffleフェーズでデータがソートされる仕組み

次のページ
降順ソートのためのクラスを作ろう!

この記事は参考になりましたか?

  • Facebook
  • X
  • Pocket
  • note
HadoopでTwitterを分析してみた連載記事一覧

もっと読む

この記事の著者

平間大輔(ヒラマダイスケ)

株式会社インサイトテクノロジー 
ビッグデータ・ソリューション開発部 外資系ITアウトソーシング会社を経て2011年にインサイトテクノロジー入社。
Oracle大好き、SQLのコーディング大好き人間だったが、気づけばSSD, InfiniBand, Hadoopといった旬のハー...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

EnterpriseZine(エンタープライズジン)
https://enterprisezine.jp/article/detail/4440 2013/01/09 00:00

Job Board

AD

おすすめ

アクセスランキング

アクセスランキング

イベント

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング