導航:首頁 > 程序命令 > hbase建表命令

hbase建表命令

發布時間:2023-01-25 01:36:14

❶ 怎麼創建關於hbase的hive表

1. 啟動hive,並連接到hbase
./hive --auxpath /opt/apache/hive-0.12.0-bin/lib/hive_hbase-handler-
2. 創建內表
CREATE TABLE hive_123(word string, count bigint)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
TBLPROPERTIES ("hbase.table.name" = "hive_123");

執行這條命令後,hive將會在hbase上創建表"hive_123",hive列與hbase列的映射關系為:
word欄位為hbase表的rowkey,count欄位則為cf1:val即column family為cf1,qualifier為val

3. 創建外表
CREATE EXTERNAL TABLE hive_vv(key string, sip string, count int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf0:sip,cf1:count")
TBLPROPERTIES ("hbase.table.name" = "hive_vv");

創建一個hive外表,將名為hive_w的hbase表識別到hive中。

❷ HBase存儲架構

上圖是HBase的存儲架構圖。

由上圖可以知道,客戶端是通過Zookeeper找到HMaster,然後再與具體的Hregionserver進行溝通讀寫數據的。

具體到物理實現,細節包括以下這些:

首先要清楚HBase在hdfs中的存儲路徑,以及各個目錄的作用。在hbase-site.xml 文件中,配置項 <name> hbase.rootdir</name> 默認 「/hbase」,就是hbase在hdfs中的存儲根路徑。以下是hbase0.96版本的個路徑作用。1.0以後的版本請參考這里: https://blog.bcmeng.com/post/hbase-hdfs.html

1、 /hbase/.archive
HBase 在做 Split或者 compact 操作完成之後,會將 HFile 移到.archive 目錄中,然後將之前的 hfile 刪除掉,該目錄由 HMaster 上的一個定時任務定期去清理。

2、 /hbase/.corrupt
存儲HBase損壞的日誌文件,一般都是為空的。

3、 /hbase/.hbck
HBase 運維過程中偶爾會遇到元數據不一致的情況,這時候會用到提供的 hbck 工具去修復,修復過程中會使用該目錄作為臨時過度緩沖。

4、 /hbase/logs
HBase 是支持 WAL(Write Ahead Log) 的,HBase 會在第一次啟動之初會給每一台 RegionServer 在.log 下創建一個目錄,若客戶端如果開啟WAL 模式,會先將數據寫入一份到.log 下,當 RegionServer crash 或者目錄達到一定大小,會開啟 replay 模式,類似 MySQL 的 binlog。

5、 /hbase/oldlogs
當.logs 文件夾中的 HLog 沒用之後會 move 到.oldlogs 中,HMaster 會定期去清理。

6、 /hbase/.snapshot
hbase若開啟了 snapshot 功能之後,對某一個用戶表建立一個 snapshot 之後,snapshot 都存儲在該目錄下,如對表test 做了一個 名為sp_test 的snapshot,就會在/hbase/.snapshot/目錄下創建一個sp_test 文件夾,snapshot 之後的所有寫入都是記錄在這個 snapshot 之上。

7、 /hbase/.tmp
當對表做創建或者刪除操作的時候,會將表move 到該 tmp 目錄下,然後再去做處理操作。

8、 /hbase/hbase.id
它是一個文件,存儲集群唯一的 cluster id 號,是一個 uuid。

9、 /hbase/hbase.version
同樣也是一個文件,存儲集群的版本號,貌似是加密的,看不到,只能通過web-ui 才能正確顯示出來

10、 -ROOT-
該表是一張的HBase表,只是它存儲的是.META.表的信息。通過HFile文件的解析腳本 hbase org.apache.hadoop.hbase.io.hfile.HFile -e -p -f 可以查看其存儲的內容,如下所示:

以上可以看出,-ROOT-表記錄的.META.表的所在機器是dchbase2,與web界面看到的一致:

11、 .META.
通過以上表能找到.META.表的信息,該表也是一張hbase表,通過以上命令,解析其中一個region:

以上可以看出,adt_app_channel表的數據記錄在dchbase3這台reginserver上,也與界面一致,如果有多個region,則會在表名後面加上rowkey的范圍:

通過以上描述,只要找到-ROOT-表的信息,就能根據rowkey找到對應的數據,那-ROOT-在哪裡找呢?從本文一開始的圖中可以知道,就是在zookeeper中找的。進入zookeeper命令行界面:

可以看出-ROOT-表存儲在 dchbase3 機器中,對應界面如下:

以上就是HBase客戶端根據指定的rowkey從zookeeper開始找到對應的數據的過程。

那在Region下HBase是如何存儲數據的呢?

以下就具體操作一張表,查詢對應的HFile文件,看HBase的數據存儲過程。

在HBase創建一張表 test7,並插入一些數據,如下命令:

查看wal日誌,通過 hbase org.apache.hadoop.hbase.regionserver.wal.HLog --mp -p 命令可以解析HLog文件,內容如下:

查看HFile文件,內容如下:

由此可見,HFile文件就是存儲HBase的KV對,其中Key的各個欄位包含了的信息如下:

由於hbase把cf和column都存儲在HFile中,所以在設計的時候,這兩個欄位應該盡量短,以減少存儲空間。

但刪除一條記錄的時候,HBase會怎麼操作呢?執行以下命令:

刪除了rowkey為200的記錄,查看hdfs,原來的HFile並沒有改變,而是生成了一個新的HFile,內容如下:

所以在HBase中,刪除一條記錄並不是修改HFile裡面的內容,而是寫新的文件,待HBase做合並的時候,把這些文件合並成一個HFile,用時間比較新的文件覆蓋舊的文件。HBase這樣做的根本原因是,HDFS不支持修改文件。

❸ HBase創建,刪除,清空數據表

HBase shell窗口進入,執行命令hbase shell

語法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
例如:創建表t1,有兩個family name:f1,f2,且版本數前者為3,後者為1

disable表
drop表

❹ 求助,HBASE不能創建表

hbase shell不能創建表的原因分析。

一.現象:

前一段時間 安裝了Hbase

hbase shell

進去之後 list status 命令都能夠正常運行。
但是執行建表語句 :
create 'aaa','bbb'

的時候 他就一直卡在那不動,也不報任何錯誤, 日誌裡面一直在刷如下的 debug日誌:

DEBUG org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation: Lookep root region location, connection=org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation@23faa614; serverName=
INFO org.apache.hadoop.hbase.master.ServerManager: Waiting on regionserver(s) to checkin

然後我進到 hive裡面 也是可以執行查看語句 但是不能創建表。
狀態就是 只能讀不能寫。

二.解決辦法:

namenode在啟動的時候首先進入安全模式,如果datanode丟失的block達到一定的比例,則系統會一直處於安全模式狀態即只讀狀態。
dfs.safemode.threshold.pct(預設值0.999f)表示HDFS啟動的時候,如果DataNode上報的block個數達到了元數據記錄的block個數的0.999倍才可以離開安全模式,否則一直是這種只讀模式。如果設為1則HDFS永遠是處於SafeMode。

有兩個方法離開這種安全模式
(1)修改dfs.safemode.threshold.pct為一個比較小的值,預設是0.999。
(2)hadoop dfsadmin -safemode leave命令強制離開
用戶可以通過dfsadmin -safemode value 來操作安全模式,參數value的說明如下:
1. enter - 進入安全模式
2. leave - 強制NameNode離開安全模式
3. get - 返回安全模式是否開啟的信息
4. wait - 等待,一直到安全模式結束。

我採取的辦法是 強制離開安全模式。
進入hadoop 的bin目錄,

執行:

hadoop dfsadmin -safemode leave

然後我分別進入 hive 和 hbase

create 就可以 順利的執行了。

❺ 如何使用java API操作Hbase

一般情況下,我們使用Linux的shell命令,就可以非常輕松的操作Hbase,例如一些建表,建列簇,插值,顯示所有表,統計數量等等,但有時為了提高靈活性,我們也需要使用編程語言來操作Hbase,當然Hbase通過Thrift介面提供了對大多數主流編程語言的支持,例如C++,PHP,Python,Ruby等等,那麼本篇,散仙給出的例子是基於Java原生的API操作Hbase,相比其他的一些編程語言,使用Java操作Hbase,會更加高效一些,因為Hbase本身就是使用Java語言編寫的。轉載
下面,散仙給出源碼,以供參考:

package com.hbase;

import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;

/**
* @author
*
* **/
public class Test {

static Configuration conf=null;
static{

conf=HBaseConfiguration.create();//hbase的配置信息
conf.set("hbase.zookeeper.quorum", "10.2.143.5"); //zookeeper的地址

}

public static void main(String[] args)throws Exception {

Test t=new Test();
//t.createTable("temp", new String[]{"name","age"});
//t.insertRow("temp", "2", "age", "myage", "100");
// t.getOneDataByRowKey("temp", "2");
t.showAll("temp");

}

/***
* 創建一張表
* 並指定列簇
* */
public void createTable(String tableName,String cols[])throws Exception{
HBaseAdmin admin=new HBaseAdmin(conf);//客戶端管理工具類
if(admin.tableExists(tableName)){
System.out.println("此表已經存在.......");
}else{
HTableDescriptor table=new HTableDescriptor(tableName);
for(String c:cols){
HColumnDescriptor col=new HColumnDescriptor(c);//列簇名
table.addFamily(col);//添加到此表中
}

admin.createTable(table);//創建一個表
admin.close();
System.out.println("創建表成功!");
}
}

/**
* 添加數據,
* 建議使用批量添加
* @param tableName 表名
* @param row 行號
* @param columnFamily 列簇
* @param column 列
* @param value 具體的值
*
* **/
public void insertRow(String tableName, String row,
String columnFamily, String column, String value) throws Exception {
HTable table = new HTable(conf, tableName);
Put put = new Put(Bytes.toBytes(row));
// 參數出分別:列族、列、值
put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column),
Bytes.toBytes(value));

table.put(put);
table.close();//關閉
System.out.println("插入一條數據成功!");
}

