hadoop命令的使用:
Usage: hadoop [--config confdir] COMMAND
这里COMMAND为下列其中一个:
<span style="font-size:16px;">namenode -format 格式化DFS文件系统 secondarynamenode 运行DFS的第二个namenode namenode 运行DFS的namenode datanode 运行一个DFS的datanode dfsadmin 运行一个DFS的admin 客户端 fsck 运行一个DFS文件系统的检查工具 fs 运行一个普通的文件系统用户客户端 balancer 运行一个集群负载均衡工具 jobtracker 运行MapReduce的jobTracker节点 pipes 运行一个Pipes作业 tasktracker 运行一个MapReduce的taskTracker节点 job 处理MapReduce作业 version 打印版本 jar <jar> 运行一个jar文件 distcp <srcurl> <desturl> 递归地复制文件或者目录 (采用分布式复制方法,一般用于两个HDFS集群中) archive -archiveName NAME <src>* <dest> 生成一个Hadoop档案 (将har当作一个新的文件系统,《权威指南3.8节》) daemonlog 获取或设置每个daemon的log级别 或CLASSNAME 运行名为CLASSNAME的类大多数命令会在使用w/o参数 时打出帮助信息。</span>
- hadoop程序的编译:(我是用的hadoop版本为hadoop-0.20.203.0)
1.注意的是要将hadoop的core包加入到classpath中,命令如下:
javac -classpath ~/hadoop-0.20.203.0/hadoop-core-0.20.203.0.jar FileSystemDoubleCat.java
(这里还有一个疑问:我用通配符添加jar包时一直失败(使用 *.jar),提示找不到类??????)
- 运行hadoop程序的方法如下:
1.直接使用hadoop CLASSNAME 【args】 运行,
( 注意此时需设置环境变量 HADOOP_CLASSPATH中包含当前类。其中当前目录中应该包含.class文件,这个可以通过在eclipse中的bin文件下取得,或用上面的方法进行编译)
如:hadoop FileSystemDoubleCat hdfs://localhost:9000/user/kqiao/uploadFile
2.将程序打包成jar包,然后使用hadoop jar命令运行。
这只相当于将上面中的.class文件打包,然后运行该jar文件。(注意,如果以集群模式下运行hadoop,则只能使用这种方法,因为需要在各网络节点上分发jar包)并且主程序中要有:
job.setJarByClass(MaxTemperature.class)这句,用于设定jar类
命令如下:jar -cvf FileSystemDoubleCat.jar FileSystemDoubleCat.class
hadoop jar FileSystemDoubleCat.jar FileSystemDoubleCat hdfs://localhost:9000/user/kqiao/uploadFile
3.安装eclipse的hadoop插件,直接在eclipse中编辑程序,然后运行
这应该算是最简单的运行方法了吧。。。。
在run configuration下完成配置,然后 run on hadoop即可。
-----------------------------------------------------------------------------------------------------------------------------------
以后记录我在运行中遇到的问题~
(1)-D mapred.reduce.tasks=2 或 job.setNumReduceTasks(2) 设置reducer的数量
(换了一个hadoop版本,不知道为什么,使用-D 选项设置reducer数量失败了,没有报错,但是reducer保持为1,只能使用job.set来设置?未解决。。)
(2)如果已经确定有某类的存在,却一直提示找不到该类,一般是因为class_path的设置问题。
(3)如果自定义的mapper类是主类的内部类时,一定记得将其定义为static。
(4)hadoop程序,如果有运行错误,主要通过查看job或task的日志解决:看看抛出了什么样的异常,在哪个阶段,哪个任务抛出了异常。
如果是运行结果与预期不符,则通过查看计数器判断那部分出错,另一方面可以在程序中加入输出语句,System.out.println("****");然后在web页面中的job下查看各个job的task日志,看看 stdout log, stderr log进行分析排序。