原创文章,转载请注明: 转载自工学1号馆
1、hadoop文件目录相关
前面的文章把Hadoop算是简单的入门,下载的源码,写了HelloWorld,简要分析了其编程要点,然后也编了个较复杂的示例。接下来先看看其源码,研究下如何实现的。
研究源码,那我们就来先从整体上看一下Hadoop-1.0.1的目录:
这个是刚下完代码后,目录列表中的内容
目录/文件 | 说明 |
bin | 下面存放着可执行的sh命名,所有操作都在这里 |
conf | 配置文件所在目录 |
ivy | Apache Ivy是专门用来管理项目的jar包依赖的,这个是ivy的主要目录 |
lib | 引用的库文件目录,里面存放用到的jar包 |
src | 这个里面就是主要的源码了 |
build.xml | 用于编译的配置文件。 编译我们用的是ant |
CHANGES.txt | 文本文件,记录着本版本的变更历史 |
ivy.xml | Ivy的配置文件 |
LICENSE.txt | 文件本文件 |
NOTICE.txt | 文本文件,记录着需要注意的地方 |
README.txt | 说明文件。 |
进入src目录,可以看到如下图所示内容:
2、搭建hadoop源码学习环境
创建一普通的java工程:
点下一步,输入工程名:HadoopSrcStudy,然后再下一步
然后全部默认下一步,再Finish完成:
接下来,添加源码了,打开hadoop下面的src文件夹,将core,hdfs,marped这三个目录,复制到工程里面。(先在选中三个文件夹ctrl+c,然后回到eclipse中,选中HadoopSrcStudy工程,然后直接按一下ctrl+v)
文件夹添加进来以后,现在这三个文件夹还不能当成源码进行编译,所以我们右健工程属性,然后选中Java Build Path,在右边的tab页选中Source,然后点Add Folder:
在弹出页面中,选中core、hdfs、mapred三个目录,然后点两次OK,完成设置。
在源码目录下建一个jar的文件夹。然后将以下目录下的jar文件都复制进来。
hadoop-1.0.1/build/ivy/lib/Hadoop/common/*.jar
hadoop-1.0.1/lib/jsp-2.1/*.jar
hadoop-1.0.1/lib/kfs-0.2.2.jar
hadoop-1.0.1/lib/hsqldb-1.8.0.10.jar
然后右健工程,选属性页,在BuildPath页,选Libraiers:
点击Add Jars:
选择jar文件夹下所有的jar文件,然后点两次OK。
RccTask文件里还存在bug:
对着该文件右健菜单Build Path->Exclude即可。
然后将hadoop-1.0.1目录下conf文件夹下的core-site.xml、hdfs-site.xml、mapred-site.xml、log4j.properties这几个文件,放在src目录下,
将hadoop-1.0.1目录下src文件夹下的,webapps复制到src目录下。
在eclipse中,src目录下建一个package,名为:org.apache.hadoop,然后将hadoop-1.0.1\build\src\org\apahe\hadoop\package-info.java文件,复制到该package下。目录如下:
这样源码调试环境完成。
让Hadoop在eclipse中运行起来
源码已经加入,并且已经编译通过了,接下来得在eclipse中跑一下,试下是否能正常跑起来。
这里我们尝试,用命令行中执行namenode,然后用eclipse运行datanode,然后再开一个命令行,用fs命令,是否能查到之前的内容。
1.打开终端,cd进入hadoop-1.0.0目录,执行bin/hadoop namenode命令
出现如下错误:
14/12/15 17:31:47 INFO datanode.DataNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting DataNode
STARTUP_MSG: host = ubuntu/127.0.1.1
STARTUP_MSG: args = []
STARTUP_MSG: version = 0.20.2
STARTUP_MSG: build = -r ; compiled by ‘wu’ on Sun Nov 30 07:50:30 PST 2014
************************************************************/
14/12/15 17:31:49 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 0 time(s).
14/12/15 17:31:50 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 1 time(s).
14/12/15 17:31:51 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 2 time(s).
14/12/15 17:31:52 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 3 time(s).
14/12/15 17:31:53 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 4 time(s).
14/12/15 17:31:54 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 5 time(s).
14/12/15 17:31:55 INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 6 time(s).
终端输入命令:
bin/start-all.sh
控制台正常输出:
14/12/15 17:34:25 INFO datanode.DataNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting DataNode
STARTUP_MSG: host = ubuntu/127.0.1.1
STARTUP_MSG: args = []
STARTUP_MSG: version = 0.20.2
STARTUP_MSG: build = -r ; compiled by ‘wu’ on Sun Nov 30 07:50:30 PST 2014
************************************************************/
14/12/15 17:34:25 INFO common.Storage: Storage directory /tmp/hadoop-wu/dfs/data is not formatted.
14/12/15 17:34:25 INFO common.Storage: Formatting …
14/12/15 17:34:26 INFO datanode.DataNode: Registered FSDatasetStatusMBean
14/12/15 17:34:26 INFO datanode.DataNode: Opened info server at 50010
14/12/15 17:34:26 INFO datanode.DataNode: Balancing bandwith is 1048576 bytes/s
14/12/15 17:34:26 INFO mortbay.log: Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
14/12/15 17:34:26 INFO http.HttpServer: Port returned by webServer.getConnectors()[0].getLocalPort() before open() is -1. Opening the listener on 50075
14/12/15 17:34:26 INFO http.HttpServer: listener.getLocalPort() returned 50075 webServer.getConnectors()[0].getLocalPort() returned 50075
14/12/15 17:34:26 INFO http.HttpServer: Jetty bound to port 50075
14/12/15 17:34:26 INFO mortbay.log: jetty-6.1.14
14/12/15 17:34:33 INFO mortbay.log: Started SelectChannelConnector@0.0.0.0:50075
14/12/15 17:34:34 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=DataNode, sessionId=null
14/12/15 17:34:34 INFO metrics.RpcMetrics: Initializing RPC Metrics with hostName=DataNode, port=50020
14/12/15 17:34:34 INFO ipc.Server: IPC Server Responder: starting
14/12/15 17:34:34 INFO ipc.Server: IPC Server listener on 50020: starting
14/12/15 17:34:34 INFO ipc.Server: IPC Server handler 0 on 50020: starting
2.在eclipse中,进入hdfs目录,再进入org.apache.hadoop.hdfs.server.datanode目录,打开DataNode.java文件,然后点上面的运行,然后就可以看到在eclipse中,正常的输出信息,且没有错误。该信息,可以在log文件夹下,找到datanode的日志,其内容是一样的。 同时在前面的命令行窗体中,可以看到namenode程序中收到一个datanode的接入请求。
3.再打开一个命令行窗口,进入hadoop-0.20.2目录bin/hadoop fs –ls,就可以看到输出了文件列表。
4.然后再输入命令bin/hadoop fs -cat out/* 就可以看到之前程序运行生成在out目录下的数据了。
如果上面两个命令都执行成功,说明namenode和在eclipse中运行的datanode都起作用了。可以再观察下,当我们在执行cat命令时,在eclipse中的输出框中,看到有新的响应输出,说明它工作了。
同样,我们还可以反过来,在eclipse中运行namenode,在命令行中运行datanode。同样的效果。
为了可以看到更多的调试日志输出,我们还可以打开src下的log4j.properties文件,在第二行中的INFO改成DEBUG,这样输出的内容会更详细。
Comments