/**
* 刪除一條數據
* @param tableName 表名
* @param row rowkey
* **/
public void deleteByRow(String tableName,String rowkey)throws Exception{
HTable h=new HTable(conf, tableName);
Delete d=new Delete(Bytes.toBytes(rowkey));
h.delete(d);//刪除一條數據
h.close();
}

/**
* 刪除多條數據
* @param tableName 表名
* @param row rowkey
* **/
public void deleteByRow(String tableName,String rowkey[])throws Exception{
HTable h=new HTable(conf, tableName);

List<Delete> list=new ArrayList<Delete>();
for(String k:rowkey){
Delete d=new Delete(Bytes.toBytes(k));
list.add(d);
}
h.delete(list);//刪除
h.close();//釋放資源
}

/**
* 得到一條數據
*
* @param tableName 表名
* @param rowkey 行號
* ***/
public void getOneDataByRowKey(String tableName,String rowkey)throws Exception{
HTable h=new HTable(conf, tableName);

Get g=new Get(Bytes.toBytes(rowkey));
Result r=h.get(g);
for(KeyValue k:r.raw()){

System.out.println("行號: "+Bytes.toStringBinary(k.getRow()));
System.out.println("時間戳: "+k.getTimestamp());
System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily()));
System.out.println("列: "+Bytes.toStringBinary(k.getQualifier()));
//if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){
// System.out.println("值: "+Bytes.toInt(k.getValue()));
//}else{
String ss= Bytes.toString(k.getValue());
System.out.println("值: "+ss);
//}

}
h.close();

}

