Hadoop, Hbase
https://antkillerfarm.github.io/
Hadoop
最近(2016.4),參加公司組織的內(nèi)部培訓(xùn),對(duì)Hadoop有了一些認(rèn)識(shí),特記錄如下。
概述
Hadoop項(xiàng)目由Doug Cutting創(chuàng)建。Doug Cutting也是Lucene項(xiàng)目的創(chuàng)建者。
PS:Lucene是我2007年學(xué)習(xí)搜索引擎技術(shù)時(shí),所接觸到的開(kāi)源項(xiàng)目。回想起來(lái),簡(jiǎn)直恍如隔世啊。
官網(wǎng):
http://hadoop.apache.org/
官方文檔:
http://hadoop.apache.org/docs/current/
廣義的Hadoop包含一個(gè)龐大的生態(tài)圈:
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的官方軟件倉(cāng)庫(kù)中,無(wú)法使用apt-get安裝。使用源代碼編譯Hadoop的相關(guān)步驟,可在源碼包的BUILDING.txt中找到。這里僅作為補(bǔ)遺之用。總的來(lái)說(shuō),如無(wú)必要還是直接下載bin包比較好,編譯還是很麻煩的。
安裝FindBugs
Hadoop的大部分軟件依賴,都可以使用apt-get安裝。BUILDING.txt里已經(jīng)寫(xiě)的很詳細(xì)了。
FindBugs是一個(gè)Java代碼的靜態(tài)分析檢查工具。它的官網(wǎng):
http://findbugs.sourceforge.net/index.html
它的安裝方法有3種:
1.源代碼安裝。下載源代碼之后,運(yùn)行ant build,然后設(shè)定相關(guān)路徑,以供Hadoop使用。
2.apt-get安裝。FindBugs目前不在Ubuntu 14.04的軟件倉(cāng)庫(kù)中,而在Ubuntu 15.10的軟件倉(cāng)庫(kù)中,需要設(shè)置源方可安裝。這種方法也需要設(shè)定相關(guān)路徑,以供Hadoop使用。
2.maven安裝。
mvn compile findbugs:findbugs
這種方法最簡(jiǎn)單。安裝完成之后的FindBugs位于maven repository中,而后者通常在~/.m2/repository/下。
這種方法的好處是:由于Hadoop使用maven編譯,maven安裝之后,可以免去設(shè)置路徑的步驟。但壞處是:其他不用maven的程序,無(wú)法使用該軟件。
這一步只要不出下載不成功之類的錯(cuò)誤,就算成功。錯(cuò)誤留給下一步來(lái)解決。
PS:maven下載的文件,大約有180MB,且多為小文件,初次運(yùn)行相當(dāng)費(fèi)時(shí)。
編譯Hadoop
mvn package -Pdist -DskipTests -Dtar
這里一定要-DskipTests,原因是test不僅速度非常慢,會(huì)導(dǎo)致系統(tǒng)響應(yīng)緩慢,而且即使是官方代碼,也不一定能通過(guò)所有的test case。
編譯的結(jié)果在hadoop-dist/target下
安裝
Hadoop有Single Node和Cluster兩種安裝模式。一般的部署,當(dāng)然采用后者。得益于Java的可移植性,Hadoop甚至可以部署到由Raspberry Pi組成的集群中。
前者主要用于開(kāi)發(fā)和學(xué)習(xí)之用。這里只討論前者。
Single Node又可分為兩種模式:Standalone和Pseudo-Distributed。前者一般僅用于檢驗(yàn)程序邏輯的正確性,因?yàn)檫@種模式下,并沒(méi)有Hadoop常見(jiàn)的各種節(jié)點(diǎn)和HFS的概念,所有的程序都運(yùn)行在一個(gè)Java進(jìn)程中。而后者在配置和運(yùn)行方面,與Cluster已經(jīng)相差無(wú)幾。
http://www.cnblogs.com/serendipity/archive/2011/08/23/2151031.html
CDH
Cloudera’s Distribution Including Apache Hadoop,簡(jiǎn)稱CDH,是目前用的比較多的Hadoop版本,相比于Apache官方的Hadoop來(lái)說(shuō),有以下優(yōu)點(diǎn):
1.CDH基于穩(wěn)定版Apache Hadoop,并應(yīng)用了最新Bug修復(fù)或者Feature的Patch。Cloudera常年堅(jiān)持季度發(fā)行Update版本,年度發(fā)行Release版本,更新速度比Apache官方快,而且在實(shí)際使用過(guò)程中,CDH表現(xiàn)無(wú)比穩(wěn)定,并沒(méi)有引入新的問(wèn)題。
2.CDH支持Yum/Apt包,Tar包,RPM包,Cloudera Manager四種方式安裝,可自動(dòng)處理軟件包之間的依賴和版本匹配的問(wèn)題。
官網(wǎng):
www.cloudera.com/downloads/cdh.html
何時(shí)使用hadoop fs、hadoop dfs與hdfs dfs命令
hadoop fs:使用面最廣,可以操作任何文件系統(tǒng)。
hadoop dfs與hdfs dfs:只能操作HDFS文件系統(tǒng)相關(guān)(包括與Local FS間的操作),前者已經(jīng)Deprecated,一般使用后者。
這些命令的選項(xiàng)大部分與linux shell相同,差異點(diǎn)主要在于:
1.HDFS->Local FS。
hadoop fs -get
1.Local FS->HDFS。
hadoop fs -put
服務(wù)端口
Hadoop自帶了一些web服務(wù)端口,如下表所示:
| 8020 | namenode RPC交互端口 | |
| 8021 | JT RPC交互端口 | |
| 8080 | Storm UI | |
| 50030 | mapred.job.tracker.http.address | JOBTRACKER的HTTP服務(wù)器和端口 |
| 50070 | dfs.http.address | NAMENODE的HTTP服務(wù)器和端口 |
| 50010 | dfs.datanode.address | DATANODE控制端口,主要用于DATANODE初始化時(shí),向NAMENODE提出注冊(cè)和應(yīng)答請(qǐng)求 |
| 50020 | dfs.datanode.ipc.address | DATANODE的RPC服務(wù)器地址和端口 |
| 50060 | mapred.task.tracker.http.address | TASKTRACKER的HTTP服務(wù)器和端口 |
| 50075 | dfs.datanode.http.address | DATANODE的HTTP服務(wù)器和端口 |
| 50090 | dfs.secondary.http.address | 輔助DATANODE的HTTP服務(wù)器和端口 |
jps
jps是Java提供的虛擬機(jī)進(jìn)程查看工具。
使用方法:
jps -ml
查到的進(jìn)程,可用如下方法kill:
kill -9 <進(jìn)程號(hào)>
和hadoop有關(guān)的進(jìn)程包括:
| 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編程
教程:
http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html
Hbase
官網(wǎng):
http://hbase.apache.org/
快速開(kāi)始:
http://hbase.apache.org/book.html#quickstart
啟動(dòng)腳本:
1.HDFS
sbin/start-dfs.sh
2.Hbase
bin/start-hbase.sh
參考:
http://www.cnblogs.com/cenyuhai/
這個(gè)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是一個(gè)Hbase的Web GUI客戶端,比較好用。
基本概念
HBase以表的形式存儲(chǔ)數(shù)據(jù)。表有行和列組成。列劃分為若干個(gè)列族/列簇(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是三個(gè)列族,每個(gè)列族下又包括幾列。比如,column-family1這個(gè)列族下包括兩列,名字是column1和column2。
HBase中,將一個(gè)Column Family中的列存在一起,而不同Column Family的數(shù)據(jù)則分開(kāi)。
不要在一張表里定義太多的column family。目前Hbase并不能很好的處理超過(guò)2~3個(gè)column family的表。因?yàn)槟硞€(gè)column family在flush的時(shí)候,它鄰近的column family也會(huì)因關(guān)聯(lián)效應(yīng)被觸發(fā)flush,最終導(dǎo)致系統(tǒng)產(chǎn)生更多的I/O。
吐槽一下。既然2~3個(gè)column family的表都支持的不好,那么似乎表明column family在現(xiàn)階段只是一個(gè)設(shè)計(jì)的概念,離實(shí)用尚有距離。這樣做的用意,大概是期待有一天Hbase把這個(gè)特性做好之后,上層應(yīng)用可以無(wú)須修改吧。
HBase架構(gòu)
HBase在物理上是HDFS上的文件,因此它也是主從結(jié)構(gòu)的。
常用的HBase Shell命令
這些命令可在hbase的控制臺(tái)輸入。進(jìn)入控制臺(tái):
bin/hbase shell
| 查看當(dāng)前用戶 | whoami |
| 創(chuàng)建表 | create ‘表名稱’, ‘列名稱1’,’列名稱2’,’列名稱N’ |
| 添加記錄 | put ‘表名稱’, ‘行名稱’, ‘列名稱:’, ‘值’ |
| 查看記錄 | get ‘表名稱’, ‘行名稱’ |
| 查看表中的記錄總數(shù) | count ‘表名稱’ |
| 刪除記錄 | delete ‘表名’ ,’行名稱’ , ‘列名稱’ |
| 刪除一張表 | 先要禁用該表,才能對(duì)該表進(jìn)行刪除,第一步 disable ‘表名稱’ 第二步 drop ‘表名稱’ |
| 查看所有記錄 | scan “表名稱” |
| 查看某個(gè)表某個(gè)列中所有數(shù)據(jù) | scan “表名稱” , [‘列名稱:’] |
| 更新記錄 | 就是重寫(xiě)一遍進(jìn)行覆蓋 |
二級(jí)索引
原生態(tài)的HBase由于是按列存儲(chǔ)的key-value對(duì),原則上只能通過(guò)key查詢value,因此無(wú)法創(chuàng)建主鍵之外的索引。然而,二級(jí)索引在當(dāng)前的數(shù)據(jù)應(yīng)用中,已經(jīng)相當(dāng)普遍了。如何解決這一問(wèn)題呢?
方法一:將需要?jiǎng)?chuàng)建鍵的若干列的內(nèi)容放到key中。比如,某數(shù)據(jù)表需要對(duì)日期和地點(diǎn)建索引,則key的值可以寫(xiě)成“2017-北京”這樣的形式。
這個(gè)方法的缺點(diǎn)在于,放入key中的列相當(dāng)于是行存儲(chǔ)結(jié)構(gòu),會(huì)降低查詢效率。設(shè)想一下,如果所有列都放到key中,那么實(shí)際上這個(gè)數(shù)據(jù)表就退化成了普通的按行存儲(chǔ)的關(guān)系數(shù)據(jù)庫(kù)了。
一般來(lái)說(shuō),采用方法一的數(shù)據(jù)表其key中包含的列數(shù)不應(yīng)超過(guò)10個(gè)。
方法二:外掛二級(jí)索引庫(kù)。目前主要實(shí)現(xiàn)的方案有ITHBase,IHBase,CCIndex,華為二級(jí)索引和360二級(jí)索引等。這些方案的實(shí)現(xiàn)細(xì)節(jié)雖有差異,但原理上都差不多,即:在數(shù)據(jù)本身之外,創(chuàng)建專門(mén)的數(shù)據(jù)結(jié)構(gòu)用于存放二級(jí)索引。
細(xì)節(jié)可參考:
http://blog.csdn.net/dhtx_wzgl/article/details/49423979
Restful
相比于WebService,Restful是一種簡(jiǎn)單的多的編程風(fēng)格。
比如我們使用搜索引擎的時(shí)候,輸入的地址:
https://www.bing.com/search?q=java+restful
就是一個(gè)典型的Restful請(qǐng)求。
有關(guān)Restful風(fēng)格的內(nèi)容參見(jiàn):
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
還是那句老話,討論一個(gè)通訊格式或協(xié)議,不討論交互報(bào)文的都不是好文章,或者至少不是一個(gè)入門(mén)的好文章。
常見(jiàn)的Web框架如Spring、Struts都提供了對(duì)Restful的支持。
專門(mén)負(fù)責(zé)Restful的框架還有Jersey。其官網(wǎng):
https://jersey.java.net/
示例:
https://github.com/feuyeux/jax-rs2-guide-II
總結(jié)
以上是生活随笔為你收集整理的Hadoop, Hbase的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习(二)——深度学习常用术语解释,
- 下一篇: 云计算论文集, Spark, 数据描述语