hadoop初体验--字数统计

作者:liuguobing   阅读 (4022)  |  收藏 (0)  |  点赞 (0)

摘要

这篇文章是一个日志,不算是什么教程。


原文链接:hadoop初体验--字数统计

虽然没打算搞大数据和分布式计算,但hadoop这种东西还是要懂得。

花了一段时间对hadoop做了些理论研究,直到今天下午才真正的做实践。

实践的东西很简单,统计文件中每个字出现的次数,在单机模式下进行。项目采用的sbt+scala,sbt添加liberary,然后编译打包,然后hadoop jar 输出路径/项目.jar files/ output/,然后果不其然报错了,有个类没找到,然后我就意料到是scala没添加到hadoop的classpath中,于是修改hadoop-env.sh文件,添加该jar进去,然后编译打包运行成功。

代码如下:  

object WordCount {

  def main(args: Array[String]): Unit = {
    val conf = new Configuration()
    val job = Job.getInstance(conf,"word count")
    job.setJarByClass(this.getClass)
    job.setMapperClass(classOf[TokenizerMapper])
    job.setCombinerClass(classOf[IntSumReducer])
    job.setReducerClass(classOf[IntSumReducer])
    job.setOutputKeyClass(classOf[Text])
    job.setOutputValueClass(classOf[IntWritable])
    FileInputFormat.addInputPath(job,new Path(args(0)))
    FileOutputFormat.setOutputPath(job,new Path(args(1)))
    val status = if (job.waitForCompletion(true)) 0 else 1
    System.exit(status)

  }

}

class IntSumReducer extends Reducer[Text,IntWritable,Text,IntWritable]{

  private val result = new IntWritable()

  override def reduce(key: Text, values: Iterable[IntWritable], context: Reducer[Text, IntWritable, Text, IntWritable]#Context): Unit = {
    var sum = 0
    val it = values.iterator()
    while (it.hasNext){
      sum = sum + it.next().get()
    }
    result.set(sum)
    context.write(key,result)
  }

}

class TokenizerMapper extends Mapper[Object, Text, Text, IntWritable]{

  val word = new Text()

  override def map(key: Object, value: Text, context: Mapper[Object, Text, Text, IntWritable]#Context): Unit = {
    val itr = value.toString
    itr.foreach(c => {
      word.set(s"$c")
      context.write(word,TokenizerMapper.one)
    })

  }

}

object TokenizerMapper {
  private val one = new IntWritable(1)
}

这个代码是hadoop官方的map reduce给的例子改成scala的,官方的map那里用了StringTokenizer,这个是将字符串分隔,因为我统计的是中文的文章的文字出现的次数,所以直接将字符串变成字符数组进行统计。

写了两个文件进行测试,文件内容是《愿得一人心》和《多远都要在一起》这两首歌,统计结果如下:

        2
一      21
下      3
不      24
世      3
个      10
为      4
乐      2
习      2
书      2
了      4
人      18
从      1
以      2
们      1
会      3
伴      2
何      2
你      36
依      2
光      2
克      2
关      2
再      2
分      6
到      8
刻      4
前      1
勇      4
包      2
单      6
印      1
却      7
去      6
变      2
只      8
后      3
听      5
呢      1
和      1
唇      1
唱      5
嘲      3
回      5
在      15
地      1
声      3
多      7
大      3
天      2
失      7
夹      2
如      3
存      2
孤      3
守      2
对      3
小      5
少      2
就      3
层      2
巨      3
己      11
已      2
希      1
年      2
度      1
开      6
式      2
形      2
彩      1
往      2
很      1
得      6
心      6
忆      3
忘      3
快      1
念      3
思      1
悉      1
情      4
惯      2
想      18
愿      6
憾      3
成      2
我      32
才      2
护      2
换      2
掉      1
收      1
放      2
方      3
旁      1
旅      3
旧      2
时      1
春      2
是      5
晰      3
更      1
曾      5
最      4
有      1
服      2
望      4
未      3
本      2
来      5
果      3
标      2
桌      2
歌      6
段      2
每      5
气      5
永      1
没      3
洋      2
海      2
消      2
深      6
清      3
漂      2
灯      2
炽      1
热      1
熟      1
爱      15
用      1
界      3
留      1
白      6
的      48
直      5
盼      2
看      3
真      4
眼      2
着      3
睛      1
离      16
程      2
稻      2
笑      3
简      3
算      2
约      1
纪      2
经      4
给      2
翔      1
而      1
背      2
能      14
自      11
至      2
色      1
草      2
落      3
藏      3
虹      1
行      2
要      9
见      2
角      2
认      2
让      3
记      1
许      2
话      6
语      7
说      2
请      3
象      3
起      2
距      4
身      1
过      16
还      2
这      9
进      1
远      9
遗      3
遥      2
那      6
都      3
里      8
错      1
阳      1
陪      2
随      1
隐      2
集      1
需      3
青      2
音      1
颜      1
飞      1
首      9
骗      6


分类   默认分组
字数   3479

博客标签    hadoop  

评论