/**
* 掃描所有數據或特定數據
* @param tableName
* **/
public void showAll(String tableName)throws Exception{

HTable h=new HTable(conf, tableName);

Scan scan=new Scan();
//掃描特定區間
//Scan scan=new Scan(Bytes.toBytes("開始行號"),Bytes.toBytes("結束行號"));
ResultScanner scanner=h.getScanner(scan);
for(Result r:scanner){
System.out.println("==================================");
for(KeyValue k:r.raw()){

System.out.println("行號: "+Bytes.toStringBinary(k.getRow()));
System.out.println("時間戳: "+k.getTimestamp());
System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily()));
System.out.println("列: "+Bytes.toStringBinary(k.getQualifier()));
//if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){
// System.out.println("值: "+Bytes.toInt(k.getValue()));
//}else{
String ss= Bytes.toString(k.getValue());
System.out.println("值: "+ss);
//}

}
}
h.close();

}

}

顯示所有數據的列印輸出如下:

==================================
行號: 1
時間戳: 1385597699287
列簇: name
列: myname
值:
==================================
行號: 2
時間戳: 1385598393306
列簇: age
列: myage
值: 100
行號: 2
時間戳: 1385597723900
列簇: name
列: myname
值:

❻ HBase調優:預分區與行鍵設計

