https://antkillerfarm.github.io/
Hadoop
最近(2016.4),参加公司组织的内部培训,对Hadoop有了一些认识,特记录如下。
概述
Hadoop项目由Doug Cutting创建。Doug Cutting也是Lucene项目的创建者。
PS:Lucene是我2007年学习搜索引擎技术时,所接触到的开源项目。回想起来,简直恍如隔世啊。
官网:
官方文档:
http://hadoop.apache.org/docs/current/
广义的Hadoop包含一个庞大的生态圈:
http://cqwjfck.blog.chinaunix.net/uid-22312037-id-3969789.html
www.360doc.com/content/14/0113/17/15109633_345010019.shtml
狭义的Hadoop包含如下组件:
Hadoop Common
Hadoop Distributed File System(HDFS)
Hadoop YARN
Hadoop MapReduce
编译
Hadoop目前不在Ubuntu的官方软件仓库中,无法使用apt-get安装。使用源代码编译Hadoop的相关步骤,可在源码包的BUILDING.txt中找到。这里仅作为补遗之用。总的来说,如无必要还是直接下载bin包比较好,编译还是很麻烦的。
安装FindBugs
Hadoop的大部分软件依赖,都可以使用apt-get安装。BUILDING.txt里已经写的很详细了。
FindBugs是一个Java代码的静态分析检查工具。它的官网:
http://findbugs.sourceforge.net/index.html
它的安装方法有3种:
1.源代码安装。下载源代码之后,运行ant build
,然后设定相关路径,以供Hadoop使用。
2.apt-get安装。FindBugs目前不在Ubuntu 14.04的软件仓库中,而在Ubuntu 15.10的软件仓库中,需要设置源方可安装。这种方法也需要设定相关路径,以供Hadoop使用。
2.maven安装。
mvn compile findbugs:findbugs
这种方法最简单。安装完成之后的FindBugs位于maven repository中,而后者通常在~/.m2/repository/下。
这种方法的好处是:由于Hadoop使用maven编译,maven安装之后,可以免去设置路径的步骤。但坏处是:其他不用maven的程序,无法使用该软件。
这一步只要不出下载不成功之类的错误,就算成功。错误留给下一步来解决。
PS:maven下载的文件,大约有180MB,且多为小文件,初次运行相当费时。
编译Hadoop
mvn package -Pdist -DskipTests -Dtar
这里一定要-DskipTests
,原因是test不仅速度非常慢,会导致系统响应缓慢,而且即使是官方代码,也不一定能通过所有的test case。
编译的结果在hadoop-dist/target下
安装
Hadoop有Single Node和Cluster两种安装模式。一般的部署,当然采用后者。得益于Java的可移植性,Hadoop甚至可以部署到由Raspberry Pi组成的集群中。
前者主要用于开发和学习之用。这里只讨论前者。
Single Node又可分为两种模式:Standalone和Pseudo-Distributed。前者一般仅用于检验程序逻辑的正确性,因为这种模式下,并没有Hadoop常见的各种节点和HFS的概念,所有的程序都运行在一个Java进程中。而后者在配置和运行方面,与Cluster已经相差无几。
http://www.cnblogs.com/serendipity/archive/2011/08/23/2151031.html
CDH
Cloudera’s Distribution Including Apache Hadoop,简称CDH,是目前用的比较多的Hadoop版本,相比于Apache官方的Hadoop来说,有以下优点:
1.CDH基于稳定版Apache Hadoop,并应用了最新Bug修复或者Feature的Patch。Cloudera常年坚持季度发行Update版本,年度发行Release版本,更新速度比Apache官方快,而且在实际使用过程中,CDH表现无比稳定,并没有引入新的问题。
2.CDH支持Yum/Apt包,Tar包,RPM包,Cloudera Manager四种方式安装,可自动处理软件包之间的依赖和版本匹配的问题。
官网:
www.cloudera.com/downloads/cdh.html
何时使用hadoop fs、hadoop dfs与hdfs dfs命令
hadoop fs:使用面最广,可以操作任何文件系统。
hadoop dfs与hdfs dfs:只能操作HDFS文件系统相关(包括与Local FS间的操作),前者已经Deprecated,一般使用后者。
这些命令的选项大部分与linux shell相同,差异点主要在于:
1.HDFS->Local FS。
hadoop fs -get
1.Local FS->HDFS。
hadoop fs -put
服务端口
Hadoop自带了一些web服务端口,如下表所示:
默认端口 | 设置位置 | 描述信息 |
---|---|---|
8020 | namenode RPC交互端口 | |
8021 | JT RPC交互端口 | |
8080 | Storm UI | |
50030 | mapred.job.tracker.http.address | JOBTRACKER的HTTP服务器和端口 |
50070 | dfs.http.address | NAMENODE的HTTP服务器和端口 |
50010 | dfs.datanode.address | DATANODE控制端口,主要用于DATANODE初始化时,向NAMENODE提出注册和应答请求 |
50020 | dfs.datanode.ipc.address | DATANODE的RPC服务器地址和端口 |
50060 | mapred.task.tracker.http.address | TASKTRACKER的HTTP服务器和端口 |
50075 | dfs.datanode.http.address | DATANODE的HTTP服务器和端口 |
50090 | dfs.secondary.http.address | 辅助DATANODE的HTTP服务器和端口 |
jps
jps是Java提供的虚拟机进程查看工具。
使用方法:
jps -ml
查到的进程,可用如下方法kill:
kill -9 <进程号>
和hadoop有关的进程包括:
名称 | 说明 |
---|---|
QuorumPeerMain | ZooKeeper Daemon |
DataNode | HDFS Data Node |
HRegionServer | Hbase Region Server |
HMaster | Hbase Master |
NodeManager | YARN Node Manager |
ResourceManager | YARN Resource Manager |
nimbus | Storm nimbus |
supervisor | Storm supervisor |
MapReduce编程
教程:
Hbase
官网:
快速开始:
http://hbase.apache.org/book.html#quickstart
启动脚本:
1.HDFS
sbin/start-dfs.sh
2.Hbase
bin/start-hbase.sh
参考:
http://www.cnblogs.com/cenyuhai/
这个blog专注于hadoop、hbase、spark。
http://www.cnblogs.com/nexiyi/p/hbase_shell.html
HBase的常用Shell命令
http://www.cnblogs.com/Dreama/articles/2219190.html
Hadoop+HBase伪分布式安装配置
https://sourceforge.net/projects/haredbhbaseclie/
HareDB HBase Client是一个Hbase的Web GUI客户端,比较好用。
基本概念
HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(column family)。
Row Key | column-family1 | column-family2 | column-family3 | |||
column1 | column2 | column1 | column2 | column3 | column1 | |
key1 | ||||||
key2 | ||||||
key3 |
如上图所示,key1,key2,key3是三条记录的唯一的row key值,column-family1,column-family2,column-family3是三个列族,每个列族下又包括几列。比如,column-family1这个列族下包括两列,名字是column1和column2。
HBase中,将一个Column Family中的列存在一起,而不同Column Family的数据则分开。
不要在一张表里定义太多的column family。目前Hbase并不能很好的处理超过2~3个column family的表。因为某个column family在flush的时候,它邻近的column family也会因关联效应被触发flush,最终导致系统产生更多的I/O。
吐槽一下。既然2~3个column family的表都支持的不好,那么似乎表明column family在现阶段只是一个设计的概念,离实用尚有距离。这样做的用意,大概是期待有一天Hbase把这个特性做好之后,上层应用可以无须修改吧。
HBase架构
HBase在物理上是HDFS上的文件,因此它也是主从结构的。
常用的HBase Shell命令
这些命令可在hbase的控制台输入。进入控制台:
bin/hbase shell
名称 | 命令表达式 |
---|---|
查看当前用户 | whoami |
创建表 | create ‘表名称’, ‘列名称1’,’列名称2’,’列名称N’ |
添加记录 | put ‘表名称’, ‘行名称’, ‘列名称:’, ‘值’ |
查看记录 | get ‘表名称’, ‘行名称’ |
查看表中的记录总数 | count ‘表名称’ |
删除记录 | delete ‘表名’ ,’行名称’ , ‘列名称’ |
删除一张表 | 先要禁用该表,才能对该表进行删除,第一步 disable ‘表名称’ 第二步 drop ‘表名称’ |
查看所有记录 | scan “表名称” |
查看某个表某个列中所有数据 | scan “表名称” , [‘列名称:’] |
更新记录 | 就是重写一遍进行覆盖 |
二级索引
原生态的HBase由于是按列存储的key-value对,原则上只能通过key查询value,因此无法创建主键之外的索引。然而,二级索引在当前的数据应用中,已经相当普遍了。如何解决这一问题呢?
方法一:将需要创建键的若干列的内容放到key中。比如,某数据表需要对日期和地点建索引,则key的值可以写成“2017-北京”这样的形式。
这个方法的缺点在于,放入key中的列相当于是行存储结构,会降低查询效率。设想一下,如果所有列都放到key中,那么实际上这个数据表就退化成了普通的按行存储的关系数据库了。
一般来说,采用方法一的数据表其key中包含的列数不应超过10个。
方法二:外挂二级索引库。目前主要实现的方案有ITHBase,IHBase,CCIndex,华为二级索引和360二级索引等。这些方案的实现细节虽有差异,但原理上都差不多,即:在数据本身之外,创建专门的数据结构用于存放二级索引。
细节可参考:
http://blog.csdn.net/dhtx_wzgl/article/details/49423979
Restful
相比于WebService,Restful是一种简单的多的编程风格。
比如我们使用搜索引擎的时候,输入的地址:
https://www.bing.com/search?q=java+restful
就是一个典型的Restful请求。
有关Restful风格的内容参见:
https://segmentfault.com/a/1190000006735330
http://www.drdobbs.com/web-development/restful-web-services-a-tutorial/240169069
http://www.ibm.com/developerworks/library/ws-restful/index.html
还是那句老话,讨论一个通讯格式或协议,不讨论交互报文的都不是好文章,或者至少不是一个入门的好文章。
常见的Web框架如Spring、Struts都提供了对Restful的支持。
专门负责Restful的框架还有Jersey。其官网:
示例: