hbase学习(一)hbase单机部署和java客户端连接单机hbase

简介:

最近看了些hbase的东西,打算写点什么,谁知鼓捣的过程中步步是坑,最终呕心沥血,憋出了这篇文章,实属不易。

hbase和hive总是成对出现的,简单说,hbase是数据库,hive是mapReduce作业。

先从hbase单机部署说起,尽量说的简洁点,说多了都是眼泪。

1.给服务器起个机器名,iptables关掉,同时本地绑定host。

起个机器名

1

vi /etc/hosts

127.0.0.1 localhost
211.155.225.210 love-kaige

1

vi /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=love-kaige

关闭iptables

1

2

service iptables stop

chkconfig iptables off

本地绑定host
C:\Windows\System32\drivers\etc\hosts
211.155.225.210 love-kaige

然后reboot重启机子,执行
hostname显示love-kaige,service iptables status 显示 iptables: Firewall is not running. 即OK。

2.下载安装jdk和hbase。

jdk应该关系不大,我安装的是jdk-7u51-linux-x64.rpm,环境变量配好即可,此处略过。

hbase下载的是稳定版,地址:http://mirrors.aliyun.com/apache/hbase/stable/hbase-0.94.18.tar.gz。阿里云对apache下的项目和linux不同的发行版都做了镜像,方便了广大的码农,给个赞。

解压hbase,然后对hbase-site.xml进行修改,修改如下:

1

2

3

4

5

6

<configuration>

<property>

<name>hbase.rootdir</name>

<value>file:/root/hbase</value>

</property>

</configuration>

然后去hbase的bin目录,./start-hbase.sh起起来。

3.编写java代码。

添加依赖:

1

2

3

4

5

6

7

8

9

10

<dependency>

<groupId> org.apache.hadoop</groupId >

<artifactId> hadoop-core </artifactId>

<version> 1.0.4</version >

</dependency>

<dependency>

<groupId> org.apache.hbase</groupId >

<artifactId> hbase</artifactId >

<version> 0.94.18</version >

</dependency>

服务端和客户端的版本最好一致,现在都是0.94.18,免得出现莫名奇妙的问题。hadoop的版本和hbase的版本也有对应关系,把官网的hbase和hadoop的版本匹配表搬过来,

Table 2.1. Hadoop version support matrix

HBase-0.92.x HBase-0.94.x HBase-0.96
Hadoop-0.20.205 S X X
Hadoop-0.22.x S X X
Hadoop-1.0.x S S S
Hadoop-1.1.x NT S S
Hadoop-0.23.x X S NT
Hadoop-2.x X S S

S = supported and tested,支持
X = not supported,不支持
NT = not tested enough.可以运行但测试不充分

由于 HBase 依赖 Hadoop,它配套发布了一个Hadoop jar 文件在它的 lib 下。该套装jar仅用于独立模式。在分布式模式下,Hadoop版本必须和HBase下的版本一致。用你运行的分布式Hadoop版本jar文件替换HBase lib目录下的Hadoop jar文件,以避免版本不匹配问题。确认替换了集群中所有HBase下的jar文件。Hadoop版本不匹配问题有不同表现,但看起来都像挂掉了。

贴代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

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.MasterNotRunningException;

import org.apache.hadoop.hbase.ZooKeeperConnectionException;

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 yankai913@gmail.com

* @date 2014-4-28

*/

public class SimpleClient {

static final String rowKey = "row1";

static HBaseAdmin hBaseAdmin;

static Configuration conf;

static {

conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum", "love-kaige");

try {

hBaseAdmin = new HBaseAdmin(conf);

}

catch (MasterNotRunningException e) {

e.printStackTrace();

}

catch (ZooKeeperConnectionException e) {

e.printStackTrace();

}

}

public static void createTable(String tableName, String[] columns) throws Exception {

dropTable(tableName);

HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);

for (String columnName : columns) {

HColumnDescriptor column = new HColumnDescriptor(columnName);

hTableDescriptor.addFamily(column);

}

hBaseAdmin.createTable(hTableDescriptor);

System.out.println("create table successed");

}

public static void dropTable(String tableName) throws Exception {

if (hBaseAdmin.tableExists(tableName)) {

hBaseAdmin.disableTable(tableName);

hBaseAdmin.deleteTable(tableName);

}

System.out.println("drop table successed");

}