基於此我們可以控制在建表的時候,創建多個空region,並確定每個region的起始和終止rowkey,這樣只要我們的rowkey設計能均勻的命中各個region,就不會存在寫熱點問題。自然split的幾率也會大大降低。當然隨著數據量的不斷增長,該split的還是要進行split。像這樣預先創建hbase表分區的方式,稱之為預分區。

hash(主鍵) + 年月日時(2019062315)
這里只取hash(主鍵)的前6位,使得行鍵的長度正好是16,也就是8的整數倍,在64位計算機中,效果最好。

列族固定,只有一個,設為f,標簽為分鍾加上秒數:
分秒(5623)
如果需要精確到毫秒,可以為列族f設置有多個版本或者將標簽設計為分秒毫秒(5623142)或者分秒.版本號(5623.1)

一個regionserver可以管理的region數量和列族數量與每個列族緩存的大小有關,計算公式如下:

我這里只分了三個region,用hbase shell命令創建表,設置預分區數量為3

下圖中,可以看到,預分區以後,數據的讀寫訪問請求數量均勻分布在3台RegionServer上,避免了熱點問題。

❼ hbase 數據遷移

hbase snapshot數據遷移問題
不需要提前建表,分區也會自動同步
HBase自身也提供了ExportSnapshot的方法可以從HDFS文件層基於某個快照快速的導出HBase的數據,並不會對RegionServer造成影響,但該源生的方法不支持增量
1、在源集群執行
snapshot 'src_table', 'snapshot_src_table'
snapshot的流程主要有三個步驟
加鎖: 加鎖對象是regionserver的memstore,目的是禁止在創建snapshot過程中對數據進行insert,update,delete操作
刷盤:刷盤是針對當前還在memstore中的數據刷到HDFS上,保證快照數據相對完整,此步也不是強制的,如果不刷會,快照中數據有不一致風險
創建指針: snapshot過程不拷貝數據,但會創建對HDFS文件的指針,snapshot中存儲的就是這些指針元數據

2、在源集群執行,屬於推送方式,在目標集群執行數據拉取方式
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot test_snap --from hdfs://HDFS80386/hbase --to hdfs://shyt-hadoop-4031.xx.com.cn:8020/apps/hbase/data -mappers 20 -bandwidth 5

3、在目標集群執行使用hbase用戶
disable 'dalishen:bbs_member'
restore_snapshot 'bbs_member_snap'
使用restore命令在目標集群自動新建表,以及與archive里的HFile建立link
執行該步驟的時候,可能會遇到許可權問題,需要賦許可權
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=hbase, access=WRITE, inode="/apps/hbase/data/archive/data/dalishen/bbs_member//f/.links-":hadoop:hdfs:drwxr-xr-x
源集群
groups hadoop hdfs 可以發現導入的是源集群的許可權
所以需要賦許可權
hdfs dfs -chmod -R 777 /apps/hbase/data/archive/data/dalishen/bbs_member/
enable 'dalishen:bbs_member'

