wiki:rapid_develop

在以往的项目中,主要开发的工具是java,写具体的map,reduce,调试后,打包上传执行
除此以为简单的数据查询可以利用hive建EXTERNAL TABLE进行查询

其中最为方便的是使用python或者ruby等脚本语言编写mapper和reducer的文件

Hadoop Streaming原理

在上面的例子里,mapper和reducer都是可执行文件,它们从标准输入读入数据(一行一行读),并把计算结果发给标准输出。Streaming工具会创建一个Map/Reduce作业,并把它发送给合适的集群,同时监视这个作业的整个执行过程。

如果一个可执行文件被用于mapper,则在mapper初始化时,每一个mapper任务会把这个可执行文件作为一个单独的进程启动。 mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为mapper的输出。默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。如果没有tab,整行作为key值,value值为null。不过,这可以定制,在下文中将会讨论如何自定义key和value的切分方式。

如果一个可执行文件被用于reducer,每个reducer任务会把这个可执行文件作为一个单独的进程启动。 Reducer任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。同时,reducer收集可执行文件进程标准输出的内容,并把每一行内容转化成key/value对,作为reducer的输出。默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。在下文中将会讨论如何自定义key和value的切分方式。

命令形式与参数

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-1.0.3.jar
  
-input myInputDirs 【hdfs系统中输入文件/夹位置】  

-output myOutputDir  【这个目录需要不存在】  

-mapper mapper.rb 【可执行的文件或者命令】

-reducer reducer.rb   【可执行的文件或者命令】

-file 【需要分发的文件】

其他的参数

      -inputformat JavaClassName
      -outputformat JavaClassName
      -partitioner JavaClassName   【用户自定义的partitioner程序】
      -combiner JavaClassName      【用户自定义的combiner程序(必须用java实现)】

配置

-conf <configuration file>     specify an application configuration file
-D <property=value>            use value for given property

例子

word counter 例子 mapper.rb

#!/usr/bin/env ruby
wordcount = Hash.new
STDIN.each_line do |line|
line.split.each do |word|
wordcount[word] = wordcount[word].to_i+1
end
end
wordcount.each_pair do |word,count|
puts "#{word}\t#{count}"
end

reducer.rb

#!/usr/bin/env ruby
wordcount = Hash.new
STDIN.each_line do |line|
keyval = line.split("\t")
wordcount[keyval[0]] = wordcount[keyval[0]].to_i+keyval[1].to_i
end
wordcount.each_pair do |word,count|
puts "#{word}\t#{count}"
end

命令

hadoop jar /data/hadoop-1.0.3/contrib/streaming/hadoop-streaming-1.0.3.jar -input /dingxiang/work/liboutput/* -output /output -mapper mapper.rb -reducer reducer.rb -file ./mapper.rb  -file ./reducer.rb 

怎样比较快速的查询HBASE里面的数据?

  • 使用hbase shell?会一个个region进行查询,速度比较慢
  • 采用hive, 要建映射表,有些条件使用sql比较难实现
  • 采用streaming 方式,采用hbase作为输入  hadoop-hbase-streaming但网上这个包还不支持最新的版本,这种方式会读所有数据,也比较慢

最快的方式还是采用mapreduce java 程序来查,每个region一个map,同时运行的数量取决与hadoop设置


如果只是想做一些快速抽取文件字段的任务可以使用FieldSelectionMapReduce

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
    -D map.output.key.field.separa=. \
    -D mapred.text.key.partitioner.options=-k1,2 \
    -D mapred.data.field.separator=. \
    -D map.output.key.value.fields.spec=6,5,1-3:0- \
    -D reduce.output.key.value.fields.spec=0-2:5- \
    -D mapred.reduce.tasks=12 \
    -input myInputDirs \
    -output myOutputDir \
    -mapper org.apache.hadoop.mapred.lib.FieldSelectionMapReduce \
    -reducer org.apache.hadoop.mapred.lib.FieldSelectionMapReduce \
    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

使用Hive建表查数据,可以不需要编程,直接使用SQL查询所需要数据

CREATE EXTERNAL TABLE DM_USER(COOKIE STRING, SEX INT, AGE INT, PRICE_LEVEL INT, AREA INT,
PLAN INT, INTEREST1 INT,  INTEREST2 INT, INTEREST3 INT, INTEREST4 INT,  INTEREST5 INT)
PARTITIONED BY(DAY STRING)  ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
 LOCATION '/dingxiang/warehouse/user/';

ALTER TABLE DM_USER ADD PARTITION (DAY = '20120322') location '/dingxiang/warehouse/user/20120322';

使用hive见表时要注意输出的路径和压缩方式,如果输出的数据比较多,建议使用压缩,缺省的压缩方式在hadoop里面设置

set hive.exec.compress.output=true;

create table dm_label_opt_p as select distinct cookie, date_time, click 
from dm_ad_counter where day >= 20120913 and adid = 230072 and cookie <> "null" and click <> 0 and plan <> 4 and noise <> 1;


hadoop还有一个工具 pig,是一种数据流语言