Hadoop, Hbase
https://antkillerfarm.github.io/
Hadoop
最近(2016.4),參加公司組織的內部培訓,對Hadoop有了一些認識,特記錄如下。
概述
Hadoop項目由Doug Cutting創建。Doug Cutting也是Lucene項目的創建者。
PS:Lucene是我2007年學習搜索引擎技術時,所接觸到的開源項目。回想起來,簡直恍如隔世啊。
官網:
http://hadoop.apache.org/
官方文檔:
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編程
教程:
http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html
Hbase
官網:
http://hbase.apache.org/
快速開始:
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。其官網:
https://jersey.java.net/
示例:
https://github.com/feuyeux/jax-rs2-guide-II
總結
以上是生活随笔為你收集整理的Hadoop, Hbase的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习(二)——深度学习常用术语解释,
- 下一篇: 云计算论文集, Spark, 数据描述语