編譯hbase
Ⅰ 操作HBase報錯: Could not initialize class org.apache.hadoop.hbase.protobuf.ProtobufUtil
在 hbase-site.xm l中冊鍵卜, 如下配置是錯誤的, 要與 hdfs-site.xml 中 dfs.internal.nameservices 配置對應, 注釋中的是正確的.
dataFrame中有些字亮族段為州穗null.
更改shc的源碼, 重新編譯打包.
Ⅱ 求助,關於hbase的versions問題
在apache上下載的hbase,梁則默認的編譯版本是根據hadoop-1.0.3的。
需要用其他版本的hadoop的,要對hbase進行重告答新編譯。
編譯並不難,但是第一次,還是出了很多很多狀況。
PS:HBase版本:hbase-0.94.1
hadoop版本 2.0.1
1,下載maven。(hbase是用maven編譯的,hadoop用ant)
2,hbase的pom.xml裡面襪渣慧hadoop 2.0用的是2.0.0-alpha,編輯pom.xml,
把<hadoop.version>2.0.0-alpha</hadoop.version>
改成: <hadoop.version>2.0.0-alpha</hadoop.version>。
3,到hbase-0.94.1的安裝目錄下,執行如下語句:
Shell代碼
${MAVEN_HOME}/bin/mvn -e -Dmaven.test.skip.exec=true -Dhadoop.profile=2.0 package
然後就是等待了,大概講下各個參數的含義:
-e 編譯時列印出詳細錯誤信息
-Dmaven.test.skip.exec=true 編譯時跳過測試步驟
-Dhadoop.profile=2.0 編譯時使用hadoop.profile 2.0,也就是針對2.0的hadoop編譯。
4,然後就是到target路徑下找hbase-0.94.1.tar.gz的包,用這個包部署。
Ⅲ Win7上編譯驅動,明明設置好了WLHBASE和W7BASE,卻還是不能編譯
這個是由於兼容性不好造成渣首的。 解決辦法:如燃數
1、更換電腦的操作系統為XP,在XP環境下編寫。
2、直接使用win7系統編寫針對於win7系統的程序,這個是發展趨勢。
3、更段廳換軟體利用其他第三方軟體進行編程製作。
Ⅳ hbase的特點
hbase的特點:高可靠性、高性能、面向列、可伸縮的。
HBase – Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集群。
HBase是Apache的Hadoop項目的子項目。HBase不同於一般的關系資料庫,它是一個適合於非結構化數據存儲的資料庫。另一個不同的是HBase基於列的而不是基於行的模式。
(4)編譯hbase擴展閱讀
訪問介面:
1. Native java API,最常規和高效的訪問方式,適合Hadoop MapRece Job並行批處理HBase表數據
2. HBase Shell,HBase的命令行工具,最簡單的介面,適合HBase管理使用
3. Thrift Gateway,利用Thrift序列化技術,支持C++,PHP,Python等多種語言,適合其他異構系統在線訪問HBase表數據
4. REST Gateway,支持REST 風格的Http API訪問HBase, 解除了語言限制
5. Pig,可以使用Pig Latin流式編程語言來操作HBase中的數據,和Hive類似,本質最終也是編譯成MapRece Job來處理HBase表數據,適合做數據統計。
Ⅳ 請舉個例子說明hbase的概念視圖和物理視圖的不同
聯系:視圖(view)是在基本表之上建立的表,它的結構(即所定義的列)和內容(即所有數據行)都來自基本表,它依據基本表存在而存在。一個視圖可以對應一個基本表,也可以對應多個基本表。視圖是基本表的抽象和在邏雹基輯意義上建立的新關系
區別:1、視圖是已經編譯好的sql語句。而表不是
2、視圖沒有實際的物理記錄。而表有。
3、表是內容,視圖是窗口
4、表只用物理空間而視圖不佔用物理空間,視圖只是邏輯概念的存在,表可以及時四對它進行修改,但視圖只能有創建的語句來修改
5、表是內模式,視圖是外模式
6、視圖是查看數據表的一種方法,可以查詢數據表中某些欄位構成的數據,只是一些SQL語句的集合。從安全的角度說,視圖可以不給用戶接觸數據表,從而不知道表結構。
7、表屬於全局模式中的表,扮旦是實表;視圖屬於局部模式的表,是虛表。
8、視圖的建立和刪除隻影響視圖本身,不影響廳肆擾對應的基本表。
Ⅵ SparkSQL同步Hbase數據到Hive表
spark 2.3.0
hive 3.0.0
hbase 2.0.0
常規操作 hbase數據同步到hive是螞搭通過再hive端建立hbase的映射表。
但是由於集群組件問題,建立的棗物笑映射表不能進行
insert into A select * from hbase映射表
操作。報錯!
org.apache.hadoop.hbase.client.RetriesExhaustedException: Can't get the location for replica 0
at org.apache.hadoop.hbase.client..getRegionLocations(.java:332)
spark讀取hbase數據形成RDD,構建schma信息,形成DF
通過sparkSQL 將df數據寫入到指定的hive表格中。
hadoop本地環境版本一定要與依賴包版本保持一直,不然報如下錯誤
java.lang.IllegalArgumentException: Unrecognized Hadoop major version number: 3.1.1
hbase 1.X與2.X有很大差距,所以再看案例參考是一定要結合自己的hbase版本。
筆者程序編譯中遇到
Cannot Resolve symbol TableInputFormat HBase找不到TableInputFormat
因為:新版本2.1.X版本的HBASE又把maprece.TableInputFormat單獨抽取出來了
需要導入依賴
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-maprece</artifactId>
<version>${hbase.version}</version>
</dependency>
一定要把hbase相關凳含的包都cp 到spark的jars文件下面。然後重啟spark服務。
不然你會遇到此類錯誤
Class org.apache.hadoop.hive.hbase.HBaseSerDe not found
或者
java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
這些都是缺少jar包的表現。
Ⅶ 坑爹的Apache hbase 64位機裝配Snappy終於成功了怎麼解決
1.安裝基本tool
yum install gcc c++, autoconf, automake, libtool, Java 6, JAVA_HOME set, Maven 3,svn
yum Error: Cannot retrieve repository metadata (repomd.xml) for repository: xxxxx
so vim /etc/yum.repos.d/xxxxx.repo
將項[flexbox]中的enabled=1改為enabled=0
解決yum源的問題。
2.安裝Snappy
下載snappy
wget http://snappy.googlecode.com/files/snappy-1.1.1.tar.gz
然後解壓後,執行三步驟:
./configure
make
sudo make install
默認安裝路徑:/usr/local/lib下面
檢查安裝是否成功
ls /usr/local/lib/libsn*
3.安裝hadoop-snappy
3.1下載hadoop-snappy源碼
svn checkout http://hadoop-snappy.googlecode.com/svn/trunk/ hadoop-snappy
3.2.安裝hadoop-snappy
cd hadoop-snappy
mvn package
4.hadooo中部署snappy
解壓hadoop-snappy-0.0.1-SNAPSHOT.tar.gz文件,會生成hadoop-snappy-0.0.1-SNAPSHOT目錄,拷貝這個目錄下相關文件到$HADOOP_HOME/lib/native/Linux-amd64-64
cp -r /hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64/* $HADOOP_HOME/lib/native/Linux-amd64-64
將target目錄下的hadoop-snappy-0.0.1-SNAPSHOT.jar拷貝到$HADOOP_HOME/lib/目錄下。
修改三個文件:
hadoop-env.sh,增加內容如下裂大:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
修改core-site.xml文件,增加紅色字體部分
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec,
org.apache.hadoop.io.compress.SnappyCodec
</value>
</property>
5.往HBase中使用壓縮方式
當hadoop的snappy配置成功後,配置hbase就很簡單了,兩個步驟:
第一步驟復制相關jar包
cp -r $HADOOP_HOME/lib/native/Linux-amd64-64/* $HBASE_HOME/lib/native/Linux-amd64-64/*
這里需要注意下,有些版本在安瞎源明裝過程中,沒有這個Linux-amd64-64這個目錄,需要手磨告工創建下。
第二步驟配置hbase-env.sh環境變數
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
export HBASE_LIBRARY_PATH=$HBASE_LIBRARY_PATH:$HBASE_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
6、重啟Hadoop、HBase 檢查安裝是否成功
cd $HBASE_HOME/bin
./hbase org.apache.hadoop.hbase.util.CompressionTest /tmp/testfile snappy
結果:Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
坑爹的Apache官網提供的是32位編譯的,在64位伺服器上會有問題。官方竟然沒有提供64位版本,要使用得自己編譯。
7.編譯hadoop2.2.0
7.1 yum install cmake zlib1g-dev pkg-config libssl-dev
7.2 安裝protobuf-2.5.0
很多博客的protobuf的安裝都是shit.不知道他們實踐過沒有,老是來去。
下載protobuf-2.5.0.tar.gz,解壓。
sudo vim /etc/profile
#protobuf
export PROTOC_HOME=/opt/protobuf-2.5.0
export PATH=$PATH:$PROTOC_HOME/src
source /etc/profile
$protoc --version
libprotoc.2.5.0
ok就這樣。根本不需要什麼configure --prefix,make,make install這么麻煩,也不成功。
7.3 下載hadoop2.2.0源碼
Download Hadoop sources.
Patch sources:
cd hadoop-2.2.0-src
wget https://issues.apache.org/jira/secure/attachment/12614482/HADOOP-10110.patch
patch -p0 < HADOOP-10110.patch
maven國外伺服器可能連不上,maven配置一下國內鏡像,在maven目錄下,conf/settings.xml,在<mirrors></mirros>里添加,原本的不要動
<mirror>
<id>nexus-osc</id>
<mirrorOf>*</mirrorOf>
<name>Nexusosc</name>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>
同樣,在<profiles></profiles>內新添加
<profile>
<id>jdk-1.7</id>
<activation>
<jdk>1.4</jdk>
</activation>
<repositories>
<repository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
7.4 編譯mvn package -Pdist,native -DskipTests -Dtar -rf :hadoop-common
編譯完成了後,cd hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0
file 一下native下面的so文件
將 native/*再cp 到$hadoop_home/bin的各個data node的native/* 和native/Linux-amd64-64下。
重新運行測試,結果
Ⅷ HBase 的一個報錯 hadoop zk hbase 都正常啟動
Clent.HConnectionManager$HConnectionImplementation:Check the value with configured in 'zookeeper.znode.parent'. There could be a mismatch with the one configured in the master.
直觀來看,自己去查看zookeeper.znode.parent的配置是否正確。在Hbase/conf/core-site.xml中自己配置的zookeeper.znode.parent使用的是默認選項/hbase,應該沒有什麼問題。於是自己又查看了Hadoop與Zookeeper相關的配置文件,結果這幾個方面都沒有問題。自己陷入了迷茫。
自己一籌莫展之際,想起了Hbase下的logs目錄,查看了其輸出的日誌信息,發現了細節問題:
Could not start ZK at requested port of 2181. ZK was started at port:2182. Aborting as clients(e.g. shell) will not be able to find this ZK quorum.
看樣子是有個進程佔用了默認的2181埠導致ZK不能正常啟動。所以自己使用lsof -i:2181命令查看2181埠的進程情況:發現是Hadoop用戶的java進程在使用。於是自己果斷kill掉,接著在Hbase shell中敲入list命令,結果是一系列的java編譯錯誤。自己考慮也許是Hbase需要重新啟動,於是重新啟動Hbase shell後程序正常!
重新啟動系統之後也沒有再次提示類似的問題鉛搏則。但是奇銀兆怪的是之前安裝Hbase時遇到過這樣的問題,自己當時曾經解決了,但是隨著使用問題又出現了。自己猜測應該是Hbase中有保存有埠使用的配置,第一次正確使用後一段時間槐棚內不需要更正,但是後來因為其他程序的安裝導致配置文件發生了更改。
Ⅸ 如何搭建Hbase源碼閱讀環境,並能進行編譯運行
hbase源碼導入eclipse分三步:
1.svn下載源碼
2.mvn package -Dmaven.test.skip.exec=true編譯源碼
3.導入eclipse,可以用插件,用mvn eclipse:eclipse生成eclipse文件,導入eclipse。
Ⅹ HBase探索篇 _ 單節點多RegionServer部署與性能測試
[toc]
隨著集群中總的Region數持續增長,每個節點平均管理的Region數已達550左右,某些大表的寫入流量一上來,Region Server就會不堪重負,相繼掛掉。
在HBase中,Region的一個列族對應一個MemStore,通常一個MemStore的默認大小為128MB(我們設置的為256MB),見參數 hbase.hregion.memstore.flush.size 。當可用內存足夠時,每個MemStore可以分配128MB的空間。
當表的寫入流量上升時,假設每個Region的寫入壓力相同,則理論上每個MemStore會平均分配可用的內存空間。
因此,節點中Region過多時,每個MemStore分到的蠢棗內存空間就會變小。此時,寫入很小的數據量,就會被強制flush到磁碟,進而導致頻繁刷寫,會對集群HBase與HDFS造成很大的壓力。
同時,Region過多導致的頻繁刷寫帶頌拆,又會在磁碟上產生非常多的HFile小文件,當小文件過多的時候,HBase為了優化查詢性能就會做Compaction操作,合並HFile,減少文件數量。當小文件一直很多的時候,就會出現 「壓縮風暴」。Compaction非常消耗系統的IO資源,還會降低數據的寫入速度,嚴重時會影響正常業務的進行。
關於每個Region Server節點中,Region數量大致合理的范圍,HBase官網上也給出了定義:
可見,通常情況下,每個節點擁有20-200個Region是比較正常的。
其實,每個Region Server的最大Region數量由總的MemStore內存大小決定。每個Region的每個列族會對應一個MemStore,假設HBase表都有一個列族,那麼每個Region只包含一個櫻彎MemStore。一個MemStore大小通常在128~256MB,見參數: hbase.hregion.memstore.flush.size 。默認情況下,RegionServer會將自身堆內存的40%(我們線上60%)(見參數: hbase.regionserver.global.memstore.size )提供給節點上的所有MemStore使用,如果所有MemStore的總大小達到該配置大小,新的更新將會被阻塞並且會強制刷寫磁碟。因此,每個節點最理想的Region數量應該由以下公式計算(假設HBase表都有統一的列族配置):
((RS memory) * (total memstore fraction)) / ((memstore size)*(column families))
其中:
以我們線上集群的配置舉例,我們每個RegionServer的堆內存是32GB,那麼節點上最理想的Region數量應該是: 32768*0.6/256 ≈ 76 (32768*0.6/128 ≈ 153)
上述最理想的情況是假設每個Region上的填充率都一樣,包括數據寫入的頻次、寫入數據的大小,但實際上每個Region的負載各不相同,有的Region可能特別活躍、負載特別高,有的Region則比較空閑。所以,通常我們認為2 3倍的理想Region數量也是比較合理的,針對上面舉例來說,大概200 300個Region左右算是合理的。
針對上文所述的Region數過多的隱患,以下內容主要從兩方面考慮來優化。
提高內存的目的是為了增加每個Region擁有的MemStore的空間,避免其寫入壓力上升時,MemStore頻繁刷寫,形成小的HFile過多,引起壓縮風暴,佔用大量IO。
但其實RS的堆內存並不是越大越好,我們開始使用HBase的時候,對CMS和G1相關的參數,進行了大量壓測,測試指標數據表明,內存分配的越大,吞吐量和p99讀寫平均延時會有一定程度的變差(也有可能是我們的JVM相關參數,當時調配的不合理)。
在我們為集群集成jdk15,設置為ZGC之後,多次壓測並分析JVM日誌之後,得出結論,在犧牲一定吞吐量的基礎上,集群的GC表現能力確實提升的較為明顯,尤其是GC的平均停頓時間,99.9%能維持在10ms以下。
而且ZGC號稱管理上T的大內存,停頓時間控制在10ms之內(JDK16把GC停頓時間控制在1ms內,期待JDK17 LTS),STW時間不會因為堆的變大而變長。
因此理論上,增加RS堆內存之後,GC一樣不會成為瓶頸。
之所以考慮在單節點上部署多個Region Server的進程,是因為我們單個物理機的資源配置很高,內存充足(三百多G,RS堆內存只分了32G)、而HBase又是弱計算類型的服務,平時CPU的利用率低的可憐,網路方面亦未見瓶頸,唯一掉鏈子的也就屬磁碟了,未上SSD,IO延遲較為嚴重。
當然,也曾考慮過虛擬機的方案,但之前YCSB壓測的數據都不太理想;K8s的調研又是起步都不算,沒有技術積累。因此,簡單、直接、易操作的方案就是多RS部署了。
以下內容先敘述CDH中多RS進程部署的一些關鍵流程,後續將在多RS、單RS、單RS大堆環境中,對集群進行基準性能測試,並對比試驗數據,分析上述兩種優化方案的優劣。
我們使用的HBase版本是 2.1.0-cdh6.3.2 ,非商業版,未上Kerberos,CDH中HBase相關的jar包已替換為用JDK15編譯的jar。
多Region Server的部署比較簡單,最關鍵的是修改 hbase-site.xml 中region server的相關埠,避免埠沖突即可。可操作流程如下。
修改所需配置文件
hbase-site.xml 配置文件一定不要直接從 /etc/hbase/conf 中獲取,這里的配置文件是給客戶端用的。CDH管理的HBase,配置文件都是運行時載入的,所以,找到HBase最新啟動時創建的進程相關的目錄,即可獲取到服務端最新的配置文件,如:/var/run/cloudera-scm-agent/process/5347-hbase-REGIONSERVER。需要准備的目錄結構如下:
不需要HBase完整安裝包中的內容(在自編譯的完整安裝包中運行RS進程時,依賴沖突或其他莫名其妙的報錯會折磨的你抓狂),只需要bin、conf目錄即可,pids文件夾是自定義的,RS進程對應pid文件的輸出目錄,start_rs.sh、stop_rs.sh是自定義的RS進程的啟動和關閉腳本。
重點修改下圖標注的配置文件,
還有日誌文件名的一些輸出細節,可以按需在 bin/hbase-daemon.sh 中修改。
運行或關閉RS進程
中間有異常,請查看相關日誌輸出。
集群Region數瘋漲,當寫入存在壓力時,會導致RS節點異常退出。為了解決目前的這種窘境,本次優化主要從單節點多Region Server部署和提高單個Region Server節點的堆內存兩方面著手。
那這兩種優化方案對HBase的讀寫性能指標,又會產生什麼樣的影響呢?我們以YCSB基準測試的結果指標數據做為參考,大致評價下這兩種應急方案的優劣。
用於此次測試的HBase集群的配置
此次測試使用的數據集大小
測試方法
壓測時選擇的讀寫負載盡量模擬線上的讀寫場景,分別為:讀寫3/7、讀寫7/3、讀寫5/5;
壓測時唯一的變數條件是:多RS部署(32G堆,在每個節點上啟動3個RS進程,相當於集群中一共有15個RS節點)、單RS部署(32G小堆)和單RS部署(100G大堆),並盡可能保證其他實驗條件不變,每個YCSB的工作負載各自運行20分鍾左右,並且重復完整地運行5次,兩次運行之間沒有重新啟動,以測量YCSB的吞吐量等指標,收集的測試結果數據是5次運行中最後3次運行的平均值,為了避免第一輪和第二輪的偶然性,忽略了前兩次的測試。
YCSB壓測的命令是:
收集實驗數據後,大致得出不同讀寫負載場景下、各個實驗條件下的指標數據,如下圖。
上述的測試數據比較粗糙,但大致也能得出些結論,提供一定程度上的參考。
多RS進程部署的模式,起到了一定程度上的進程間資源隔離的作用,分擔了原先單台RS管理Region的壓力,最大化利用了物理機的資源,但多出來的一些Region Server,需要單獨的管理腳本和監控系統來維護,增加了維護成本。多個RS依賴同一台物理機,物理節點宕機便會影響多個RS進程,同時,某一個Region Server出現熱點,壓力過大,資源消耗過度,也許會引起同機其他進程的不良,在一定程度上,犧牲了穩定性和可靠性。
增加單個RS進程的堆內存,MemStore在一定程度上會被分配更充裕的內存空間,減小了flush的頻次,勢必會削弱寫入的壓力,但也可能會增加GC的負擔,我們或許需要調整出合適的GC參數,甚至需要調優HBase本身的一些核心參數,才能兼顧穩定和性能。然而,這就又是一件漫長而繁瑣的事情了,在此不過分探討。
面對性能瓶頸的出現,我們不能盲目地擴充機器,在應急方案採取之後,我們需要做一些額外的、大量的優化工作,這或許才是上上之策。