MapReduce實驗:HBase與Hive
2014.4.21 nlq NJUCS
1.1.6.HBase在eclipse IDE下java編程:...5
1.HBase
1.1.單機環境下僞分佈式HBase安裝與操作示例
1.1.1.下載安裝
環境:windows虛擬機virtualbox下ubuntu 12.04 LTS
下載鏈接:https://hbase.apache.org/
解壓文件:在原來hadoop目錄下tar –zxvf hbase-0.94.18.tar.gz得到文件夾hbase-0.94.18
1.1.2.配置環境變量
sudo gedit /etc/profile:
說明:$PATH表示前面已配置好的PATH,冒號“:”表示並列關係。
之後執行source /etc/profile,更新path。
在shell中執行echo $PATH測試:
1.1.3.HBase配置文件
進入HBase目錄,拷貝hbase的模板到conf下
Cp –f $HBASE_HOME/src/packages/conf-pseudo/hbase-site.xml$HBASE_HOME/conf
之後sudo gedit conf/hbase-site.xml,配置如下:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
<description>The mode the cluster will be in. Possible values are
false: standalone and pseudo-distributed setups with managed Zookeeper
true: fully-distributed with unmanaged Zookeeper Quorum (see hbase-env.sh)
</description>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
<description>Property from ZooKeeper's config zoo.cfg.
The port at which the clients will connect.
</description>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
<description>The replication count for HLog and HFile storage.Should not be greater than HDFS datanode count.
</description>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
<description>Comma separated list of servers in the ZooKeeperQuorum.
For example,"host1.mydomain.com,host2.mydomain.com,host3.mydomain.com".
By default this is set to localhost for local and pseudo-distributedmodes
of operation. For a fully-distributed setup, this should be set to afull
list of ZooKeeper quorum servers. If HBASE_MANAGES_ZK is set inhbase-env.sh
this is the list of servers which we will start/stop ZooKeeper on.
</description>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/hadoop/hbase-0.94.18/zookeeperData</value>
<description>Property from ZooKeeper's config zoo.cfg.
The directory where the snapshot is stored.
</description>
</property>
</configuration>
說明:紅色部分需要注意!其中:
hdfs://localhost:9000/hbase表示數據存儲在之前安裝好的hdfs中,通過hdfs web UI就可以查看得到。
僞分佈式或者分佈式下爲true,單機爲false。
自己定義一個路徑,目的還沒搞清。
保存好退出。
Sudogedit conf/hbase-env.sh,根據自己的JDK目錄修改JAVA_HOME,並且手動添加下面一行,表示使用hbase自帶的zookeeper。
1.1.4.啓動HBase
首先保證啓動hadoop,用jps檢測:
在hbase目錄下執行bin/start-hbase.sh,用JPS檢測:
也可以在web輸入localhost:60010檢測hbase:
到此,說明hbase單機下僞分佈式安裝成功且啓動成功。
1.1.5.HBase簡單shell操作
在hbase目錄下執行bin/hbase shell,進入shell:
命令list列舉當下所有的表,命令create創建表:
命令put插入數據:
命令scan ‘table name’查看錶中數據:
1.1.6.HBase在eclipse IDE下java編程:
首先創建工程hadoopTest,導入所有的jar,在hbase目錄下以及lib下都有:
創建測試hbase類testHbase,代碼複製如下,只爲簡單測試:
packagehbaseExample;
importjava.io.IOException;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.hbase.HBaseConfiguration;
importorg.apache.hadoop.hbase.HColumnDescriptor;
importorg.apache.hadoop.hbase.HTableDescriptor;
importorg.apache.hadoop.hbase.KeyValue;
importorg.apache.hadoop.hbase.MasterNotRunningException;
importorg.apache.hadoop.hbase.ZooKeeperConnectionException;
importorg.apache.hadoop.hbase.client.Delete;
importorg.apache.hadoop.hbase.client.HBaseAdmin;
importorg.apache.hadoop.hbase.client.HTable;
importorg.apache.hadoop.hbase.client.Put;
importorg.apache.hadoop.hbase.client.Result;
importorg.apache.hadoop.hbase.client.ResultScanner;
importorg.apache.hadoop.hbase.client.Scan;
importorg.apache.hadoop.hbase.util.Bytes;
importcom.google.common.collect.Table.Cell;
/*
2014.4.22
@niuliqiangNJUCS
*/
publicclass testHbase {
//配置
public Configuration HBASE_CONFIG = newConfiguration();
public HBaseConfiguration cfg;
//即將創建的表名
public String createTableName ="testTable";
//刪除的表名
public String deleteTableName ="testTable";
//初始化函數
@SuppressWarnings("deprecation")
public void init(){
HBASE_CONFIG = newConfiguration();
cfg = newHBaseConfiguration(HBASE_CONFIG);
}
//創建表
public void createTable(){
try {
HBaseAdmin hAdmin =new HBaseAdmin(cfg);
//表名
HTableDescriptor t =new HTableDescriptor(createTableName);
//列族,列名
t.addFamily(newHColumnDescriptor("c1"));
t.addFamily(new HColumnDescriptor("c2"));
t.addFamily(newHColumnDescriptor("c3"));
hAdmin.createTable(t);
hAdmin.close();
} catch(MasterNotRunningException e) {
e.printStackTrace();
} catch(ZooKeeperConnectionException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//刪除表
public void deleteTable(){
try {
HBaseAdmin hAdmin =new HBaseAdmin(cfg);
if(hAdmin.tableExists(deleteTableName)){
hAdmin.disableTable(deleteTableName);
hAdmin.deleteTable(deleteTableName);
}
hAdmin.close();
} catch(MasterNotRunningException e) {
// TODOAuto-generated catch block
e.printStackTrace();
} catch(ZooKeeperConnectionException e) {
// TODOAuto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
//添加一行記錄
public void addOne(){
try {
HBaseAdmin hAdmin =new HBaseAdmin(cfg);
if(hAdmin.tableExists(createTableName)){
//添加行值
Put put =new Put(Bytes.toBytes("2"));
//添加列:列族:列名:值
put.add(Bytes.toBytes("c1"),Bytes.toBytes("c1_1"),Bytes.toBytes("101"));
put.add(Bytes.toBytes("c1"),Bytes.toBytes("c1_2"),Bytes.toBytes("102"));
put.add(Bytes.toBytes("c2"),Bytes.toBytes("c2_1"),Bytes.toBytes("201"));
put.add(Bytes.toBytes("c3"),Bytes.toBytes("c3_1"),Bytes.toBytes("301"));
HTabletable = new HTable(cfg, createTableName);
table.put(put);
table.close();
}
hAdmin.close();
} catch(MasterNotRunningException e) {
// TODOAuto-generated catch block
e.printStackTrace();
} catch(ZooKeeperConnectionException e) {
// TODOAuto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
//刪除測試
public void deleteOne(){
try {
HTable table = newHTable(cfg, createTableName);
//以行的值定義,如下面2
Delete d = newDelete("2".getBytes());
//刪除列
d.deleteColumn(Bytes.toBytes("c1"),Bytes.toBytes("c1_2"));
//刪除列族
d.deleteFamily(Bytes.toBytes("c2"));
table.delete(d);
table.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//瀏覽
public void scanOne(){
try {
HTable table = newHTable(cfg, createTableName);
Scan s = new Scan();
s.setMaxVersions();
ResultScanner ss =table.getScanner(s);
for(Result r:ss){
//行
System.out.println(newString(r.getRow()));
for(KeyValuekv:r.raw()){
//列族
System.out.print("Family: ");
System.out.print(newString(kv.getFamily()));
System.out.print("Qualifier: ");
//列名
System.out.print(newString(kv.getQualifier()));
System.out.print("Value: ");
//值
System.out.print(newString(kv.getValue()));
System.out.println("");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public String getCreateTableName() {
return createTableName;
}
public void setCreateTableName(StringcreateTableName) {
this.createTableName =createTableName;
}
public String getDeleteTableName() {
return deleteTableName;
}
public void setDeleteTableName(StringdeleteTableName) {
this.deleteTableName =deleteTableName;
}
public static void main(String[] args){
// TODO Auto-generated methodstub
testHbase hbase = newtestHbase();
hbase.init();
hbase.createTable();
//hbase.deleteTable();
hbase.addOne();
hbase.deleteOne();
hbase.scanOne();
}
}
部分測試結果如下:
創建表,插入數據,以及刪除部分列、列族之後:
2.Hive