早在2011年9月份就开始用了3个月时间学习hadoop、hbase、hive、nutch等东西,但当时没有明确的想法和充足的时间,后来就没有继续深入下去。有幸在今年春节之前的1个月的时间,做了hadoop、hbase相结合的简单开发,对hadoop相关有更深的理解,特在此补上年前未写的文章。

 1、hadoop之hdfs: hadoop的底层存储文件系统协议,是hadoop的两大核心之一,即分布式布储。以冗余备份、自动负载、自动恢复损坏数据块著称,理念很传统专业,实现的很好,效果很不错。

    重点说明:

       (1)hadoop hdfs:文件创建后的可见性,只有调用了api中的flush或是close之后才会使整个集群可见。

        (2) hadoop hdfs api中的FileSystem对象往往是缓存获取的,多次get往往只会返回该对象的同一个实例,增加了响应效率,所以在使用时,要是在一个进程中或是多线程中去得到FileSystem对象,不要用完就关闭,否则会报FileSystem is closed等相关错误。

hadoop dfsadmin -safemode leave。

 2、hadoop之map/reduce,hadoop的分布式计算的简称,是hadoop的两大核心之一,即分布式计算。以简单、灵活著称。它是将分布式编程模型再次抽取,抽像为每个分布式计算过程,都可以拆分成为map打散和reduce聚合的过程,当然其中还可能包括combine(合并),partion(分区,即指定哪个map到哪个reduce的映射函数)部分。而以前的分布式编程模型比之于此,要复杂的多,之前的分布式并行编程模型对于程序员的控制、开发量太大,并且自己去处理异常错误等情况,使得并没有得到广泛的认同。而hadoop的map/reduce解决了这一瓶颈,它使得程序员只需要关注具体要处理的数据集和内部业务逻辑上,至于分布式的存储、容错、负载均衡等都由hadoop框架去解决,当然它也提供了个性化的任务优化方案,如块的切分、map或reduce的任务数量等均可自定义去实现。

    重点说明:

        (1)每个map/reduce任务都是以独立的子jvm进程存在,而非多线程的模式,故在程序设计时注意变量的可见性。

        (2)其程序的发布包的分发是由hadoop自身去管理其分发、运行的,故在运行自己的发布包时,只需要hadoop jar jarName.jar mainClass等命令在主节点上运行即可,其分发过程由hadoop jar这个命令自行完成分发与运行。

        (3)hadoop的输出目录总是强制要求不存在,原因在于担心由于不小心将hdfs中的已存目录或文件覆盖掉。

        (4)在map/reduce执行的过程中是允许任务失败的,失败之后会自行处理即分发到其它的taskTracker中去运行,因此会出现如map运行50%后突然回到40%的情况,多为此种情况所致,是正常现象,不会影响程序的最终结果。

3、编写hadoop程序时,注意程序所需的数据文件的处理,可以做一个驱动类中预处理一下,将数据文件都放到hdfs后再启动提交job,这样可以使每个节点均可获取hdfs中的数据文件或是资源文件。

4、jobtracker、tasktracker是计算节点,namenode是命名空间节点,datanode是数据节点,namenode和jobtracker建议在不同节点上独立存在,tasktracker和datanode一般是在一个节点上的不同进程存在。

 

5、hbase:基于hadoop实现的面向列的nosql数据库,其api操作依赖于zoopkeeper,一般要将hbase的配置文件(其包括zookeeper配置参数)放到要操作hbase的项目中,实现对hbase的简易操作。

6、hive: 基于hadoop实现的数据仓库,其命令可转化为map/reduce执行,对类sql支持的比较好,有比较简单实用的shell或是api可用于海量数据分析与统计计算。

7、zookeeper: 集群协作服务组件,由于主节点的选择、以及对hbase的操作首要查询其root和.meta信息。

8、sqoop:作为数据从sql到nosql迁移的第三方组件出现,如将mysql数据导入到hbase或是hive中,均可用它。

 

9、hadoop的社区版学习用比较不错,但实用的话其配置和管理都比较不快捷。目前较为流行的为Cloudera公司的CDH版本,像如今的CDH4.x都还不错,有免费版和商用版,据说除节点个数限制外无其它区别,可以商用。

 

大概通想到的有如上9条,希望对后来人有帮助。