Hadoop学习笔记

来源:互联网 发布:淘宝网查看我的购物车 编辑:程序博客网 时间:2024/06/11 00:28

Hadoop版本:Hadoop-1.1.1,2012年12月1日发布。

Hadoop主要包含两个子项目:一个是MapReduce框架,用于提供MapReduce计算;另一个是分布式文件系统HDFS,为MapReduce计算提供分布式文件存储。MapReduce框架和HDFS是两个独立的子项目,MapReduce框架不是只能使用HDFS支撑MapReduce计算,而HDFS也可以在其他应用场合提供分布式文件存储服务。

1 HDFS

HDFS是Master/Slave结构的分布式系统,主要包含一个NameNode(Master)和至少一个DataNode(Slave)。通常在网络中的一台主机上运行一个NameNode或DataNode。

1.1 配置NameNode

a. 指定Java主目录。在$HADOOP_HOME/conf/hadoop-env.sh文件中指定Java主目录。
 export JAVA_HOME=/usr/local/jdk6。
b. 指定服务要绑定的IP和TCP端口。在$HADOOP_HOME/conf/core-site.xml文件中指定服务要绑定的IP和TCP端口。
 <configuration>
      <property>
          <name>fs.default.name</name>
          <value>hdfs://192.168.1.10:9000</value>
      </property>
 </configuration>
c. 指定本地存储目录。在$HADOOP_HOME/conf/hdfs-site.xml文件中指定NameNode存放数据的本地目录。
 <configuration>
      <property>
          <name>dfs.name.dir</name>
          <value>/data/hdfs/name</value>
      </property>
 </configuration>
d. 指定缺省副本数。在$HADOOP_HOME/conf/hdfs-site.xml文件中指定数据块的缺省副本数。缺省副本数不能大于后面启动的DataNode的数量。
 <configuration>
      <property>
          <name>dfs.replication</name>
          <value>2</value>
      </property>
 </configuration>
e. 指定DataNode。在$HADOOP_HOME/conf/slaves文件中添加计划运行DataNode的主机的名称或者IP,以便在NameNode启动后远程登录到相应的主机启动各个DataNode。
 192.168.1.20
 192.168.1.21
 192.168.1.22
f. 指定SecondaryNameNode。在一个HDFS集群中可按需启动一个SecondaryNameNode,用于备份NameNode的数据和执行检查点操作。在$HADOOP_HOME/conf/masters文件中添加计划运行SecondaryNameNode的主机的名称或者IP,以便在NameNode启动后远程登录到相应的主机启动SecondaryNameNode。若不需要SecondaryNameNode,则清空$HADOOP_HOME/conf/masters文件。
 192.168.1.11

1.2 配置DataNode

a. 指定Java主目录。在$HADOOP_HOME/conf/hadoop-env.sh文件中指定Java主目录。
 export JAVA_HOME=/usr/local/jdk6。
b. 指定NameNode的访问地址。在$HADOOP_HOME/conf/core-site.xml文件中指定NameNode的访问地址。
 <configuration>
      <property>
          <name>fs.default.name</name>
          <value>hdfs://192.168.1.10:9000</value>
      </property>
 </configuration>
c. 指定本地存储目录。在$HADOOP_HOME/conf/hdfs-site.xml文件中指定DataNode存放数据的本地目录。
 <configuration>
      <property>
          <name>dfs.data.dir</name>
          <value>/data/hdfs/data0</value>
      </property>
 </configuration>

1.3 配置SecondaryNameNode

参考DataNode的各个配置项进行。

1.4 启动HDFS

首先确保计划运行NameNode的主机能够SSH远程登录(证书方式)到计划运行DataNode和SecondaryNameNode的各台主机,且各台主机上的$HADOOP_HOME一致。
在计划运行NameNode的主机上,执行$HADOOP_HOME/bin/start-dfs.sh脚本启动HDFS(同目录下的stop-dfs.sh脚本用于停止HDFS)。缺省可以从 http://<NameNode的主机名称或IP>:50070 查看HDFS的运行状态。

1.5 使用HDFS Java API

通过 org.apache.hadoop.fs.FileSystem 类访问HDFS,对HDFS的所有操作都通过在该类的一个实例上调用相应的相应方法进行。通过静态方法 FileSystem.get( ... ) 获取FileSystem实例。该静态方法包含一个类型为 org.apache.hadoop.conf.Configuration 的参数,该参数包含了应用程序指定的一些配置项。为获取能够访问HDFS的FileSystem实例,需要在提供给 FileSystem.get( ... ) 方法的Configuration对象中至少指定NameNode的地址。

 // 开始 Configuration config = new Configuration(); config.set("fs.default.name", "hdfs://192.168.1.10:9000"); FileSystem fs = FileSystem.get(config); // // 使用fs操作HDFS上的目录和文件 // 新建:createNewFile、mkdirs // 删除:delete // 打开新文件写:create // 打开已有文件追加:append (当前版本的HDFS不支持) // 打开已有文件读:open // 读取目录下的子目录和文件列表:listStatus // 判断类型:isFile、isDirectory // fs.close(); // 结束
为正确运行程序,需要在Java程序的类路径中包含Hadoop的归档文件$HADOOP_HOME/hadoop-core-*.jar和 $HADOOP_HOME/lib目录中的几个第三方依赖包:commons-logging-*.jar、commons-lang-*.jar、commons-configuration-*.jar、log4j-*.jar。

2 MapReduce框架

