早在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等相关错误。
(3)hadoop namenode安全模式:当启动hadoop集群时,首先进入安全模式,其实就是进行集群的块校验等操作,并进行校验后的自动均衡、自动恢复等操作,在此过程中集群中均为只读状态,不可写入任何数据。往往在集群丢掉相关节点后重启时会陷入很长时间的安全模式中,可以通过hadoop的shell命令离开安全模式,即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条,希望对后来人有帮助。