public static HTable getHTable(String tableName) throws Exception {

return new HTable(conf, tableName);

}

public static void insert(String tableName, Map<String, String> map) throws Exception {

HTable hTable = getHTable(tableName);

byte[] row1 = Bytes.toBytes(rowKey);

Put p1 = new Put(row1);

for (String columnName : map.keySet()) {

byte[] value = Bytes.toBytes(map.get(columnName));

String[] str = columnName.split(":");

byte[] family = Bytes.toBytes(str[0]);

byte[] qualifier = null;

if (str.length > 1) {

qualifier = Bytes.toBytes(str[1]);

}

p1.add(family, qualifier, value);

}

hTable.put(p1);

Get g1 = new Get(row1);

Result result = hTable.get(g1);

System.out.println("Get: " + result);

System.out.println("insert successed");

}

public static void delete(String tableName, String rowKey) throws Exception {

HTable hTable = getHTable(tableName);

List<Delete> list = new ArrayList<Delete>();

Delete d1 = new Delete(Bytes.toBytes(rowKey));

list.add(d1);

hTable.delete(list);

Get g1 = new Get(Bytes.toBytes(rowKey));

Result result = hTable.get(g1);

System.out.println("Get: " + result);

System.out.println("delete successed");

}

public static void selectOne(String tableName, String rowKey) throws Exception {

HTable hTable = getHTable(tableName);

Get g1 = new Get(Bytes.toBytes(rowKey));

Result result = hTable.get(g1);

foreach(result);

System.out.println("selectOne end");

}

private static void foreach(Result result) throws Exception {

for (KeyValue keyValue : result.raw()) {

StringBuilder sb = new StringBuilder();

sb.append(Bytes.toString(keyValue.getRow())).append("\t");

sb.append(Bytes.toString(keyValue.getFamily())).append("\t");

sb.append(Bytes.toString(keyValue.getQualifier())).append("\t");

sb.append(keyValue.getTimestamp()).append("\t");

sb.append(Bytes.toString(keyValue.getValue())).append("\t");

System.out.println(sb.toString());

}

}

public static void selectAll(String tableName) throws Exception {

HTable hTable = getHTable(tableName);

Scan scan = new Scan();

ResultScanner resultScanner = null;

try {

resultScanner = hTable.getScanner(scan);

for (Result result : resultScanner) {

foreach(result);

}

}

catch (Exception e) {

e.printStackTrace();

}

finally {

if (resultScanner != null) {

resultScanner.close();

}

}

System.out.println("selectAll end");

}

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

String tableName = "tableTest";

String[] columns = new String[] { "column_A", "column_B" };

createTable(tableName, columns);

Map<String, String> map = new HashMap<String, String>();

map.put("column_A", "AAA");

map.put("column_B:1", "b1");

map.put("column_B:2", "b2");

insert(tableName, map);

selectOne(tableName, rowKey);

selectAll(tableName);

delete(tableName, rowKey);

dropTable(tableName);

}

练习代码看这里


相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
25天前
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
47 5
|
23天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
39 3
|
23天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
22 1
|
23天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
38 1
|
28天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
30天前
|
SQL IDE Java
入门Cloud Toolkit:简化你的Java应用开发与部署流程
【10月更文挑战第19天】作为一名长期从事Java开发的程序员,我一直致力于寻找能够简化日常开发工作的工具。在众多工具中,阿里巴巴推出的Cloud Toolkit引起了我的注意。这款免费的插件旨在帮助开发者更轻松地进行开发、测试及部署工作,尤其是在与云服务交互时表现尤为出色。本文将从个人的角度出发,介绍Cloud Toolkit的基本功能及其使用技巧,希望能帮助初学者快速上手这款实用工具。
24 1
|
1月前
|
SQL 存储 Java
Java中使用ClickHouseDriver连接和基本操作
通过上述步骤,你可以轻松地在Java应用中集成ClickHouse数据库,执行基本的CRUD操作。需要注意的是,实际开发中应当根据实际情况调整数据库连接配置(如URL中的主机、端口、数据库名等),并根据应用需求选择合适的异常处理策略,确保代码的健壮性和资源的有效管理。此外,对于复杂查询和大批量数据处理,建议充分利用ClickHouse的特性(如分布式处理、列式存储优化等),以进一步提升性能。
111 2
|
1月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
76 3
|
5月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
4月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
66 0
下一篇
无影云桌面