3. 准备输入的数据文件
前段时间看svm,也参考了libsvm,其中有个分类测试数据,内容如下:
-1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 -1 3:1 6:1 17:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 -1 5:1 6:1 17:1 21:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 -1 2:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 95:1 -1 3:1 6:1 18:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 -1 4:1 6:1 16:1 26:1 35:1 45:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 101:1 1 5:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 1 2:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1
当然实际不止这十行,还有很多,我就不都列出来了。刚好,可以统计这些项在整个文件中出现的次数。
将这个文件放到hdfs上去,首先建立一个input路径,用命令
bin/hadoop fs -mkdir ./input
检查是否创建成功,用命令
bin/hadoop fs -ls
为啥总是写“bin/hadoop”?可以cd到bin目录下,不过运行hadoop命令也需要写“./hadoop ......”,一样麻烦。接下来,将这个文件放到hdfs的./input目录中,用命令
bin/hadoop fs -put /Volumes/Data/Works/TryJava/hadoopWordCount/dataTry.txt ./input
第一个是本地路径,第二个是hadoop路径。
注意:每次重新开机,都要重新启动hadoop,用bin/start_all.sh脚本。否则hadoop不会自动启动,hadoop没有启动起来,fs命令根本运行不了。
4. 在hadoop上运行hadoopWordCount程序
运行如下命令
bin/hadoop jar /Volumes/Data/Works/TryJava/hadoopWordCount/bin/helloWordCount.jar hadoopWordCount.hadoopWordCount ./input/dataTry.txt ./output
第一个参数是jar包的本地路径;第二个参数其实由helloWordCount类的main函数决定(args[1]),是输入数据的路径,是hdfs路径;第三个参数是输出结果的路径。需要注意的是,输出结果的路径必须是不存在的。否则hadoop认为这已经有了结果,会拒绝执行任务。
一切顺利的话,从控制台上可以看到输出信息:
hello world for hadoop word count! 12/10/11 22:37:18 INFO input.FileInputFormat: Total input paths to process : 1 12/10/11 22:37:18 INFO mapred.JobClient: Running job: job_201210112225_0002 12/10/11 22:37:19 INFO mapred.JobClient: map 0% reduce 0% 12/10/11 22:37:31 INFO mapred.JobClient: map 100% reduce 0% 12/10/11 22:37:43 INFO mapred.JobClient: map 100% reduce 100% 12/10/11 22:37:45 INFO mapred.JobClient: Job complete: job_201210112225_0002 12/10/11 22:37:45 INFO mapred.JobClient: Counters: 17 12/10/11 22:37:45 INFO mapred.JobClient: Job Counters 12/10/11 22:37:45 INFO mapred.JobClient: Launched reduce tasks=1 12/10/11 22:37:45 INFO mapred.JobClient: Launched map tasks=1 12/10/11 22:37:45 INFO mapred.JobClient: Data-local map tasks=1 12/10/11 22:37:45 INFO mapred.JobClient: FileSystemCounters 12/10/11 22:37:45 INFO mapred.JobClient: FILE_BYTES_READ=9876916 12/10/11 22:37:45 INFO mapred.JobClient: HDFS_BYTES_READ=2207611 12/10/11 22:37:45 INFO mapred.JobClient: FILE_BYTES_WRITTEN=14815403 12/10/11 22:37:45 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=1164 12/10/11 22:37:45 INFO mapred.JobClient: Map-Reduce Framework 12/10/11 22:37:45 INFO mapred.JobClient: Reduce input groups=125 12/10/11 22:37:45 INFO mapred.JobClient: Combine output records=0 12/10/11 22:37:45 INFO mapred.JobClient: Map input records=30956 12/10/11 22:37:45 INFO mapred.JobClient: Reduce shuffle bytes=4938455 12/10/11 22:37:45 INFO mapred.JobClient: Reduce output records=125 12/10/11 22:37:45 INFO mapred.JobClient: Spilled Records=1380897 12/10/11 22:37:45 INFO mapred.JobClient: Map output bytes=4017851 12/10/11 22:37:45 INFO mapred.JobClient: Combine input records=0 12/10/11 22:37:45 INFO mapred.JobClient: Map output records=460299 12/10/11 22:37:45 INFO mapred.JobClient: Reduce input records=460299
信息的具体含义,可以查hadoop相关书籍。很多书都会做很详细的解释,我这里就不解释了。总之,运行成功!
5. 查看运行结果文件
在hdfs的“./output”目录下,有两个文件:_logs和part-r-00000(表示这是reduce任务的第0个输出)。用如下命令查看结果:
bin/hadoop fs -cat ./output/part-r-00000 | less
结果显示如下:
-1 23510 1 7446 100:1 53 101:1 79 102:1 64 103:1 613 104:1 36 105:1 23 106:1 28 107:1 67 108:1 17 109:1 26 10:1 1978 110:1 47 111:1 44 112:1 56 113:1 12 114:1 58 115:1 33 116:1 12 117:1 16 118:1 15 119:1 98 11:1 1222 120:1 19 121:1 31 122:1 20 123:1 1 12:1 14 13:1 6 14:1 6186 15:1 6189 16:1 6197 17:1 6177
呵呵,可以看到,“-1”出现的次数是23510,就这个文件来说,-1表示负类的样本数;相应的,正样本数是7446。接下来,特征“100:1”出现的次数是53,特征“101:1”是79......我就不具体解释了,做过机器学习算法的人都会知道上面表示什么意思。
总之,word count程序在我macbook pro的伪分布式上成功运行!将来,可以在进一步折腾了。