hbase編程
⑴ 基於HBase的推薦系統的背景
摘要 支撐OLAP應用中的各
⑵ hbase是什麼工具
將數據導入HBase中有如下幾種方式:使用HBase的API中的Put方法使用HBase 的bulk load 工具使用定製的MapRece Job方式 使用HBase的API中的Put是最直接的方法,用法也很容易學習。但針對大部分情況,它並非都是最高效的方式。當需要將海量數據在規定時間內載入HBase中時,效率問題體現得尤為明顯。待處理的數據量一般都是巨大的,這也許是為何我們選擇了HBase而不是其他資料庫的原因。在項目開始之前,你就該思考如何將所有能夠很好的將數據轉移進HBase,否則之後可能面臨嚴重的性能問題。 HBase有一個名為 bulk load的功能支持將海量數據高效地裝載入HBase中。Bulk load是通過一個MapRece Job來實現的,通過Job直接生成一個HBase的內部HFile格式文件來形成一個特殊的HBase數據表,然後直接將數據文件載入到運行的集群中。使用bulk load功能最簡單的方式就是使用importtsv 工具。importtsv 是從TSV文件直接載入內容至HBase的一個內置工具。它通過運行一個MapRece Job,將數據從TSV文件中直接寫入HBase的表或者寫入一個HBase的自有格式數據文件。盡管importtsv 工具在需要將文本數據導入HBase的時候十分有用,但是有一些情況,比如導入其他格式的數據,你會希望使用編程來生成數據,而MapRece是處理海量數據最有效的方式。這可能也是HBase中載入海量數據唯一最可行的方法了。當然我們可以使用MapRece向HBase導入數據,但海量的數據集會使得MapRece Job也變得很繁重。若處理不當,則可能使得MapRece的job運行時的吞吐量很小。在HBase中數據合並是一項頻繁執行寫操作任務,除非我們能夠生成HBase的內部數據文件,並且直接載入。這樣盡管HBase的寫入速度一直很快,但是若合並過程沒有合適的配置,也有可能造成寫操作時常被阻塞。寫操作很重的任務可能引起的另一個問題就是將數據寫入了相同的族群伺服器(region server),這種情況常出現在將海量數據導入到一個新建的HBase中。一旦數據集中在相同的伺服器,整個集群就變得不平衡,並且寫速度會顯著的降低。我們將會在本文中致力於解決這些問題。我們將從一個簡單的任務開始,使用API中的Put方法將MySQL中的數據導入HBase。接著我們會描述如何使用 importtsv 和 bulk load將TSV數據文件導入HBase。我們也會有一個MapRece樣例展示如何使用其他數據文件格式來導入數據。上述方式都包括將數據直接寫入HBase中,以及在HDFS中直接寫入HFile類型文件。本文中最後一節解釋在向HBase導入數據之前如何構建好集群。本文代碼均是以java編寫,我們假設您具有基本Java知識,所以我們將略過如何編譯與打包文中的Java示例代碼,但我們會在示例源碼中進行注釋。
⑶ hbase的特點
hbase的特點:高可靠性、高性能、面向列、可伸縮的。
HBase – Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集群。
HBase是Apache的Hadoop項目的子項目。HBase不同於一般的關系資料庫,它是一個適合於非結構化數據存儲的資料庫。另一個不同的是HBase基於列的而不是基於行的模式。
(3)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表數據,適合做數據統計。
⑷ Hadoop HBASE shell編程中 所有指令提示提示無效參數
你在while[xxx]之前將while中括弧內的東西(xxx)列印一下看就明白了:
echo xxx
可能原因是其中有參數帶有特殊字元,如」[」、「]「等,你可以這樣引用參數:
while [ ${var} = ${var2} ]
do
...
如果還可能有空串的話,這樣萬無一失:
while [ 」X${var}「 = "X${var2}" ]
do
...
X是隨便拼上去的一個字元,目的就是保證你那個串不會是空的
⑸ 如何使用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的對外的API提供介面,是非常簡單易用的。
⑹ hbase實戰 hbase權威指南哪本好書
《HBase原理與實踐》、《HBase實戰》、《HBase權威指南》、《HBase企業應用開發實戰》、《HBase入門與實踐》。以上書籍都是與hbase相關的專業性書籍,作者由淺入深地介紹了hbase的技術與應用。
5、《HBase入門與實踐》:全書共分為3個部分。前兩個部分分別介紹了分布式系統和大規模數據處理的發展歷史;第三部分通過真實的應用和代碼示例以及支持這些實踐技巧的理論知識,進一步探索HBase的一些實用技術。