分类目录归档:hadoop

调试eclipse下hadoop的map reduce程序

原创文档,转载请将原文url地址

前面介绍了hadoop的本地安装, vnc控制hadoop服务器的开发调试, hadoop的eclipse插件安装及运行等。 本文我们重点介绍如何在eclipse集成环境下如何debug调试hadoop程序, 充分利用debug工具的调试, 断点, 变量查看等等。

一.调试hadoop要解决的问题:

在上一篇文章中, 我们已经可以采用插件的方法, 来运行hadoop项目, 但是我们没办法用debug方式来运行您的hadoop项目。

那么我们可以运行这个项目吗?

我们当然可以采用运行普通java项目的办法来运行这个java项目, 但是map reduce程序没办法正常的工作。

我们如何解决这个问题?要解决这个问题如何进行?首先要解决这个问题,需要了解hadoop的基本工作过程,特别是hadoop的工作过程中的classpath相关设置问题了。

关于hadoop的classpath问题, 请参考前面的一些体会,如下地址供您研究:

Hadoop源代码分析 之hadoop配置及启动(4)—–启动过程汇总

Hadoop源代码分析 之hadoop配置及启动(3)—–classpath与hadoop主要组件启动过程

Hadoop源代码分析 之hadoop配置及启动(2)—–classpath与启动shell脚本

Hadoop源代码分析 之hadoop配置及启动(1)—–classpath与配置文件

通过上面这些研究我们可以了解hadoop启动的关键时,如何配制hadoop运行的classpath的,通过这个classpath的脚本能找到配置文件, 然后根据配置文件能联系到各个服务组件, 然后在根据组件连接各个服务器然后决定如何进行下一步的工作。

有了以上,我们就可以断定, 我们的普通的java项目可以通过适当调整classpath设置然后能够运行hadoop的map reduce程序。 在普通java项目中可以应用 方便的各种调试工具来进行应用程序的调试、开发等。

下面我们将根据这个线索来逐步构建一个java的项目, 然后添加hadoop的配置文件等到项目中, 然后调试程序。

二.配置并测试一个hadoop的本地系统

如下图, 在hadoop安装的上级目录,拷贝一个hadoop的本地系统,如下图

wps_clip_image-6225

cp -r hadoop-1.2.1 hadoop-local

进入新拷贝的hadoop目录中, 执行下面的命令,

[sch@db conf]$ pwd             // 显示当前目录, 输入命令时,不要包括注释部分

/work/apps/hadoop-local/conf      // 当前目录是本地hadoop的配置文件目录

[sch@db conf]$ ls               // 查看当前目录下的文件情况

capacity-scheduler.xml      mapred-queue-acls.xml

configuration.xsl           mapred-site.xml

core-site.xml               masters

fair-scheduler.xml          slaves

hadoop-env.sh               ssl-client.xml.example

hadoop-metrics2.properties  ssl-server.xml.example

hadoop-policy.xml           taskcontroller.cfg

hdfs-site.xml               task-log4j.properties

log4j.properties

[sch@db conf]$ cat core-site.xml       // 查看 core-site.xml的配置情况, 可以用vi编辑到这个状况

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>                      // 请特别注意, 配置中是完全空的,

</configuration>                     // 全空表示 本地默认配置, 包括采用本地文件系统

[sch@db conf]$ cat hdfs-site.xml        // 下面请看同上

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

</configuration>

[sch@db conf]$ cat mapred-site.xml

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

</configuration>

截图如下:

wps_clip_image-6228

完成上述配置后,我们就完成了本地的hadoop的配置工作

三.准备测试hadoop项目的测试数据

如下图, 我们在刚刚安装好的 hadoop目录中,创建input目录, 并且把conf目录下的相关文件拷贝过去

wps_clip_image-12850

命令如下:

[sch@db hadoop-local]$ mkdir input

