参考来源:http://hadoop.apache.org/docs/r1.0.4/cn/index.html

Hadoop安装

  • 单机模式
  • 伪分布式模式
  • 完全分布式模式

Hadoop集群搭建

通常,集群里的一台机器被指定为 NameNode,另一台不同的机器被指定为JobTracker。这些机器是masters。余下的机器即作为DataNode也作为TaskTracker。这些机器是slaves。

Hadoop 命令

archive
用法:hadoop archive -archiveName NAME *
创建一个hadoop档案文件

distcp
用法:hadoop distcp
递归地拷贝文件或目录

fs
用法:hadoop fs [GENERIC_OPTIONS] [COMMAND_OPTIONS]
运行一个常规的文件系统客户端。

fsck
用法:hadoop fsck [GENERIC_OPTIONS] [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]
运行HDFS文件系统检查工具

jar
用法:hadoop jar [mainClass] args...
运行jar文件。用户可以把他们的Map Reduce代码捆绑到jar文件中,使用这个命令执行。

job
用法:hadoop job [GENERIC_OPTIONS] [-submit ] | [-status ] | [-counter ] | [-kill ] | [-events ] | [-list [all]] | [-kill-task ] | [-fail-task ]
用于和Map Reduce作业交互和命令

pipes
用法:hadoop pipes [-conf ] [-jobconf <key=value>, <key=value>, ...] [-input ] [-output ] [-jar ] [-inputformat ] [-map ] [-partitioner ] [-reduce ] [-writer ] [-program ] [-reduces ]
运行pipes作业

version
用法:hadoop version
打印版本信息

CLASSNAME
用法:hadoop CLASSNAME
运行名字为CLASSNAME的类

管理命令
balancer
用法:hadoop balancer [-threshold ]
运行集群平衡工具

daemonlog
用法:hadoop daemonlog -getlevel host:port
用法:hadoop daemonlog -setlevel host:port
获取或设置每个守护进程的日志级别

datanode
用法:hadoop datanode [-rollback]
运行一个HDFS的datanode

dfsadmin
用法:hadoop dfsadmin [GENERIC_OPTIONS] [-report] [-safemode enter | leave | get | wait] [-refreshNodes] [-finalizeUpgrade] [-upgradeProgress status | details | force] [-metasave filename] [-setQuota ...] [-clrQuota ...] [-help [cmd]]
运行一个HDFS的dfsadmin客户端

jobtracker
用法:hadoop jobtracker
运行MapReduce job Tracker节点

namenode
用法:hadoop namenode [-format] | [-upgrade] | [-rollback] | [-finalize] | [-importCheckpoint]
运行namenode

secondarynamenode
用法:hadoop secondarynamenode [-checkpoint [force]] | [-geteditsize]
运行HDFS的secondary namenode

tasktracker
用法:hadoop tasktracker
运行MapReduce的task Tracker节点

Hadoop HDFS操作

启动HDFS

$ hadoop namenode -format 
$ start-dfs.sh

文件列表

$ $HADOOP_HOME/bin/hadoop fs -ls <args>

将数据插入到HDFS

$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/input 
$ $HADOOP_HOME/bin/hadoop fs -put /home/file.txt /user/input 
$ $HADOOP_HOME/bin/hadoop fs -ls /user/input

从HDFS中检索数据

$ $HADOOP_HOME/bin/hadoop fs -cat /user/output/outfile 
$ $HADOOP_HOME/bin/hadoop fs -get /user/output/ /home/hadoop_tp/

关闭HDFS

$ stop-dfs.sh

