目錄
項目場景:
數(shù)據(jù)遷移方案
hbase和hadoop相關(guān)命令
方案介紹
DistCp分布式拷貝方案實施
遷移過程中遇到的一些問題
1.我在原集群先拷貝協(xié)處理器到目標新節(jié)點過程中出現(xiàn)了如下的情況,hdfs的map任務(wù)一直處于卡住狀態(tài),通過頁面前兩行看到hadoop集群沒有資源, 有3個節(jié)點處于不健康的狀態(tài)
2. 因為準備的目標新節(jié)點磁盤遠小于原集群,所以需要先將原集群數(shù)據(jù)進行合并
major合并(大合并)
大合并自動執(zhí)行:默認7天來一次hbase.hregion.majorcompaction?默認7天
3.?HDFS問題,Operation category READ is not supported in state standby
4.?Call to localhost/127.0.0.1:16020 failed on connection exception: org.apache.hbase.thirdparty.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:1602
項目場景:
項目場景:目前項目使用了4臺機器搭建了hbase集群及hadoop集群,目前需要進行降配,將hbase集群降配置單節(jié)點進行使用(雖然基本沒有項目這么使用hbase的情況,還有諸多不合理的地方,此篇文章不予討論)此篇只用于記錄hbase的數(shù)據(jù)如何進行數(shù)據(jù)跨集群遷移案例。
數(shù)據(jù)遷移方案
1.為了降低遷移的復雜度,我所準備的hbase單節(jié)點服務(wù)器上所安裝的hbase和hadoop與原集群中的版本選擇為一致的
2.hbase的數(shù)據(jù)遷移方案主要有四類,Hadoop層有一類,HBase層有三類。我選用的是通過hadoop這層進行數(shù)據(jù)遷移通過hadoop的分布式拷貝將數(shù)據(jù)遷移至目標機器
hbase和hadoop相關(guān)命令
介紹方案之前先記錄一些hbase的常用命令
// 進入hbase
/[hbasePath]/bin/hbase shell
// 或者在hbase的安裝目錄執(zhí)行
bin/hbase shell
// 查看hbase中的所有表
hbase(main):002:0> list
// HBASE中查詢表的列族信息,表結(jié)構(gòu)
hbase(main):002:0> describe '[tableName]'
// 創(chuàng)建命名空間及創(chuàng)建表
hbase(main):002:0> create_namespace 'test'
hbase(main):002:0> create '[tableName]', '[columnName]'
// 創(chuàng)建hbase_goods表 并有一個info列 并通過key1,key2,key3對表進行分區(qū)
hbase(main):002:0> create 'hub:hbase_goods', 'info', SPLITS => ['key1', 'key2', 'key3']
// 創(chuàng)建hbase_goods表有info和supper兩個列,切兩個列最大版本都為1,壓縮方式都為GZ
hbase(main):002:0> create 'hub:hbase_goods', {NAME => 'info', VERSIONS => 1, COMPRESSION => 'GZ'}, {NAME => 'supper', VERSIONS => 1, COMPRESSION => 'GZ'}, SPLITS => ['key1', 'key2', 'key3']
// 禁用表
hbase(main):002:0> disable 'hub:hbase_goods'
// 啟用表
hbase(main):005:0> enable 'hub:hbase_goods'
// 刪除表
hbase(main):002:0> drop 'hub:hbase_goods'
// 查看表中數(shù)據(jù)
// 從row3到最后
hbase(main):002:0> scan '[tableName]',{STARTROW=>'row3'}
// 從row3到row4
hbase(main):002:0> scan '[tableName]',{STARTROW=>'row3',ENDROW=>'row4'}
// 從開始一直到row2
hbase(main):002:0> scan '[tableName]',{ENDROW=>'row2'}
// 查詢meta表元數(shù)據(jù) 信息
hbase(main):002:0> scan 'hbase:meta',{FILTER=>"PrefixFilter('hub:hbase_goods_img,') "}
// 修改表的定義
// 修改表中列族的壓縮方式
hbase(main):002:0> alter 'hub:hbase_goods', {NAME => 'info', COMPRESSION => 'GZ'}, {NAME => 'supper', COMPRESSION => 'GZ'}
// 設(shè)置hbase協(xié)處理器
// 表級別設(shè)置協(xié)處理器
hbase(main):001:0> alter 'table_name', METHOD => 'table_att', 'coprocessor'=>'hdfs://path/to/coprocessor.jar|com.example.MyCoprocessor|1001|arg1=foo,arg2=bar'
// 列族級別設(shè)置協(xié)處理器
hbase(main):002:0> alter 'table_name', {NAME=>'column_family', METHOD => 'table_att', 'coprocessor'=>'hdfs://path/to/coprocessor.jar|com.example.MyCoprocessor|1001|arg1=foo,arg2=bar'}
/** table_name是HBase表的名稱,column_family是列族的名稱,hdfs://path/to/coprocessor.jar是
協(xié)處理器代碼的路徑,com.example.MyCoprocessor是協(xié)處理器類的完全限定名,1001是協(xié)處理器優(yōu)先級,
arg1=foo,arg2=bar是傳遞給協(xié)處理器的參數(shù)。*/
// hbase 自帶mapreduce 導出; 后面的地址為文件在hadoop中hdfs中的地址
/[hbasePath]bin/hbase org.apache.hadoop.hbase.mapreduce.Driver export test:hbase_demo /hbase/data/bak
// hbase 自帶mapreduce 導入數(shù)據(jù)到hbase表中; 后面的地址為文件在hadoop中hdfs中的地址
/[hbasePath]bin/hbase org.apache.hadoop.hbase.mapreduce.Driver import test:hbase_demo /hbase/data/test
hbase中可以自行創(chuàng)建命名空間
hadoop常用命令
-- hadoop distcp命令用于將源HDFS集群中的table_name表的數(shù)據(jù)復制到目標HDFS集群中的相同位置。
-- hdfs://src-hadoop-address:9000 是源HDFS集群的地址,包括主機名和端口號。
-- hdfs://dst-hadoop-address:9000 是目標HDFS集群的地址,包括主機名和端口號。
-- table_name 是要復制的表的路徑。
hadoop distcp hdfs://src-hadoop-address:9000/table_name hdfs://dst-hadoop-address:9000/table_name
-- 查看hdfs下文件夾目錄
hdfs dfs -ls /hbase/data/test
-- 刪除hdfs中的文件或文件夾數(shù)據(jù)
hdfs dfs -rm /hbase/data/tmp/xxxx
hdfs dfs -rm -r /hbase/data/tmp
-- 查看hdfs中的文件
hdfs dfs -cat /hbase/data/tmp/xxxx
-- 將hdfs中的文件復制到linux本機
hadoop fs -get <HDFS文件路徑> <本地文件路徑>
hadoop fs -get /hbase/data/tmp/hbase_demo /usr/local/share/hadoop-2.8.5
-- 將本機文件上傳到HDFS
hadoop fs -put <本地文件路徑> <目標HDFS路徑>
hadoop fs -put /usr/local/share/file.txt /hbase/data/tmp/hbase_demo
-- 查看磁盤使用情況
hadoop dfsadmin -report
-- 查看當前 HDFS 節(jié)點是備用(Standby)還是活動(Active)
hdfs haadmin -getServiceState <nameserviceId>
-- -Dhbase.mapreduce.hfileoutputformat.skip.timestamp.maxvalue=true 用于在導入數(shù)據(jù)到 HBase 表時,只導入最新版本的數(shù)據(jù),而跳過舊版本的數(shù)據(jù)。(似乎沒用--大家可以自行嘗試)
-- 參數(shù)-Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily, 這個表示在bulkload過程中,每個region列族的HFile數(shù)的上限,這里我們是限定了1024,也可以指定更少,根據(jù)實際需求來定。
-- bulk load 加載hdfs中 Hfiles的文件 這種方式適用于大量數(shù)據(jù)情況下
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024 -Dhbase.mapreduce.hfileoutputformat.skip.timestamp.maxvalue=true hdfs://dst-hadoop-address:9000/hbase/data/tmp/8bb6022f45be3f5cb41e7cb972befbf6/ table_name
上面提到的 hdfs的 <nameserviceId> 可以在 /[hadoopHomePath]/etc/hadoop/hdfs-site.xml文件中查看到
方案介紹
Hadoop層的數(shù)據(jù)遷移主要用到DistCp(Distributed Copy), 官方描述是:DistCp(分布式拷貝)是用于大規(guī)模集群內(nèi)部和集群之間拷貝的工具。 它使用Map/Reduce實現(xiàn)文件分發(fā),錯誤處理和恢復,以及報告生成。 它把文件和目錄的列表作為map任務(wù)的輸入,每個任務(wù)會完成源列表中部分文件的拷貝。
我們知道MR程序適合用來處理大批量數(shù)據(jù), 其拷貝本質(zhì)過程是啟動一個MR作業(yè),不過DisctCp只有map,沒有reducer。在拷貝時,由于要保證文件塊的有序性,轉(zhuǎn)換的最小粒度是一個文件,而不像其它MR作業(yè)一樣可以把文件拆分成多個塊啟動多個map并行處理。如果同時要拷貝多個文件,DisctCp會將文件分配給多個map,每個文件單獨一個map任務(wù)。我們可以在執(zhí)行同步時指定-m
參數(shù)來設(shè)定要跑的map數(shù)量,默認設(shè)置是20。如果是集群間的數(shù)據(jù)同步,還需要考慮帶寬問題,所以在跑任務(wù)時還需要設(shè)定?bandwitdh
?參數(shù),以防止一次同步過多的文件造成帶寬過高影響其它業(yè)務(wù)。同時,由于我們HBase集群一般是不會開MR調(diào)度的,所以這里還需要用到單獨的MR集群來作主備數(shù)據(jù)同步,即在跑任務(wù)時還需要指定mapreduce相關(guān)參數(shù)。
簡單的distcp參數(shù)形式如下:
hadoop distcp hdfs://src-hadoop-address:9000/table_name hdfs://dst-hadoop-address:9000/hbase/data/table_name
需要注意的是將源集群表在hdfs中的文件復制到目標hdfs中時需要先放到臨時目錄 例如 hdfs://dst-hadoop-address:9000/hbase/data/tmp 因為數(shù)據(jù)過來后還需要進行blukload才能加載到表中,bulkload會自動在hdfs中創(chuàng)建hbase表所對應(yīng)的文件夾
DistCp分布式拷貝方案實施
遷移方法如下:
第一步, 需要先停止所遷移表的寫入
第二步, flush表,在進入hbase客戶端后執(zhí)行
hbase(main):002:0> flush 'test'
第三步,執(zhí)行如下帶MR參數(shù)的命令? 將原表儲存在hdfs中文件拷貝到新節(jié)點的hdfs中臨時目錄中
-- -bandwidth 20 設(shè)置帶寬為20m/s
-- -m 20 設(shè)置map任務(wù)數(shù)為20
-- 使用過程中將hdfs地址更換為自己的hdfs原地址和目標地址
hadoop distcp -p -bandwidth 20 -m 20 hdfs://worker1:9000/hbase/data/hub/hbase_goods hdfs://10.10.xx.xx:xxxx/hbase/data/tmp/
-- 如果你的hbase集群定義了協(xié)處理器 也需要在這一步一同拷貝到目標新節(jié)點。
-- 協(xié)處理器是一個jar包,可運行的代碼,不是需要bulkload的表數(shù)據(jù),所以可以放在原集群相同目錄下
hadoop distcp -p -bandwidth 20 -m 20 hdfs://worker1:9000/usr/local/share/lib/20220903 hdfs://10.10.xx.xx:xxxx/usr/local/share/lib/20220903
第四步, 在目標新節(jié)點hbase中創(chuàng)建與原集群表結(jié)構(gòu)相同的表,并定義其協(xié)處理器
表的配置我們也可以在hbase master節(jié)點的管理頁面上查看到http://xx.xx.xx.xx:16010/master-status?16010端口是hbase master web UI的接口,可以訪問查看hbase相關(guān)的配置
-- 根據(jù)自己表的情況將表的結(jié)構(gòu)也需要遷移,同樣還有表的分區(qū)定義需要一并遷移
-- SPLITS的值為原集群表每個分區(qū)的end key
create 'hub:hbase_goods', {NAME => 'info', VERSIONS => 1, COMPRESSION => 'GZ'}, {NAME => 'supper', VERSIONS => 1, COMPRESSION => 'GZ'}, SPLITS => ['017988830001000101', '035910140001000101', '053902900001000101', '071915240001000101', '089786800000000101', '106632260001000101', '12191295', '137182210001000101', '152492650001000101', '167816050001000101', '183158250001000101', '198506540001000101', '216367450001000101', '234506330001000101', '252583730001000101', '270651040001000101', '287454250001000101', '303705050001000101', '318042450001000101', '332374640001000101', '346747950001000101', '361100050001000101', '375432230001000101', '389765840001000101', '405877840001000101', '423536440001000101', '441153940001000101', '458808859660010101', '476355830001000101', '493919640001000101', '509856840001000101', '524966320001000101', '539065220001000101', '553109230001000101', '567149350001000101', '581179610001000101', '595354550001000101', '610951940001000101', '627392340001000101', '643818250001000101','660288810001000101', '676749440001000101', '693162010001000101', '708249840001000101', '722387230001000101', '736495650001000101','750634410001000101', '764770900001000101', '778687160001000101', '792548830001000101', '807490840001000101', '823587250001000101', '839753110000000101', '855937930001000101', '872066650001000101', '888146840001000101', '903586550001000101', '917301550001000101', '931063260001000101', '94480694', '958576140001000101', '9723531', '986199950001000101']
-- 設(shè)置表的協(xié)處理器
hbase(main):001:0> alter 'hub:hbase_goods', METHOD => 'table_att', 'coprocessor$1' => 'hdfs:///usr/local/share/lib/20220903/observer-goods.jar|com.spider.yn.observer.HBaseDataSyncEsObserver|1001|indexName=hbase_goods,indexType=goods'
第五步,?在目標新節(jié)點上bulkload數(shù)據(jù)
對于我們來說,因我們先把文件同步到了臨時目錄,并不在原表目錄,所以我們采用的另一種形式的load,即以region的維度來Load數(shù)據(jù)到線上表,怎么做呢,這里用到的是org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles這個類,即以bulkload的形式來load數(shù)據(jù)。上面同步時我們將文件同步到了目的集群的/tmp/region-hdfs-path目錄,那么我們在Load時,可以用如下命令來Load region文件:
這里需要一個分區(qū)文件執(zhí)行一次
-- 參數(shù)-Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily, 這個表示在bulkload過程中,每個region列族的HFile數(shù)的上限,這里我們是限定了1024,也可以指定更少,根據(jù)實際需求來定。
-- -Dhbase.mapreduce.hfileoutputformat.skip.timestamp.maxvalue=true 用于在導入數(shù)據(jù)到 HBase 表時,只導入最新版本的數(shù)據(jù),而跳過舊版本的數(shù)據(jù)。(似乎沒用--大家可以自行嘗試)
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024 -Dhbase.mapreduce.hfileoutputformat.skip.timestamp.maxvalue=true hdfs://xx.xx.xx.xx:xxxx/hbase/data/tmp/06d4ad1c27100961a9df292bab55388b/ hub:hbase_goods
第六步,?檢查表數(shù)據(jù)是否OK,看bulkload過程是否有報錯;可以通過hbase的count命令對原集群表和目標新節(jié)點load后的表進行計數(shù)對比是否一致
遷移過程中遇到的一些問題
原集群的是3個節(jié)點的磁盤均為1T大小,目標新集群的磁盤只有300GB;所以我們需要先把原集群數(shù)據(jù)合并之后才能進行遷移。
1.我在原集群先拷貝協(xié)處理器到目標新節(jié)點過程中出現(xiàn)了如下的情況,hdfs的map任務(wù)一直處于卡住狀態(tài),通過頁面前兩行看到hadoop集群沒有資源, 有3個節(jié)點處于不健康的狀態(tài)
http://xx.xx.xx.xx:8088/? 是hadoop的集群節(jié)點活動面板 webUI (上圖就是此地址頁面)
http://xx.xx.xx.xx:50070/?Web UI地址,用于訪問Hadoop集群中的NameNode服務(wù)。
http://xx.xx.xx.xx:8088/通過查看nodemanager日志分析得出,是由于磁盤資源的使用超過了90%導致,這個閾值可以在yarn的配置文件中進行修改
處理方式:我的處理方式比較粗暴 直接刪除了一些數(shù)據(jù)讓閾值降低到90%以下我再原集群進行其他操作
Hadoop集群nodes unhealthy解決方法-CSDN博客? 也可參考此文章
2. 因為準備的目標新節(jié)點磁盤遠小于原集群,所以需要先將原集群數(shù)據(jù)進行合并
-- 關(guān)閉region
balance_switch false
-- 合并某個表
major_compact 't1'
-- 合并表中某個列族
-- major_compact 'r1', 'c1'
-- major_compact 't1', 'c1'
-- 開啟region
balance_switch true
此過程非常消耗磁盤讀寫性能,內(nèi)存及占用帶寬,所以需要慎操作; 由于我在操作之前并沒有檢查原集群是否給每個表設(shè)置COMPRESSION屬性的值(也就是壓縮方式)直接進行了大合并,整個高占用過程持續(xù)了3個小時,且磁盤占用并未減少。
處理方式:給原集群每個表設(shè)置COMPRESSION => GZ 的壓縮方式再次進行大合并,合并后數(shù)據(jù)只有100GB,目標新節(jié)點磁盤300GB可以滿足
major合并(大合并)
HBase的大合并,不是輕量化的操作,有很大的I/O消耗
所謂的大合并,就是將一個Region下的所有StoreFile合并成一個StoreFile文件,在大合并的過程中,之前刪除的行和過期的版本都會被刪除,拆分的母Region的數(shù)據(jù)也會遷移到拆分后的子Region上。大合并一般一周做一次,控制參數(shù)為hbase.hregion.majorcompaction。大合并的影響一般比較大,盡量避免統(tǒng)一時間多個Region進行合并,因此Hbase通過一些參數(shù)來進行控制,用于防止多個Region同時進行大合并。該參數(shù)為:hbase.hregion.majorcompaction.jitter 具體算法為:
hbase.hregion.majorcompaction參數(shù)的值乘于一個隨機分數(shù),這個隨機分數(shù)不能超過hbase.hregion.majorcompaction.jitter的值。hbase.hregion.majorcompaction.jitter的值默認為0.5。 通過hbase.hregion.majorcompaction參數(shù)的值加上或減去hbase.hregion.majorcompaction參數(shù)的值乘于一個隨機分數(shù)的值就確定下一次大合并的時間區(qū)間。
用戶如果想禁用major compaction,只需要將參數(shù)hbase.hregion.majorcompaction設(shè)為0。建議禁用。
大合并自動執(zhí)行:默認7天來一次
hbase.hregion.majorcompaction
?默認7天
3.?HDFS問題,Operation category READ is not supported in state standby
在使用distcp進行拷貝時出現(xiàn)日錯誤,這是由于我在原集群的hdfs的備用節(jié)點進行的操作 ,備用節(jié)點是不支持讀取操作的
于是使用如下命令進行查看當前節(jié)點狀態(tài)確實為 standby節(jié)點
hdfs haadmin -getServiceState <nameserviceId>
查看hdfs-site.xml文件中對應(yīng)的namenode(也就是上文nameserviceId)有哪些節(jié)點,所登錄的機器確實在standby狀態(tài)的節(jié)點下,于是更換在active節(jié)點下的機器進行操作
4.?Call to localhost/127.0.0.1:16020 failed on connection exception: org.apache.hbase.thirdparty.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:1602
數(shù)據(jù)拷貝且bulkload后更換代碼中Hbase相關(guān)的配置進行測試 發(fā)現(xiàn)報錯此錯誤;當在訪問regionservice的時候,默認是localhost/127.0.0.1:16020文章來源:http://www.zghlxwxcb.cn/news/detail-760954.html
處理方式:修改linux服務(wù)器的名稱映射,及需要使用hbase的服務(wù)所部署的linux機器也需要進行名稱映射處理文章來源地址http://www.zghlxwxcb.cn/news/detail-760954.html
-- 修改服務(wù)器名稱及 映射
--1.配置hadoop服務(wù)器的hostname
vi /etc/sysconfig/network
****************** 文件內(nèi)容******************
NETWORKING=yes
HOSTNAME=hadoop1 // 設(shè)置服務(wù)器名稱
****************** 文件內(nèi)容******************
-- 執(zhí)行以下命令以使主機名更改立即生效
hostnamectl set-hostname new_hostname
--2.配置hostname文件
vi /etc/hostname
****************** 文件內(nèi)容******************
hadoop1 // 設(shè)置服務(wù)器名稱
****************** 文件內(nèi)容******************
--3.配置hosts文件
vi /etc/hosts
****************** 文件內(nèi)容******************
xx.xx.xx.xx hadoop1
****************** 文件內(nèi)容******************
-- 執(zhí)行以下命令以刷新 DNS 緩存,使新的主機名配置生效(否則需要重啟)
systemctl restart network
--4. 重啟habse
[hbasehome]/bin/stop-hbase.sh
[hbasehome]/bin/start-hbase.sh
--5. 需用到hbase 的服務(wù)所在的機器 也需要設(shè)置hosts文件
vi /etc/hosts
****************** 文件內(nèi)容******************
xx.xx.xx.xx hadoop1 // 需要訪問的hbase的地址及名稱
****************** 文件內(nèi)容******************
到了這里,關(guān)于記錄「 Hbase的數(shù)據(jù)遷移與bulkload流程與實踐」的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!