[sch@db hadoop-local]$ cp conf/* input/

[sch@db hadoop-local]$ ls input/

四.在eclipse中创建一个普通的java项目

1. Java项目的创建

Eclispe中如何创建一个普通的java项目就省略, 读者应该都会了, 项目创建完成如下结构。

wps_clip_image-25463

2. Hadoop源代码的引入

Hadoop源代码的引入可以采用拷贝源代码到src中

也可以采用import命令,导入eclipse中,

采用哪个方法都行,总之最后结果如下

wps_clip_image-19199

如上, 我们引进引入了全部hadoop的例子源代码, 但发现有大量的编译错误,下面解决编译错误的情况。

3. 导入hadoop的包,解决java项目的编译错误问题

在java的编译属性上, 选择lib相关标签, 然后选择添加外部jar文件的按钮

wps_clip_image-31375

然后在弹出的对话框中, 选择下面系统目录, 然后选择里面的两个jar文件

wps_clip_image-28890

然后点击ok按钮

添加hadoop的lib目录中的文件到项目中, 如下图

wps_clip_image-6328

添加完成, 可能还有些错误, 也可能没有。情况如下:

wps_clip_image-29646

这里面设置的java版本是1.4的版本, 我们需要将这个版本提高, 否则会有很多错误

wps_clip_image-20907

如上, 设置java版本到达1.6, 然后选择确定按钮。

编译错误都没有了。

五.添加hadoop的配置到eclipse的java项目中

前面已经叙述了, 这个hadoop的配置文件目录作为classpath添加到java项目的重要性, 下面我们来操作,然后可以进行项目调试了。

wps_clip_image-29988

如上图, 我们选择了 添加外部的目录作为classpath进行了,然后还需要调整一下相关顺序,如下图:

wps_clip_image-29753

请特别注意上图中, 不同颜色的区域, 是配置好这个情况的关键

配置完成后, 选择ok按钮, 完成相关配置

六.Debug 创建hadoop项目

如下图, 从源代码文件中选择下图中的类, 然后在主函数中设置断点

wps_clip_image-6253

然后选择右键,设置断点, 如下图, 选择debug as 菜单, 选择debug配置

wps_clip_image-28070

有可能程序还没有创建调试项目, 我们选择创建java的项目

wps_clip_image-30189

在弹出的对话框中, 选择arg参数tab页面, 输入如下的调试参数, 注意这里面的文件路径是绝对路径

/work/apps/hadoop-local/input /work/apps/hadoop-local/output ‘dfs[a-z.]+’

wps_clip_image-7410

然后点击应用, 然后点击调试按钮。

wps_clip_image-8518

如上图,已经进入了相关项目的运行了, 进入了debug模式, 现在可以利用debug的各种功能了。

为了更进一步证明这个调试模式的作用, 在下面图中, 断点处选择 蓝色区域, 选择f3键, 寻找相关源代码

wps_clip_image-15695

按照如下图中,号码顺序,先选择添加 源代码按钮, 在弹出对话框中,选择2中按钮, 然后在对话框中选择相应文件目录中相关代码

wps_clip_image-28310

然后在编辑器中设置如下图中的断点, 然后运行程序, 最后停止到相关断点上, 然后查看图中不同区域的查看相关调试信息。

wps_clip_image-2384

 

参考文章
Hadoop源代码分析 之Datanode工作原理(5)—–拷贝文件过程总结

Hadoop源代码分析 之Datanode工作原理(4)—–拷贝本地文件到hadoop的过程

Hadoop源代码分析 之Datanode工作原理(3)—–datanode工作过程总结

hadoop源代码介绍

Hadoop源代码分析 之Datanode工作原理(2)—–datanode基本工作过程

Hadoop源代码分析 之Datanode工作原理(1)—–datanode启动过程代码分析

Hadoop源代码分析 之hadoop配置及启动(4)—–启动过程汇总

Hadoop源代码分析 之hadoop配置及启动(3)—–classpath与hadoop主要组件启动过程

Hadoop源代码分析 之hadoop配置及启动(2)—–classpath与启动shell脚本

Hadoop源代码分析 之hadoop配置及启动(1)—–classpath与配置文件

Hadoop源代码分析 之hadoop源代码项目(1)—–创建eclipse下java项目

Hadoop源代码分析 之环境配置(2)—–虚拟机ip配置

Hadoop源代码分析 之环境配置(1)—–hadoop虚拟机配置

Hadoop源代码分析 之概念介绍(2)—–初学者眼中的hadoop

Hadoop源代码分析 之概念介绍(1)—–服装加工,火车货物检查与hadoop

调试eclipse下hadoop的map reduce程序

用Hadoop eclipse插件开发程序

原创文档,转载请将原文url地址

采用Hadoop的eclipse插件开发调试程序

Hadoop为采用eclipse开发程序,提供了插件, 本篇文档我们从下载eclipse及hadoop插件开始, 创建开发环境, 然后调试伪分布模式下的hadoop程序

一. Eclipse下载地址如下:

下面地址可以下载到各种eclipse的比较旧的版本

http://wiki.eclipse.org/Older_Versions_Of_Eclipse

Hadoop插件对特定eclipse的版本支持的版本比较好, 不是每个版本都能非常好的运行, 因此选择好的版本是重要的。 在版本不匹配时,可以自己编译eclipse插件, 插件源代码已经随同hadoop一同分发了。

wps_clip_image-9907

我们下载eclipse 3.5.2版本, 下载linux的32位版本, 读者根据您服务器环境选择合适的版本

wps_clip_image-30819

根据我们centos版本下载特定的linux的32位版本

二.下载hadoop的eclipse插件

下载地址如下:

https://code.google.com/p/hadoop-eclipse-plugin/downloads/list

wps_clip_image-26589

我们下载 0.20.3的版本

三.安装hadoop的eclipse插件

拷贝hadoop的eclipse插件到 /work/apps/eclipse/dropins目录中, 拷贝完成后情况如下:

wps_clip_image-14405

启动eclipse程序, 启动后, 选择window 菜单, 选择hadoop map/reduce菜单

wps_clip_image-17718

出现上面,说明我们安装插件基本完成。

然后选择, browse按钮, 然后选择如下目录(配置hadoop环境)

wps_clip_image-21457

四.用hadoop eclipse插件创建项目

创建一个 hadoop的 Map/Reduce Project项目, 如下图

wps_clip_image-14309

项目创建完成如下结构

wps_clip_image-2923

拷贝hadoop的样例源代码到 创建的项目中。

wps_clip_image-17224

拷贝后结构如下:

wps_clip_image-12117

五.测试hadoop 项目

1. 拷贝hadoop的conf目录及里面文件到 hadoop文件系统中

bin/hadoop fs -put conf input

注意:在执行前面的 命令前, 您需要配置成功hadoop的伪分布模式, 并且已经启动了hadoop的程序

2. 配置hadoop项目的启动参数,如下图, 在项目名称上点击右键, 选择run的配置菜单, 然后选择arg菜单, 添加下面的参数

“input ouput ‘dfs[a-z.]+”

wps_clip_image-28524

3. 在项目的名称上右键,选择以hadoop项目方式运行, 如下图

wps_clip_image-9437

在弹出的对话框中,选择Grep 类作为本次启动的状态

wps_clip_image-23576

在下面弹出的对话框中,选择定义一个hadoop的定义, 然后注意配置下面参数

Dfs master,参数输入9000

Map/reduce master 选择:host:localhost

Port:9001

然后选择运行

wps_clip_image-17841

运行过程中,显示下面的运行信息。

wps_clip_image-22840

小结: 本次我们完成了eclipse及hadoop插件的配置, 然后用插件开发了项目, 运行了项目, 没有完成的事调试这个项目, 对项目设置断点,调试程序, 下次我们解决这个问题。

Hadoop1.2.1 Pseudo-Distributed伪分布模式配置

原创文档,转载请将原文url地址标明

hadoop的伪分布式模式是hadoop的一个重要的模式, 在这个模式下, hadoop在本地服务器,启动多个jvm进程来模拟分布式情况,同时可以方便程序员调试相关程序。 本文我们一起来学习相关的配置

一. hadoop的Pseudo-Distributed伪分布模式

Pseudo-Distributed Operation 伪分布操作

Hadoop can also be run on a single-node in a pseudo-distributed mode where each Hadoop daemon runs in a separate Java process.

先进入您的相关hadoop的目录, 然后依次配置下面的文件

如下图是笔者的目录及文件形式

wps_clip_image-19784

Configuration

Use the following:
conf/core-site.xml:  配置下面文件

<configuration>

<property>

<name>fs.default.name</name>

<value>hdfs://localhost:9000</value>

</property>

</configuration>

conf/hdfs-site.xml:

<configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

</configuration>

conf/mapred-site.xml:

<configuration>

<property>

<name>mapred.job.tracker</name>

<value>localhost:9001</value>

</property>

</configuration>

二. 配置ssh免密码登陆

下面是 hadoop的原始配置方法

Now check that you can ssh to the localhost without a passphrase:
$ ssh localhost

If you cannot ssh to localhost without a passphrase, execute the following commands:
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

按照上面配置, 在root下工作正常实现了免密码登陆, 但是在普通账号下, 则不好用, 如下图:

wps_clip_image-20684

解决办法, 删除相关文件重新配置

rm -rf .ssh/

删除后结果如下:

wps_clip_image-31419

确保没有 .ssh目录

然后输入

ssh    sch@db

输入下面命令,

ssh-keygen -t rsa

当询问Enter file in which to save the key (/home/sch/.ssh/id_rsa): 时直接回车, 选择默认,

询问输入密码时也选择回车,使用默认

wps_clip_image-27047

执行下面的命令,   特别是 修改 文件权限的两句好像, 是关键!!

[sch@db ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

[sch@db ~]$ chmod 700 ~/.ssh

[sch@db ~]$ chmod 600 ~/.ssh/authorized_keys

[sch@db ~]$ ll -a .ssh/

total 28

drwx------  2 sch sch 4096 Oct  1 06:09 .

drwx------ 20 sch sch 4096 Oct  1 06:00 ..

-rw-------  1 sch sch  776 Oct  1 06:16 authorized_keys

-rw-------  1 sch sch 1675 Oct  1 06:08 id_rsa

-rw-r--r--  1 sch sch  388 Oct  1 06:08 id_rsa.pub

-rw-r--r--  1 sch sch  384 Oct  1 06:00 known_hosts

如下图

wps_clip_image-30759

输入ssh sch@db

wps_clip_image-5774

看到已经免密码登陆了。

拷贝当前目录下配置到,其他服务器, 保证连接其他服务器也是免密码登陆的。

scp -r .ssh/ sch@red:/home/sch

scp -r .ssh/ sch@mongdb:/home/sch

scp -r .ssh/ sch@nginx:/home/sch

并测试相关登陆情况, 经过测试, 能正常免密码登陆。

三. 配置hadoop伪分布模式程序

首先您需要进入您的hadoop的安装目录,如下

cd  /work/apps/hadoop-1.2.1

然后依次执行下面的命令

Execution

Format a new distributed-filesystem:
$ bin/hadoop namenode -format   // 格式化 hadoop本地系统

wps_clip_image-2710

Start the hadoop daemons:
$ bin/start-all.sh         // 启动hadoop本地程序

结果如下:

wps_clip_image-31223

发现如下信息:localhost: Error: JAVA_HOME is not set.

修改

Hadoop的 conf下的hadoop-env.sh文件, 修改如下设置, 参考下图:

wps_clip_image-24021

保存退出

重新启动hadoop程序,如下

bin/start-all.sh

wps_clip_image-7911

(由于前面我们启动过一次了, 但是失败了,不过可能个别组件还是运行了, 因此有可能您需要运行一下 bin/stop-all.sh命令, 关闭全部hadoop程序)

四. 测试hadoop伪分布模式

The hadoop daemon log output is written to the ${HADOOP_LOG_DIR} directory (defaults to ${HADOOP_HOME}/logs). 日志名称, 及目录

Browse the web interface for the NameNode and the JobTracker; by default they are available at:

· NameNode- http://localhost:50070/

我们输入:http://192.168.186.10:50070/dfshealth.jsp    我们用服务器ip地址替代了localhost,原因我们安装的hadoop在远程的虚拟机上, 我们才windows8下运行的,因此采用了ip地址替代。

wps_clip_image-19866

· JobTracker- http://localhost:50030/

类似我们输入:http://192.168.186.10:50030/jobtracker.jsp

wps_clip_image-1017

输入下面命令, 将一个目录下文件复制到, input目录中

Copy the input files into the distributed filesystem:
$ bin/hadoop fs -put conf input

wps_clip_image-4326

注意, 要确保您的目录中不纯在input目录, 否则会有一些错误信息提示。

我查看一下,我们都拷贝了那些程序

wps_clip_image-13232

如上图上, 蓝色区域显示。

默认输入的目录 input是相对目录, 相对于当前用户, 若是输入 “/”则放到hadoop文件系统的默认目录了。

Run some of the examples provided:
$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'

运行结果如下

wps_clip_image-8595

上面显示了,运行过程

wps_clip_image-31833

wps_clip_image-18727

最终允许结果

Examine the output files:

Copy the output files from the distributed filesystem to the local filesytem and examine them:
$ bin/hadoop fs -get output output    // 拷贝文件从hadoop到本地文件
$ cat output/*                            // 显示本地文件内容

运行结果如下:

wps_clip_image-11275

停止hadoop软件

When you're done, stop the daemons with:
$ bin/stop-all.sh

hadoop 1.2.1本地安装入门

原创文档,转载请将原文url地址标明

1年多没接触hadoop了, 最近hadoop发展很快,最近有些时间, 准备重新开始研究一下hadoop的源代码了, 为熟悉最新的hadoop情况, 先从1.2.1版本hadoop研究一下工作情况, 包括:安装,调试等等情况,然后再开始研究hadoop的源代码。

若是您不了解hadoop是啥, 请参考 百度百科hadoop的介绍

Hadoop的安装一般可以分为, 本地安装, 本地集群安装(每个hadoop组件都运行单独的jvm进程中), 最后是分布式集群安装。

本次安装,我们也采用这个顺序来进行系列的研究。

一. 下载hadoop源代码到windows

下面是hadoop的官方网站

http://hadoop.apache.org/

显示如下:

wps_clip_image-4634

我们下载1.2.1版本的稳定版本

下载地址如下:

http://apache.fayea.com/apache-mirror/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz

下载完成后, 解压缩文件, 这里源代码解压缩到 c:\tmp目录

注意: 1. hadoop在linux系列下工作, 尽管windows下可以进行安装, 但是需要安装很多其他软件, 这里也在linux下安装运行。

2. 这里之所以下载安装文件到windows下,我们目的是方便查看里面的文档,查看里面的帮助文档可以了解更多的hadoop情况。

下面进入程序目录, 打开帮助文档

二.查看hadoop的文档

在浏览器地址栏中输入如下地址(请根据您的具体位置,调整相关地址,或者在资源管理里面直接打开 index.html文件)

file:///C:/tmp/hadoop-1.2.1/hadoop-1.2.1/docs/index.html

wps_clip_image-28216

如上图

打开文档后,如下图:

wps_clip_image-12302

Getting Started

The Hadoop documentation includes the information you need to get started using Hadoop. Begin with the Single Node Setup which shows you how to set up a single-node Hadoop installation. Then move on to the Cluster Setup to learn how to set up a multi-node Hadoop installation. Users interested in quickly setting-up a hadoop cluster for experimentation and testing may also check CLI MiniCluster.

我首先查看本地安装指南

wps_clip_image-11565

Prerequisites必须的环境

Supported Platforms(支持的平台)

· GNU/Linux is supported as a development and production platform. Hadoop has been demonstrated on GNU/Linux clusters with 2000 nodes.

· Win32 is supported as a development platform. Distributed operation has not been well tested on Win32, so it is not supported as a production platform. Windows平台需要准备很多东西, 才能满足大量的脚本等。

Required Software必须的软件

Required software for Linux and Windows include:

1 JavaTM 1.6.x, preferably from Sun, must be installed. Java安装情况

2 sshmust be installed and sshd must be running to use the Hadoop scripts that manage remote Hadoop daemons.

Hadoop必须采用ssh进行相关管理

Additional requirements for Windows include:

3 Cygwin- Required for shell support in addition to the required software above.

在windows下必须这个环境, 我们本次在linux下进行, 因此我们没有这个安装的必要

Installing Software

If your cluster doesn't have the requisite software you will need to install it.

For example on Ubuntu Linux:

$ sudo apt-get install ssh
$ sudo apt-get install rsync

上面是 ubuntu进行安装的命令, 我们用的 centos环境, 因此我们命令如下:

$ yum install ssh
$ yum install rsync

On Windows, if you did not install the required software when you installed cygwin, start the cygwin installer and select the packages:

· openssh - the Net category

Download

To get a Hadoop distribution, download a recent stable release from one of the Apache Download Mirrors.

下载hadoop环境,我们前面已经下载了。

Prepare to Start the Hadoop Cluster在本地开始hadoop的相关情况

Unpack the downloaded Hadoop distribution. In the distribution, edit the file conf/hadoop-env.sh to define at least JAVA_HOME to be the root of your Java installation.

Try the following command:
$ bin/hadoop
This will display the usage documentation for the hadoop script.

Now you are ready to start your Hadoop cluster in one of the three supported modes:

· Local (Standalone) Mode

· Pseudo-Distributed Mode

· Fully-Distributed Mode

Standalone Operation

By default, Hadoop is configured to run in a non-distributed mode, as a single Java process. This is useful for debugging.

The following example copies the unpacked conf directory to use as input and then finds and displays every match of the given regular expression. Output is written to the given output directory.
$ mkdir input
$ cp conf/*.xml input
$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
$ cat output/*

Hadoop在本地工作情况, 默认采用的是本地文件系统, 单个jvm进程,我们可以充分调试我们的程序, 就像普通程序一样。

三.hadoop学习的硬件环境

a) 网络环境

wps_clip_image-24156

如上图, 我们创建了一个虚拟的网络系统, 进行本系列文章的研究。

创建了一个虚拟的交换机, 然后创建4个虚拟的linux服务器(centos5.6版本), 分别是:db,red,mongdb, nginx, (后续在这个4个不同的服务器上安装不同的应用,进行其他研究。)

Ip地址也已经设置完毕。

我们的开发用笔记本通过虚拟交换机相连, 同时也同adsl相连接, 虚拟机交换机也同adsl相连接, 这样保证4台虚拟机及其也能同互联网联通。

b) 服务器环境

wps_clip_image-16347

虚拟机环境如上。

wps_clip_image-12329

环境结果情况如下图。

wps_clip_image-1294

虚拟机链接方法:

wps_clip_image-10339

c) 软件环境

wps_clip_image-24067

软件环境:

[root@red ~]# java -version

java version "1.7.0_25"

OpenJDK Runtime Environment (rhel-2.3.10.4.el5_9-i386)

OpenJDK Client VM (build 23.7-b01, mixed mode)

[root@red ~]# ssh

usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]

[-D [bind_address:]port] [-e escape_char] [-F configfile]

[-i identity_file] [-L [bind_address:]port:host:hostport]

[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]

[-R [bind_address:]port:host:hostport] [-S ctl_path]

[-w tunnel:tunnel] [user@]hostname [command]

[root@red ~]# rs

rsh    rsync

[root@red ~]# rsync

rsync  version 2.6.8  protocol version 29

Copyright (C) 1996-2006 by Andrew Tridgell, Wayne Davison, and others.

四.配置hadoop单节点环境

a) 下载hadoop

wget http://apache.fayea.com/apache-mirror/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz

下载后的结果如下:

[root@db apps]# pwd

/work/apps

[root@db apps]# ls

hadoop-1.2.1.tar.gz

b) 解压缩

tar xzvf hadoop-1.2.1.tar.gz

[root@db apps]# pwd

/work/apps

[root@db apps]# ll

drwxr-xr-x 15 root root     4096 Jul 22 18:26  hadoop-1.2.1

-rw-r--r--  1 root root 63851630 Sep 20 16:02  hadoop-1.2.1.tar.gz

c) 测试

[root@db apps]# cd hadoop-1.2.1

[root@db hadoop-1.2.1]# ls

....

[root@db hadoop-1.2.1]# pwd

/work/apps/hadoop-1.2.1

/work/apps/hadoop-1.2.1

[root@db hadoop-1.2.1]# mkdir input      // 创建输入文件目录

[root@db hadoop-1.2.1]#

[root@db hadoop-1.2.1]# cp conf/*.xml input    //  拷贝文件到输入文件目录

[root@db hadoop-1.2.1]# bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'    // 执行hadoop的相关目录

Error: JAVA_HOME is not set.   //错误信息

[root@db hadoop-1.2.1]#

用下面的命令, 找到java的目录

[root@db bin]# find / -name rt.jar

/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25/jre/lib/rt.jar

[root@db bin]# cd /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25/

根据上面信息, 需要添加 下面信息到  /etc/profile

JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25/jre

JRE_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25/jre

PATH=$PATH:$JAVA_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME JRE_HOME PATH CLASSPATH

输入如下命令:

vi   /etc/profile   编辑文件, 将上面信息放到文件最后面,如下:

wps_clip_image-3382

保存文件推出

source  /etc/profile  使刚刚编辑的文件生效

然后输入如下命令, 执行hadoop的相关命令

bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'

运行结果如下:

wps_clip_image-17044

检查结果文件:

[root@db hadoop-1.2.1]#  cat output/*

1       dfsadmin

[root@db hadoop-1.2.1]# cd output/

[root@db output]# ls

part-00000  _SUCCESS

[root@db output]# cat part-00000

1       dfsadmin

[root@db output]#

截图如下:

wps_clip_image-7

 

后续我们将研究, 本地的伪分布式配置,最后我们研究集群下工作情况.

Hadoop源代码分析 之Datanode工作原理(5)—–拷贝文件过程总结

原创文章,转载请指明出处并保留原文url地址

hadoop 相关视频下载地址: http://pan.baidu.com/share/link?shareid=223046310&uk=3073578852

前一文章中,我们重点讨论了hadoop shell脚本拷贝本地文件到hadoop文件系统(hdfs)的工作过程,我们重点针对拷贝的源代码进行了研究,主要研究了本地文件拷贝的初始化过程,文件拷贝过程。本篇文档我们通过汇总相关工作的序列图来从图形化方式分析相关工作过程。

引言,hadoop代表一种全新的编程思想,基于hadoop有很多衍生项目,充分利用他们

为我们服务是非常必要的,同时hadoop又是一个复杂系统,若能理解他的工作原理对

我们将有非常大的帮助,我们在这里以hadoop的0.1.0版本为基础逐步分析他的基本工作

原理、结构、思路等等,希望通过这个能帮助我们理解生产中的hadoop系统。 时间有限,

经验不足,疏漏难免,在这里仅仅分享一些心得,希望对大家能起到一个抛砖引玉的作用吧,

有问题请大家给我留言或者评论等,这样也能对我的工作有莫大的帮助。

感谢您阅读这篇文章!

 

一.文件拷贝总体过程

管理员在hadoop客户端机中,启动hadoop shell,拷贝本地文件到hadoop集群时,系统经历了大概下面几个阶段。

1. 系统初始化过程,这个过程中shell客户端根据本地配置文件初始化本次jvm进程的相关信息,从classpath中寻找到配置文件,获取namenode等具体信息,本地相关信息等,然后,启动main函数,调用里面功能创建一系列文件服务对象等。

2. 系统初始化完成后,读取文件系统数据,然后循环写入数据对象中,数据对象将数据先缓存在内存中,到达一定数据后将数据输出到本地临时文件中,当文件大小尺寸到达文件块尺寸时,启动dfsclient中的流输出对象,对象相同namenode沟通获取块信息(元信息)等,然后连接datanode节点通过网络将数据传输过去(datanode中相关流程在前一文章中已经研究过了),循环将全部数据传输完。

3. 最后文件结束后系统启动close功能,将内存中数据包括crc等数据刷新到网络上,同时清理本地相关临时文件等等。

二.初始化阶段

下图是hadoop shell在文件拷贝中初始化阶段的创建过程,图中内容比较多,为了绘图方便,大部分名称都采用简写,图中附上一个对照关系表供参考。

下图采用近似uml序列图方式绘制,但不是规范的uml序列图,同时也不完全拘泥于序列图的规范,核心就是让读者能看明白图中内容(uml相关可以参考http://www.iigrowing.cn/?s=uml)。

一)图示介绍

图中如下图示的含义如下:

1. wps_clip_image-29119[3][1]表示java中一个类的某个对象实例,一般用类名代表,但其实是实例对象。

2.  wps_clip_image-11684[3][1] 图中箭头表示一次调用,并且是一次阻塞式调用(被调用对象的相关函数若是没有返回,则调用者将一直等待返回)。图中箭头方向代表调用方向 ,例如A对象调用B的方法,就是 A--->B(A调用B)

3.  wps_clip_image-18733[3][1]图中虚线箭头代表调用的返回,箭头的方向表示从被调用者到调用者的返回。

4.  wps_clip_image-17496[3][1]图中蓝色竖条代表被调用函数的执行时间,从上到下表示调用开始、调用结束。

5.  wps_clip_image-30512[3][1]图中折线箭头表示对象内部函数调用, 新的蓝色竖条表示新的调用生命周期。

6.  wps_clip_image-2189[3][1] 图中调用箭头上面的文字用来描述调用的相关信息,主要表示调用的方法等信息,或者调用函数功能等,这里用法同标准序列图有些出入,但是基本相同。

7.  wps_clip_image-20985[3][1]图中<init>一般代表java中类(对象)的构造函数

8.  程序调用顺序从上 至下 进行。读者读图时需要从上至下进行,沿着箭头方向进行阅读。

wps_clip_image-23950[3][1]

上图是hadoop shell上传文件到hdfs过程,主要是初始化过程,下面我们来了解一下相关过程。

二)图形内容概括

如上图,我们用带阴影矩形标识出了3个区域

区域1:数据输出流对象创建,这个区域中各个调用主要围绕创建java流对象创建,创建出对象主要是保证上传数据文件对象的数据读取写入等各种操作,包括网络等流操作。

区域2:校验文件流对象创建区域,这里面也创建了一些流对象,但是这流对象是对上面数据文件数据进行校验的,这些校验信息形成一块独立的流对象,单独作为文件存储在hdfs中(这个版本是这样的,后续版本情况我没有去验证,稍后验证了在补充到文档中)。

区域3:数据工作区域,这里进行数据输出到远程服务器等工作,这里内容已经省略,详情见下一幅图形及解释。

三)流程内容解释

下面的解释需要读者参照上面图形进行慢慢理解,同时解释仅仅是一个处略的解释,详细情况请参考相关源代码。

1. 首先用户从命令行数输入命令, hadoop脚本调用java的dfsshell类的main行数,程序从这里开始执行。

2. main函数调用dfsshell的copyFromLocal函数

3. copyFromLocal函数调用DistributedFileSystem类(一个实例对象)的copyFromLocalFile函数(图中对象比较多采用简写办法DistributedFileSystem为dfs,其他对照参考对照)

4. dfs的copyFromLocalFile中调用doFromLocalFile函数

5. doFromLocalFile函数,调用create函数,create又调用另一个重载的函数

6. 最后在create函数中 创建FSDataOutputStream(FSDOS)对象

7. 最后在FSDOS的构造函数中创建summer对象

8. 在summer对象的构造函数中间接调用DFSClient及DFSClint内部类DFSOS对象,这个对象负责具体的同namenode及datanode进行通信等工作

9. DFSOS对象创建完成后,返回到summber构造函数中

10. summer构造函数中继续上面相似流程,创建下面校验对象(这里省略几个针对crc的FSDataOutputStream$buffer及FSDataOutputStream$PositionCache对象的创建过程,内容比较多,也比较烦了,只好省略不重要的内容了)

11. FSDataOutputStream$summer

对象创建完成后,系统会将FSDataOutputStream$summer

对象作为参数创建FSDataOutputStream$PositionCache对象,

12. FSDataOutputStream$PositionCache对象创建完成后作为参数创建FSDataOutputStream$buffer对象

13. 最后创建过程完成

14. 创建完成后,程序进行数据写入工作,详情见下节

三.数据写入过程

下图是hadoop shell程序写入数据到hdfs时序列图

wps_clip_image-21646[3][1]

一)图形内容概括

如上图,整个图形根据不同矩形阴影区域,可以分5个区域,相关情况如下:

1. 左侧垂直区域, 这个区域是程序员最容易看到也容易看清楚的一个区域, hadoop通过一个抽象的FileSystem对象将系统客户端代码同server代码进行了封装。当shell代码采用FileSystem系统分布式实现方式时,shell操作就是hdfs文件系统,当FileSystem实现的是本地文件系统操作的对象就是本地的普通文件。这样简化了shell的设计,开发人员可以专注一个方面的开发不用在关心复杂的网络通信等。

2. 右侧最上面区域1,是初始化区域,由于本图是shell进行文件拷贝的序列图,为了保持完整性我们保留大部分拷贝过程等,同时根据本图需要重点表现情况针对不同过程进行了省略或者简化。本区域是个初始化过程,较为详细过程在上面图中已经表达,读者可以去参考。

3. 右侧上面区域2, 是校验和写入区域,校验和写入过程中有个区域工作过程同写入正常数据类似(总体思路是类似,具体代码实现不同),我们省略了过程,相关过程读者感兴趣自己去看源代码。

4. 右侧上面区域3, 这个是本文重点,这里是具体数据写入过程,包括数据读取,数据写入内存缓存,然后写入网络,包括如何同namenode及datanode通信过程等,我们稍后会给出详细解释。

5. 右侧最下面区域, 这个区域是系统关闭代码区域,系统在关闭过程中清理了内存的缓存,临时文件,同namenode及datanode通信等,这个过程也包括了一个同上面数据写入区域类似的过程,这里面也省略了,读者感兴趣可以执行研究。

二)数据写入过程解释

前面main函数调用、初始化等过程等在前面一节已经有了介绍我们不在多言。我们直接从数据写入开始。

1. 读取数据 (in.read(buf)),in是输入流,在初始化过程已经创建完毕

2. 调用fsdos(FSDataOutputStream)对象的write(x,x,x)(代表有三个参数的重载函数版本,x省略了具体情况,读者去阅读源码吧)写入数据

3. 调用FSDataOutputStream$buffer对象相应写入函数(这里面其实是调用buffer对象的父对象的函数,我们为了简化记做buffer对象)

4. 调用FSDataOutputStream$PositionCache对象的write函数

5. 调用FSDataOutputStream$summer对象的writer(x,x,x)函数

6. 在FSDataOutputStream$summer对象的writer函数内计算校验和,写入校验和到对象中,写入先是写入内存对象中,当内存对象满或者达到一定条件后,写入临时文件以及根据网络配置情况传输到网络上的hdfs中,这个过程也相对较为省略了,请读者自己研究源码了,看懂了数据写入过程在看那个过程非常类似,比较容易看懂因此省略了)

7. 校验和写入完毕后,写入数据到DFSOS(DFSClient$DFSOutputStream)对象中

8. DFSOS(DFSClient$DFSOutputStream)首先将数据写入内存缓存

9. 数据条件满足时,写入临时文件中

10.当数据写满了一块数据后,调用endblock函数

11.endblock函数处理临时文件等,然后调用nextblockoutputstream函数

12.在nextblockoutputstream函数中,首先同namenode进行沟通来创建文件(若是首次通信),或者添加一块数据,最后获取块的元信息

13.根据块的元信息连接datanode节点

14.传输数据到datanode节点

15.处理传输后相关逻辑

17.最后程序依次返回调用函数处,然后程序继续读取下一部分数据重复上面过程,直到数据都发送完毕

18.程序关闭阶段,关闭阶段处理了内存中的缓存数据,处理本地临时文件等

19.程序最后返回给用户一个执行情况结果。

以上是hadoop shell上传文件到datanode过程的一个总结,请结合前面文章慢慢了解工作过程。若是有时间请下载相关虚拟机及eclipse项目调试整个过程,读者会获取更多理解。

 

参考文章
Hadoop源代码分析 之Datanode工作原理(5)—–拷贝文件过程总结

Hadoop源代码分析 之Datanode工作原理(4)—–拷贝本地文件到hadoop的过程

Hadoop源代码分析 之Datanode工作原理(3)—–datanode工作过程总结

hadoop源代码介绍

Hadoop源代码分析 之Datanode工作原理(2)—–datanode基本工作过程

Hadoop源代码分析 之Datanode工作原理(1)—–datanode启动过程代码分析

Hadoop源代码分析 之hadoop配置及启动(4)—–启动过程汇总

Hadoop源代码分析 之hadoop配置及启动(3)—–classpath与hadoop主要组件启动过程

Hadoop源代码分析 之hadoop配置及启动(2)—–classpath与启动shell脚本

Hadoop源代码分析 之hadoop配置及启动(1)—–classpath与配置文件

Hadoop源代码分析 之hadoop源代码项目(1)—–创建eclipse下java项目

Hadoop源代码分析 之环境配置(2)—–虚拟机ip配置

Hadoop源代码分析 之环境配置(1)—–hadoop虚拟机配置

Hadoop源代码分析 之概念介绍(2)—–初学者眼中的hadoop

Hadoop源代码分析 之概念介绍(1)—–服装加工,火车货物检查与hadoop

调试eclipse下hadoop的map reduce程序