MapReduce

  • 通常MapReduce范例是基于向发送计算机数据的位置!
  • MapReduce计划分三个阶段执行,即映射阶段,shuffle阶段,并减少阶段。
  • 映射阶段:映射或映射器的工作是处理输入数据。一般输入数据是在文件或目录的形式,并且被存储在Hadoop的文件系统(HDFS)。输入文件被传递到由线映射器功能线路。映射器处理该数据,并创建数据的若干小块。
  • 减少阶段:这个阶段是:Shuffle阶段和Reduce阶段的组合。减速器的工作是处理该来自映射器中的数据。处理之后,它产生一组新的输出,这将被存储在HDFS。
  • 在一个MapReduce工作,Hadoop的发送Map和Reduce任务到集群的相应服务器。
  • 框架管理数据传递例如发出任务的所有节点之间的集群周围的详细信息,验证任务完成,和复制数据。
  • 大部分的计算发生在与在本地磁盘上,可以减少网络通信量数据的节点。
  • 给定的任务完成后,将群集收集并减少了数据,以形成一个合适的结果,并且将其发送回Hadoop服务器。

示例程序

package hadoop; 

import java.util.*; 

import java.io.IOException; 
import java.io.IOException; 

import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.conf.*; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapred.*; 
import org.apache.hadoop.util.*; 

public class ProcessUnits 
{ 
  //Mapper class 
  public static class E_EMapper extends MapReduceBase implements 
  Mapper<LongWritable ,/*Input key Type */ 
  Text,                /*Input value Type*/ 
  Text,                /*Output key Type*/ 
  IntWritable>        /*Output value Type*/ 
  { 
      
      //Map function 
      public void map(LongWritable key, Text value, 
      OutputCollector<Text, IntWritable> output,  
      Reporter reporter) throws IOException 
      { 
        String line = value.toString(); 
        String lasttoken = null; 
        StringTokenizer s = new StringTokenizer(line,"\t"); 
        String year = s.nextToken(); 
        
        while(s.hasMoreTokens())
            {
              lasttoken=s.nextToken();
            } 
            
        int avgprice = Integer.parseInt(lasttoken); 
        output.collect(new Text(year), new IntWritable(avgprice)); 
      } 
  } 
  
  
  //Reducer class 
  public static class E_EReduce extends MapReduceBase implements 
  Reducer< Text, IntWritable, Text, IntWritable > 
  {  
  
      //Reduce function 
      public void reduce( Text key, Iterator <IntWritable> values, 
        OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException 
        { 
            int maxavg=30; 
            int val=Integer.MIN_VALUE; 
            
            while (values.hasNext()) 
            { 
              if((val=values.next().get())>maxavg) 
              { 
                  output.collect(key, new IntWritable(val)); 
              } 
            } 

        } 
  }  
  
  
  //Main function 
  public static void main(String args[])throws Exception 
  { 
      JobConf conf = new JobConf(Eleunits.class); 
      
      conf.setJobName("max_eletricityunits"); 
      conf.setOutputKeyClass(Text.class);
      conf.setOutputValueClass(IntWritable.class); 
      conf.setMapperClass(E_EMapper.class); 
      conf.setCombinerClass(E_EReduce.class); 
      conf.setReducerClass(E_EReduce.class); 
      conf.setInputFormat(TextInputFormat.class); 
      conf.setOutputFormat(TextOutputFormat.class); 
      
      FileInputFormat.setInputPaths(conf, new Path(args[0])); 
      FileOutputFormat.setOutputPath(conf, new Path(args[1])); 
      
      JobClient.runJob(conf); 
  } 
}

编译和执行进程单位程序

$ mkdir units 
$ javac -classpath hadoop-core-1.2.1.jar -d units ProcessUnits.java 
$ jar -cvf units.jar -C units/ . 
$HADOOP_HOME/bin/hadoop fs -mkdir input_dir 
$HADOOP_HOME/bin/hadoop fs -put /home/hadoop/sample.txt input_dir 
$HADOOP_HOME/bin/hadoop fs -ls input_dir/ 
$HADOOP_HOME/bin/hadoop jar units.jar hadoop.ProcessUnits input_dir output_dir 
$HADOOP_HOME/bin/hadoop fs -ls output_dir/ 
$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000 
$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000/bin/hadoop dfs get output_dir /home/hadoop