不需要提前建表,分區也會自動同步,支持增量備份,需要指定要備份的時間范圍
Table也是屬於HBase數據遷移的工具之一,以表級別進行數據遷移。Table的本質也是利用MapRece進行同步的,與DistCp不同的時,它是利用MR去scan 原表的數據,然後把scan出來的數據寫入到目標集群的表。這種方式也有很多局限,如一個表數據量達到T級,同時又在讀寫的情況下,全量scan表無疑會對集群性能造成影響。
1.3->1.1 高到低版本 不需要提前建表,分區也會自動同步
檢查是否開啟同步
echo "list_replicated_tables" | hbase shell -n |grep dalishen:app_deviceid
沒有的話執行
enable_table_replication 'tname'
1.源集群hadoop查詢數據量,如太大先別遷移超過5000w
hbase org.apache.hadoop.hbase.maprece.RowCounter 'dalishen:app_deviceid'
2.源集群上執行 替換表名
hbase org.apache.hadoop.hbase.maprece.CopyTable -Dhbase.client.scanner.caching=1000 -Dmapred.map.tasks.speculative.execution=false -D maprece.task.timeout=6000000 --families=f:f --peer.adr=10.52.24.42:2181:/hbase-unsecure --new.name=dalishen:app_deviceid dalishen:app_deviceid
3.目標集群上執行數據量對比下
hbase org.apache.hadoop.hbase.maprece.RowCounter 'dalishen:app_deviceid'
4.指定時間戳進行增量同步
hbase org.apache.hadoop.hbase.maprece.CopyTable -Dhbase.client.scanner.caching=1000 -Dmapred.map.tasks.speculative.execution=false -D maprece.task.timeout=6000000 --starttime=1600792683760 --endtime=1600792684760 --families=f:f --peer.adr=172.18.12.7:2181:/hbase --new.name=testwang testwang

在源集群進入hbase shell
1、 add_peer '1', 'shyt-hadoop-4032.xxx.com.cn,shyt-hadoop-4031.xxx.com.cn,shyt-hadoop-4030.xxx.com.cn:2181:/hbase-unsecure'
2、修改REPLICATION_SCOPE屬性=1,全局模式,此數據會被復制給所有peer
alter 'testwang',{NAME => 'f' ,REPLICATION_SCOPE => '1'}
3、hbase(main):006:0> enable_table_replication 'testwang'
0 row(s) in 0.0860 seconds
The replication swith of table 'testwang' successfully enabled
驗證在源集群 put 'testwang','1005','f:name','1005'
在目標集群 get 'testwang','1005'
校驗數據量:通count
hbase org.apache.hadoop.hbase.maprece.RowCounter 'testwang'
查看同步狀態: status 'replication'

建議大表先進行snapshot方式同步,然後再利用進行增量數據同步,小表直接 table數據遷移,最後配置hbase replication peer實時同步

❽ hbase輸入出現了星號

兩個單引號 當命令行出現星號的時候使用
hbase shell
進入hbase
ctrl+backspace
退格
ddl
dml
list
help
查看所有命令
create 『probe_log』,『info』
創建表,表名+列族名,該名稱任意
describe 『probe_log』
查看錶信息 表名
create_namespace 『probe_log』
新建命名空間create
create 『probe_log:user_event_v2』,『info』
在命名空間下新建表

❾ Hbase0.9裝到Linux7.6不建表

Hbase0.9裝到Linux7.6不建表處理。
啟動HBase沒有問題,但是使用bin,hbaseshell命令轉換到shell下時,使用比如命令,list,create,table,col等等都會出錯,雖然看到了log文檔裡面的提示,但是由於是剛開始接觸HBase,所以還是不知道如何下手。
還是上網找各種資源,最後看到官方文檔上面說,如果系統是Ubuntu的話,要注意/etc/hosts裡面的127.0.0.1是否是127.0.1.1,如果是的話,把他改過來就可以了,雖然網上大家的版本各種各樣,但是如果真的要學的話,還是官網上面的資料齊全點。

閱讀全文

與hbase建表命令相關的資料

熱點內容
能否給隱藏相冊加密 瀏覽:596
糖心app改什麼名 瀏覽:823
戰地1控伺服器如何部署 瀏覽:394
xp還原系統輸入命令 瀏覽:323
mysql命令行版本 瀏覽:303
如何進入itunes找文件夾 瀏覽:832
CAD中重復命令使用 瀏覽:477
心智pdf 瀏覽:475
網站電台直播間源碼 瀏覽:852
文件夾14c和18c的區別 瀏覽:34
android隱式調用 瀏覽:667
plc的編程指令邊沿繼電器 瀏覽:723
voc文件夾 瀏覽:865
租廣東聯通伺服器注意什麼雲空間 瀏覽:934
javascript高級程序設計pdf 瀏覽:292
pwm單片機原理 瀏覽:348
ai演算法在線修復圖片 瀏覽:982
scratch編程中如何做射擊游戲 瀏覽:479
at89c51編程器 瀏覽:344
項目經理叫醒程序員 瀏覽:344