Hadoop笔记<一>

一.hadoop作业的运行方式

编写MR作业之后需要将代码打成jar包,hadoop会在集群上分发该作业jar包。

当用hadoop jar运行一个非MR作业时(写了的一个存储程序,在指定端口接受连接,然后存到hadoop集群中),hadoop不会再集群上分发该jar文件(因为不是MR作业),只会在运行该任务的机器上执行该程序。

1.在windows上编写调试程序,然后用eclipse打包工具打成jar包,没有直接打成可运行的jar包,因为那样会把用到的多有的jar包打进来,程序文件很大,而hadoop集群上有这些jar包,所以多此一举,然后再jar包的资源清单文件中添加Main-Class项,然后把所有用到的jar包都添加到Class-path项中,指出该jar包在hadoop集群中的位置即可,还有hadoop的配置文件目录也要添加,然后把最后的jar包扔到hadoop集群上,java -jar jarname.jar,ok,过程很繁琐吧。此外如果用到第三方的库,也要在class-path中说明,并在集群上放置该包。

2.第一种方法之所以繁琐是因为使用的java命令来运行该作业,如果使用hadoop命令的话,会方便很多,首先hadoop命令自己把hadoop相关的库文件路径导入,包括配置文件,这样在jar包的资源清单文件中就无需添加class-path项,只添加main-class项即可,然后hadoop jar jarname.jar即可,如果用到第三方的jar包,添加HADOOP_CLASSPATH环境变量即可,hadoop脚本会执行相关操作。

由于自己写的那么存储程序只依赖hadoop的库文件和配置文件,现在发现可以再hadoop集群中每个机子上都运行自己的程序,这样就充分利用了集群的计算能力啦。

至于运行的MR作业中用到第三方jar包的情况,可以通过添加HADOOP_CLASSPATH在jobtracker上,不知道hadoop会不会将第三方包也分发给集群中各个机子,还是需要自己配置各个机器中都拥有该第三方包,有机会测试一下。

数据流:

Map的输出是不会写入HDFS的,而是写入本地目录map_local_dir,当reduce的任务个数大于1个时,分区函数起到很重要的作用,每个map的输出都会分为reduce任务的个数份,分区函数确保一个key经过分区函数的映射后,会映射到同一个reduce,这点很重要。

为了减少网络带宽的占用,map任务的输出在传到reduce输入之前可以先经过指定的合并函数combiner,过滤掉不需要的数据,减少带宽的占用,但并非所有的函数都具有该属性,如平均数函数,所以,在MR中使用combiner要慎重考虑。

其他语言的兼容:

Streaming使用Unix的标准输入输出流作为Hadoop和应用程序的接口,可以兼容任何编程语言

Pipes作为MR的C++接口,使用的是套接字通信,而不是JNI。

 

 dfs.replication这个参数是个client参数,即node level参数。需要在每台datanode上设置。

一个文件,上传到hdfs上时指定的是几个副本就是几个。以后你修改了副本数,对已经上传了的文件也不会起作用。可以再上传文件的同时指定创建的副本数
hadoop dfs -D dfs.replication=1 -put 70M logs/2

可以通过命令来更改已经上传的文件的副本数:
hadoop fs -setrep -R 3 /

posted on 2013-04-19 19:46  waxili  阅读(319)  评论(0编辑  收藏  举报

导航