MapReduce框架也是Master/Slave结构的分布式系统,主要包含一个JobTracker(Master)和至少一个TaskTracker(Slave)。通常在网络中的一台主机上运行一个JobTracker或TaskTracker。

2.1 配置JobTracker

a. 指定Java主目录。在$HADOOP_HOME/conf/hadoop-env.sh文件中指定Java主目录。
 export JAVA_HOME=/usr/local/jdk6。
b. 指定服务要绑定的IP和TCP端口。在$HADOOP_HOME/conf/mapred-site.xml文件中指定服务要绑定的IP和TCP端口。
 <configuration>
      <property>
          <name>mapred.job.tracker</name>
          <value>192.168.1.30:9001</value>
      </property>
 </configuration>
c. 指定缺省使用的分布式文件系统。在$HADOOP_HOME/conf/core-site.xml文件中指定缺省使用的分布式文件系统,可以为HDFS、S3等。
 <configuration>
      <property>
          <name>fs.default.name</name>
          <value>hdfs://192.168.1.10:9000</value>
      </property>
 </configuration>
d. 指定TaskTracker。在$HADOOP_HOME/conf/slaves文件中添加计划运行TaskTracker的主机的名称或者IP,以便在JobTracker启动后远程登录到相应的主机启动各个TaskTracker。
 192.168.1.40
 192.168.1.41
 192.168.1.42
 192.168.1.43

2.2 配置TaskTracker

a. 指定Java主目录。在$HADOOP_HOME/conf/hadoop-env.sh文件中指定Java主目录。
 export JAVA_HOME=/usr/local/jdk6。
b. 指定JobTracker的访问地址。在$HADOOP_HOME/conf/mapred-site.xml文件中指定JobTracker的访问地址。
 <configuration>
      <property>
          <name>mapred.job.tracker</name>
          <value>192.168.1.30:9001</value>
      </property>
 </configuration>
c. 指定本地存储目录。在$HADOOP_HOME/conf/mapred-site.xml文件中指定TaskTracker存放临时数据的本地目录。
 <configuration>
      <property>
          <name>mapred.local.dir</name>
          <value>/data/mapred/tasktracker0</value>
      </property>
 </configuration>

2.3 启动MapReduce框架

首先确保计划运行JobTracker的主机能够SSH远程登录(证书方式)到计划运行TaskTracker的各台主机,且各台主机上的$HADOOP_HOME一致。
在计划运行JobTracker的主机上,执行$HADOOP_HOME/bin/start-mapred.sh脚本启动MapReduce框架(同目录下的stop-mapred.sh脚本用于停止MapReduce框架)。缺省可以从 http://<JobTracker的主机名称或IP>:50030 查看MapReduce框架的运行状态。

2.4 向MapReduce框架提交Job

首先需要明确,Job是在MapReduce框架中执行的,而向MapReduce框架提交Job的程序是在客户端运行的。
第一步,构建Job的jar文件。这一步的主要工作是为Job编写几个MapReduce接口的实现类,根据具体需要可能包括以下几个接口的实现类。将各个实现类及其用到的各种辅助类的字节码文件打包生成jar文件,以备后面使用。
 org.apache.hadoop.mapred.Mapper 对应MapReduce计算中的Map过程
 org.apache.hadoop.mapred.Reducer 对应MapReduce计算中的Reduce过程
 org.apache.hadoop.mapred.InputFormat 用于自定义原始数据的获取方式
 org.apache.hadoop.mapred.OutputFormat 用于自定义计算结果的输出方式
第二步,编写提交Job的程序。提交Job的程序首先为Job配置各种参数,然后将Job的参数和上一步为Job生成的jar文件提交给MapReduce框架执行。org.apache.hadoop.mapred.JobConf 类的实例用于封装Job的各种参数。而 org.apache.hadoop.mapred.JobClient 类用于向MapReduce框架提交Job。

 // 开始 org.apache.hadoop.conf.Configuration config = new org.apache.hadoop.conf.Configuration(); config.set("mapred.job.tracker", "192.168.1.30:9001"); // 指定JobTracker的访问地址 config.set("fs.default.name", "hdfs://192.168.1.10:9000"); // 指定缺省使用的分布式文件系统 JobConf job = new JobConf(config); // job.setJobName("Job-0"); // 指定Job的名称 job.setJarByClass(<jar文件中任意一个类的名称>.class); // 间接指定Job的jar文件 job.setOutputKeyClass(<输出Key的类型的名称>.class); // 指定输出Key的类型 job.setOutputValueClass(<输出Value的类型的名称>.class); // 指定输出Value的类型 // 指定Map过程输出Key的类型 job.setMapOutputKeyClass(<Map过程输出Key的类型的名称>.class); // 指定Map过程输出Value的类型 job.setMapOutputValueClass(<Map过程输出Value的类型的名称>.class); job.setMapperClass(<Mapper实现类的名称>.class); // 指定Mapper job.setReducerClass(<Reducer实现类的名称>.class); // 指定Reducer job.setInputFormat(<InputFormat实现类的名称>.class); // 指定InputFormat job.setOutputFormat(<OutputFormat实现类的名称>.class); // 指定OutputFormat // JobClient.runJob(job); // 提交Job // 结束
为正确运行提交程序,需要在程序的类路径中包含Job的jar文件、Hadoop的归档文件$HADOOP_HOME/hadoop-core-*.jar和 $HADOOP_HOME/lib目录中的几个第三方依赖包:commons-logging-*.jar、commons-lang-*.jar、commons-configuration-*.jar、log4j-*.jar、jackson-core-asl-*.jar、jackson-mapper-asl-*.jar。

原创粉丝点击