Phoenix设置时间戳
环境 phonex-4.3,hbase-0.98.10,hadoop-2.5.2
设置时间戳 使用hbase的TTL机制用来定时删除过期的数据记录,但是默认的是数据插入是的系统时间戳,显然不可以,需要手动设置时间戳,找了半天,官方文档上提到CurrentSCN 的描述,最终使用java客户端设置时间戳,代买如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import org.apache.phoenix.util.PhoenixRuntime;
import org.junit.Test;
public class PhoenixTest {
@Test
public void createTable(){
try {
String table = "TEST5";
Statement stmt = null;
Properties props = new Properties();
// 设置PhoenixRuntime.CURRENT_SCN_ATTRIB的值
props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(System.currentTimeMillis()-1000*60*60*24+1));
Connection con = DriverManager.getConnection("jdbc:phoenix:localhost",props);
stmt = con.createStatement();
String create = "create table " + table + " (mykey integer not null primary key, mycolumn varchar)";
stmt.execute(create);
con.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void upsert(){
try {
String table = "TEST5";
Statement stmt = null;
Properties props = new Properties();
// 设置PhoenixRuntime.CURRENT_SCN_ATTRIB的值
props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(System.currentTimeMillis()-1000*60*60*24+1));
Connection con = DriverManager.getConnection("jdbc:phoenix:localhost",props);
stmt = con.createStatement();
stmt.executeUpdate("upsert into "+ table+"(mykey,mycolumn) values(13,'13hhhhhhhhhhhhhhhhhh')");
con.commit();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 先创建表,再upsert数据
phoenix的神奇地方: - upsert数据的时间戳要大于必须要创建表的时间,否则报如下异常:
15/04/07 19:03:42 DEBUG ipc.RpcClient: IPC Client (231806250) connection to localhost/127.0.0.1:38783 from root: closed
15/04/07 19:03:42 DEBUG ipc.RpcClient: IPC Client (231806250) connection to localhost/127.0.0.1:38783 from root: stopped, connections 0
15/04/07 19:03:42 DEBUG ipc.RpcClient: IPC Client (231806250) connection to localhost/127.0.0.1:45090 from root: wrote request header call_id: 6 method_name: "ExecService" request_param: true
15/04/07 19:03:42 DEBUG ipc.RpcClient: IPC Client (231806250) connection to localhost/127.0.0.1:45090 from root: got response header call_id: 6, totalSize: 609 bytes
15/04/07 19:03:42 DEBUG ipc.RpcClient: IPC Client (231806250) connection to localhost/127.0.0.1:45090 from root: wrote request header call_id: 7 method_name: "ExecService" request_param: true
15/04/07 19:03:42 DEBUG ipc.RpcClient: IPC Client (231806250) connection to localhost/127.0.0.1:45090 from root: got response header call_id: 7, totalSize: 162 bytes
15/04/07 19:03:42 DEBUG ipc.RpcClient: IPC Client (231806250) connection to localhost/127.0.0.1:45090 from root: wrote request header call_id: 8 method_name: "ExecService" request_param: true
15/04/07 19:03:42 DEBUG ipc.RpcClient: IPC Client (231806250) connection to localhost/127.0.0.1:45090 from root: got response header call_id: 8, totalSize: 162 bytes
org.apache.phoenix.schema.TableNotFoundException: ERROR 1012 (42M03): Table undefined. tableName=TEST5
at org.apache.phoenix.compile.FromCompiler$BaseColumnResolver.createTableRef(FromCompiler.java:359)
at org.apache.phoenix.compile.FromCompiler$SingleTableColumnResolver.<init>(FromCompiler.java:237)
at org.apache.phoenix.compile.FromCompiler$SingleTableColumnResolver.<init>(FromCompiler.java:231)
at org.apache.phoenix.compile.FromCompiler.getResolverForMutation(FromCompiler.java:207)
at org.apache.phoenix.compile.UpsertCompiler.compile(UpsertCompiler.java:248)
at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:487)
at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:478)
at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:279)
at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:272)
at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:270)
at org.apache.phoenix.jdbc.PhoenixStatement.executeUpdate(PhoenixStatement.java:1052)
at test.phoenix.PhoenixTest.batchInsert(PhoenixTest.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
15/04/07 19:03:42 INFO client.HConnectionManager$HConnectionImplementation: Closing zookeeper sessionid=0x14c92a833ac0183
15/04/07 19:03:42 DEBUG zookeeper.ZooKeeper: Closing session: 0x14c92a833ac0183
15/04/07 19:03:42 DEBUG zookeeper.ClientCnxn: Closing client for session: 0x14c92a833ac0183
15/04/07 19:03:42 DEBUG ipc.Client: stopping client from cache: org.apache.hadoop.ipc.Client@11f569ee
15/04/07 19:03:42 DEBUG ipc.Client: removing client from cache: org.apache.hadoop.ipc.Client@11f569ee
- 建表时间如果大于当前时间,则创建表后 phoenix的sqlline客户端看不见表,需要当前时间大于建表时间才能显示表,这个功能相当超前
总结 - phoenix 摒弃了hbase的多个version机制,每次查询出的是最新版本,不能反查历史版本,需要从业务层面设计rowkey来实现;
- 关于时间戳,按照目前的形式,只能在创建connection的时候设置,由此每添加一条记录就要创建一次链接,导致不能批量插入,因此需要从业务层次设计,比如一批数据取一个时间戳等等…
- 总之,phoenix提供了一个可以自定义时间戳的方式已经不错了,比没有强,希望phoenix可以在后续版本中逐渐的完善更加的人性化
相关推荐
HBase的数据模型是列族(Column Family)型,允许用户动态地添加列,并且具有强大的时间戳支持,能轻松处理历史数据。在2.4版本中,HBase优化了Region Splitting策略,提升了数据分布的均匀性,同时增强了对高并发...
3. **配置Phoenix**:根据需求配置Phoenix的相关参数,例如设置HBase连接信息、JDBC驱动等。 4. **启动服务**:启动Phoenix服务器,使其监听在指定端口上,等待客户端连接。 5. **验证安装**:通过JDBC客户端连接...
在本地环境中设置HBase和Phoenix,首先需要安装Java环境和Hadoop生态组件,包括HBase。配置完成后,启动HBase服务,然后安装Phoenix客户端。Phoenix的安装通常包括JDBC驱动,这样就可以通过JDBC连接到HBase。在Java...
**HBase SQL Phoenix** 在大数据处理领域,HBase与Phoenix是两个重要的组件,它们共同为非结构化数据的管理和分析提供了强大的支持。HBase是一个基于谷歌Bigtable设计的开源分布式数据库,它属于Apache Hadoop生态...
5. **Row timestamp**:从4.6版本开始,Phoenix支持将HBase的row timestamp映射到列,利用HBase的时间戳优化和Phoenix的查询优化。 6. **Paged Queries**:支持分页查询,通过Row Value Constructors (RVC)和OFFSET...
- Hadoop Hive: 提供类似 `from_unixtime`(从Unix时间戳转换为日期)和 `date_add`(增加日期间隔)的函数。Hive 也支持 `get_date_part` 来提取日期部分,并用 `to_date` 或 `date_format` 转换日期格式。 - ...
它还能帮助设置表的属性,如是否启用压缩、是否是多版本并发控制(MVCC)等。 2. **DML操作**:对于插入、更新和删除数据,PhoenixUtils 提供了一套简洁的API,允许开发者通过SQL语句直接操作HBase数据。这些操作...
2. **time_ago_in_words**: 这个助手将时间戳转换为易于理解的人类化格式,如“5分钟前”,“2天前”等。这对于显示动态更新的内容非常有用,如帖子或评论的创建时间,使用户可以快速了解信息的新鲜程度。 3. **...
5. 时间戳:每个值都有一个时间戳,用于版本控制。 四、HBase操作 1. Put:向表中插入数据,对应于传统数据库的INSERT操作。 2. Get:获取指定行键和列族的数据,对应于SELECT操作。 3. Scan:扫描表中的数据,支持...
将 Phoenix 和 Ecto 粘在一起的胶水。 它具有以下特点: Ecto 模型的 JSON 编码/解码 模型的动态虚拟字段 简化 CRUD 控制器的创建 用于登录的用户控制器。 原油模型 通过使用 Crudex.Model 模块,像这样: ...
- **性能监控**:通过分析日志中的时间戳和性能指标,可以识别潜在的性能瓶颈。 - **安全审计**:记录敏感操作,确保系统的安全性。 - **数据分析**:将日志数据导出到大数据平台,进行深入的业务分析。 总结...
2. **配置**:编辑`conf/hbase-site.xml`,设置HBase的相关配置,如HDFS的地址、Zookeeper的地址等。 3. **启动**:启动HBase集群,包括HBase Master和Region Server。 4. **交互**:你可以通过HBase Shell或者编程...
5. Indexing:虽然HBase本身不支持索引,但可以通过第三方库如 phoenix 或 hbase-indexer 实现索引功能。 六、监控与维护 1. 使用HBase自带的JMX监控工具或第三方监控工具(如Ambari、Grafana)监控HBase集群的...
1. **TO_CHAR()**:将数值、日期或时间戳转换为字符串格式。 2. **TO_DATE()**:将字符串转换为日期类型。 3. **TO_NUMBER()**:将字符串转换为数值。 4. **CAST()**:在SQL标准中,用于将一种数据类型转换为另一种...
- **二级索引**: 尽管HBase原生不支持二级索引,但可以通过自定义实现或使用Apache Phoenix等工具来创建。 8. **监控与运维** - **监控工具**: HBase提供了丰富的监控接口,如JMX和Web UI,便于监控集群状态。 -...
除了命令行工具,HBase还有诸如HBase Shell、HBaseAdmin、Phoenix等管理和开发工具,以及Ambari、Cloudera Manager等可视化管理平台,方便用户对HBase集群进行监控和管理。 总之,HBase是应对大规模数据挑战的重要...
- 每个单元格(Cell)都有一个时间戳,支持多版本数据,可以回溯到历史版本。 5. **读写操作** - HBase提供随机读取和写入能力,读写速度非常快。 - 写操作先写入内存,随后定期刷入HDFS,保证数据一致性。 6. ...
3. **主键设计**:对于时间序列数据,常采用反向时间戳作为主键的一部分,以支持降序查询。同时,rowkey通常由多列构成,方便不同场景下的查询。 4. **数据类型转换**:HBase仅支持字节数组,但SQL on HBase提供了...
5. 单元格(Cell):每个单元格存储一个时间戳和一个值,允许多版本存储。 HBase的Shell操作提供了对数据库的直观管理,包括: - Help:显示命令帮助。 - List:列出所有表。 - Create:创建新表,指定列族。 - Put...
HBase是建立在Hadoop文件系统(HDFS)之上的,它将数据以行和列的形式存储,每个表由行键(Row Key)、列族(Column Family)、列(Qualifier)和时间戳(Timestamp)组成。Apache Phoenix是一个开源的JDBC驱动,...