3.3 样例代码说明
3.3.12 使用过滤器 Filter
}
LOG.info("Scan data successfully.");
} catch (IOException e) {
LOG.error("Scan data failed " ,e);
} finally {
} LOG.info("Exiting testScanData.");
}
3.3.12 使用过滤器 Filter
功能简介
HBase Filter主要在Scan和Get过程中进行数据过滤,通过设置一些过滤条件来实现,
如设置RowKey、列名或者列值的过滤条件。
代码样例
public void testSingleColumnValueFilter() { LOG.info("Entering testSingleColumnValueFilter.");
Table table = null;
ResultScanner rScanner = null;
try {
table = conn.getTable(tableName);
Scan scan = new Scan();
scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
// Set the filter criteria.
SingleColumnValueFilter filter = new SingleColumnValueFilter(
Bytes.toBytes("info"), Bytes.toBytes("name"), CompareOp.EQUAL, Bytes.toBytes("I"));
scan.setFilter(filter);
// Submit a scan request.
rScanner = table.getScanner(scan);
// Print query results.
for (Result r = rScanner.next(); r != null; r = rScanner.next()) { for (Cell cell : r.rawCells()) {
LOG.info(Bytes.toString(CellUtil.cloneRow(cell)) + ":"
+ Bytes.toString(CellUtil.cloneFamily(cell)) + ","
+ Bytes.toString(CellUtil.cloneQualifier(cell)) + ","
+ Bytes.toString(CellUtil.cloneValue(cell)));
} }
LOG.info("Single column value filter successfully.");
} catch (IOException e) {
LOG.error("Single column value filter failed " ,e);
} finally {
} LOG.info("Exiting testSingleColumnValueFilter.");
}
4 开发 OpenTSDB 应用
4.1 典型场景说明
通过典型场景,我们可以快速学习和掌握OpenTSDB的开发过程,并且对关键的接口 函数有所了解。
场景说明
假定用户开发一个应用程序,用于记录和查询城市的气象信息,记录数据如下表
表
4-1 原始数据
城市 区域 时间 温度 湿度
Shenzhen Longgang 2017/7/1 00:00:00 28 54 Shenzhen Longgang 2017/7/1 01:00:00 27 53 Shenzhen Longgang 2017/7/1 02:00:00 27 52 Shenzhen Longgang 2017/7/1 03:00:00 27 51 Shenzhen Longgang 2017/7/1 04:00:00 27 50 Shenzhen Longgang 2017/7/1 05:00:00 27 49 Shenzhen Longgang 2017/7/1 06:00:00 27 48 Shenzhen Longgang 2017/7/1 07:00:00 27 46 Shenzhen Longgang 2017/7/1 08:00:00 29 46 Shenzhen Longgang 2017/7/1 09:00:00 30 48 Shenzhen Longgang 2017/7/1 10:00:00 32 48 Shenzhen Longgang 2017/7/1 11:00:00 32 49 Shenzhen Longgang 2017/7/1 12:00:00 33 49
城市 区域 时间 温度 湿度 Shenzhen Longgang 2017/7/1 13:00:00 33 50 Shenzhen Longgang 2017/7/1 14:00:00 32 50 Shenzhen Longgang 2017/7/1 15:00:00 32 50 Shenzhen Longgang 2017/7/1 16:00:00 31 51 Shenzhen Longgang 2017/7/1 17:00:00 30 51 Shenzhen Longgang 2017/7/1 18:00:00 30 51 Shenzhen Longgang 2017/7/1 19:00:00 29 51 Shenzhen Longgang 2017/7/1 20:00:00 29 52 Shenzhen Longgang 2017/7/1 21:00:00 29 53 Shenzhen Longgang 2017/7/1 22:00:00 28 54 Shenzhen Longgang 2017/7/1 23:00:00 28 54
该场景里我们记录了深圳市龙岗区在2017年7月1日零时的温度和湿度数据,这里通过 OpenTSDB的方式建模实质上是两组数据点。
表
4-2 指标数据点 1
指标项
(metric)
城市(city) 区域(region) Unix
timestamp
指标数值(value)
city.temp Shenzhen Longgang 1498838400 28 city.temp Shenzhen Longgang 1498842000 27 city.temp Shenzhen Longgang 1498845600 27 city.temp Shenzhen Longgang 1498849200 27 city.temp Shenzhen Longgang 1498852800 27 city.temp Shenzhen Longgang 1498856400 27 city.temp Shenzhen Longgang 1498860000 27 city.temp Shenzhen Longgang 1498863600 27 city.temp Shenzhen Longgang 1498867200 29 city.temp Shenzhen Longgang 1498870800 30 city.temp Shenzhen Longgang 1498874400 32 city.temp Shenzhen Longgang 1498878000 32 city.temp Shenzhen Longgang 1498881600 33指标项
(metric)
城市(city) 区域(region) Unix
timestamp
指标数值(value)
city.temp Shenzhen Longgang 1498885200 33 city.temp Shenzhen Longgang 1498888800 32 city.temp Shenzhen Longgang 1498892400 32 city.temp Shenzhen Longgang 1498896000 31 city.temp Shenzhen Longgang 1498899600 30 city.temp Shenzhen Longgang 1498903200 30 city.temp Shenzhen Longgang 1498906800 29 city.temp Shenzhen Longgang 1498910400 29 city.temp Shenzhen Longgang 1498914000 29 city.temp Shenzhen Longgang 1498917600 28 city.temp Shenzhen Longgang 1498921200 28表
4-3 指标数据点 2
指标项
(metric)
城市(city) 区域(region) Unix
timestamp
指标数值(value)
city.hum Shenzhen Longgang 1498838400 54 city.hum Shenzhen Longgang 1498842000 53 city.hum Shenzhen Longgang 1498845600 52 city.hum Shenzhen Longgang 1498849200 51 city.hum Shenzhen Longgang 1498852800 50 city.hum Shenzhen Longgang 1498856400 49 city.hum Shenzhen Longgang 1498860000 48 city.hum Shenzhen Longgang 1498863600 46 city.hum Shenzhen Longgang 1498867200 46 city.hum Shenzhen Longgang 1498870800 48 city.hum Shenzhen Longgang 1498874400 48 city.hum Shenzhen Longgang 1498878000 49 city.hum Shenzhen Longgang 1498881600 49 city.hum Shenzhen Longgang 1498885200 50指标项
(metric)
城市(city) 区域(region) Unix
timestamp
指标数值(value)
city.hum Shenzhen Longgang 1498888800 50 city.hum Shenzhen Longgang 1498892400 50 city.hum Shenzhen Longgang 1498896000 51 city.hum Shenzhen Longgang 1498899600 51 city.hum Shenzhen Longgang 1498903200 51 city.hum Shenzhen Longgang 1498906800 51 city.hum Shenzhen Longgang 1498910400 52 city.hum Shenzhen Longgang 1498914000 53 city.hum Shenzhen Longgang 1498917600 54 city.hum Shenzhen Longgang 1498921200 54其中这两组指标数据点都有2个标签:
● 标签(tag):城市city、区域region
● 标签值(tag value):ShenZhen、Longgang 用户可以执行以下数据操作:
● 获取每天的监控数据,通过OpenTSDB的put接口将两个组数据点写入数据库中。
● 对已有的数据,使用OpenTSDB的query接口进行数据查询和分析。
4.2 开发思路
功能分解
根据上述的业务场景进行功能分解,需要开发的功能点如表4-4。
表
4-4 在 OpenTSDB 中开发的功能
序号 步骤 代码实现
1 根据典型场景说明建立了数据模型 请参见写入数据
2 写入指标数据 请参见写入数据
3 根据指标项进行数据查询 请参见查询数据
4 删除指定范围的数据 请参见删除数据
4.3 样例代码说明
4.3.1 配置参数
步骤1 执行样例代码前,必须在样例代码工程中修改
“com.huawei.cloudtable.opentsdb.examples.OpenTsdbSample”类中的如下参数:
private final static String OPENTSDB_IP = "opentsdb-vdswm7gj45awlom.cloudtable.com";
private final static int OPENTSDB_PORT = 4242;
● OPENTSDB_IP:修改为CloudTable集群信息页面上的OpenTSDB的URL地址。
● OPENTSDB_PORT:端口修改为4242。
步骤2 如果CloudTable集群开启了IAM认证的功能,在样例代码工程中,修改
“com.huawei.cloudtable.opentsdb.examples.OpenTsdbSample”类中的如下参数:
private final static boolean securityMode = true;
private final static String PROJECT_ID = "XXXXXX";
private final static String USER = "XXXXXX";
private final static String AK = "XXXXXX";
private final static String TOKEN = "XXXXXX";
● securityMode:设置为true。如果CloudTable集群未开启IAM认证功能,必须将
● AK:Access Key ID,即访问密钥ID。将鼠标移到管理控制台右上角的用户名,单 击“我的凭证”,再单击“管理访问密钥”,可以查看已有的访问密钥,也可以
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>
2. httpcore
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.4</version>
</dependency>
3. httpclient
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
步骤4 每个HTTP请求都应该设置超时间,设置超时时间的方法如下:
public static void addTimeout(HttpRequestBase req) {
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) .setConnectionRequestTimeout(10000).setSocketTimeout(60000).build();
req.setConfig(requestConfig);
}
----结束
4.3.2 IAM 集群认证
功能简介
如果CloudTable启用了IAM认证功能,那么OpenTSDB必须使用HTTPS进行连接,并 且在HTTP请求的HEADER中携带必需的参数,如下表所示:
表
4-5 HTTP Header 携带的参数
HTTP Header Value
X-TSD-IamAuth true
X-Auth-ProjectId 集群所在的ProjectID
X-Auth-User 租户名
X-Auth-AK 租户的AccessKey
X-Auth-Token 使用租户AccessKey和SecretKey生成的 Token信息
说明
Token的生成方法如下:
在客户端主机的操作系统的shell界面中执行。在客户端机器上进入HBase目录后执行Token工 具,Token工具的命令格式如下:
./bin/hbase com.huawei.cloudtable.tool.RestTokenUtil <AccessKey> <SecretKey>
<UserName>
“AccessKey”:用户的AccessKey。
“SecretKey”:用户的SecretKey。
“UserName”:用户名。
例如:
./bin/hbase com.huawei.cloudtable.tool.RestTokenUtil YourAccessKey YourSecretKey YourUserName
样例代码
使用HTTPS连接的时候,应用侧需要跳过校验证书。使用如下方法创建的HTTP Client 可以跳过校验证书:
private static CloseableHttpClient createSSLClientDefault() { try {
X509TrustManager x509mgr = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs, String string) { }
public void checkServerTrusted(X509Certificate[] xcs, String string) { }
public X509Certificate[] getAcceptedIssuers() { return null;
} };
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[] { x509mgr }, null);
@SuppressWarnings("deprecation")
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
} catch (KeyManagementException e) { throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) { throw new RuntimeException(e);
HttpPost httpPost = new HttpPost(PUT_URL);
httpPost .addHeader("X-TSD-IamAuth", "true");
httpPost .addHeader("X-Auth-ProjectId", PROJECT_ID);
httpPost .addHeader("X-Auth-User", USER);
httpPost .addHeader("X-Auth-AK", AK);
httpPost .addHeader("X-Auth-Token", TOKEN);