无法直接dump,写了java多线程程序做迁移
问题1:Operation not allowed after ResultSet closed
裸jdbc语句,一个线程跑7个表,只有第一个表时候出这个问题,方法改为static synchronized可以解决,但速度慢的不能忍受,最终在同事建议下,换用spring jdbctemplate,解决
问题2:SELECT `token`, `count` FROM {TABLE_NAME} ORDER BY `token` DESC LIMIT ?, ? 到100w后速度不能忍受的慢
问题场景为遍历数据库,可以记录上次的最大token,然后 where token>? limit ?
limit单值相当于 limit 0,? 速度会很快。 真正的分页大于100万时该如何取是个问题,还没想到解决方案
mysql> explain select token,count from `trackurl_0`.`click_count_00` order by token limit 1000000,10000;
+----+-------------+----------------+-------+---------------+---------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------+-------+---------------+---------+---------+------+---------+-------+
| 1 | SIMPLE | click_count_00 | index | NULL | PRIMARY | 30 | NULL | 1010000 | |
+----+-------------+----------------+-------+---------------+---------+---------+------+---------+-------+
explain select token,count from `trackurl_0`.`click_count_00` where token > "asdf" limit 10000;
+----+-------------+----------------+-------+---------------+---------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------+-------+---------------+---------+---------+------+---------+-------------+
| 1 | SIMPLE | click_count_00 | range | PRIMARY | PRIMARY | 30 | NULL | 2865959 | Using where |
+----+-------------+----------------+-------+---------------+---------+---------+------+---------+-------------+
type: 联接类型,从这个选项我们可以初步判断查询效率,有以下几种不同的类型(按从最佳到最坏排序):
(1).system: 表中仅有一行记录,这是const的一个特例。
(2).const: 表中最多有一行符合查询条件,它在查询开始时被读取。因为只有一行,这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只被读取一次!(如上面的查询)
(3).eq_ref: 对于每个来自于前面的表的行组合,从该表中读取一行。例如:select * from A,B where A.id=B.id,如果id在B表中是unique或primary key,会返回这个类型。它是说对于A表中的每一行,在B表中读取符合记录的一行。除了const之外,这是最好的联接类型。
(4).ref: 这个类型跟eq_ref类似,不同的是eq_ref能根据unique或主键在后面的表中选择出唯一的行,而不能确定唯一行,则使用这个类型。
(5).ref_or_null: 该联接类型如同ref,但是添加了MySQL 可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。
(6).index_merge: 索引合并方法用于通过range扫描搜索行并将结果合成一个。合并会产生并集、交集或者正在进行的扫描的交集的并集。在EXPLAIN输出中,该方法表现 为type列内的index_merge。在这种情况下,key列包含一列使用的索引,key_len包含这些索引的最长的关键元素。
(7).unique_subquery: unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。explain select * from jos_content where id in (select id from jos_categories);会使用这个类型。
(8).index_subquery: 该联接类型类似于unique_subquery。可以替换IN子查询,但只适合子查询中的非唯一索引。
(9).range: 只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。 当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用这个类型。
(10).index: 这与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
(11).all: 对于每个来自于先前的表的行组合,将要做一个完整的表扫描。如果表格是第一个没标记const的表,效果不是很好,并且在所有的其他情况下很差。你可以通过增加更多的索引来避免ALL,使得行能从早先的表中基于常数值或列值被检索出来。
(原文:http://www.linlook.com/detail_MTE3MA==.html)
问题3:ArrayBlockingQueue 阻塞丢数据
offer(E e)
Inserts the specified element at the tail of this queue if it is possible to do so immediately without exceeding the queue's capacity, returning true upon success and false if this queue is full.
队列满时offer会返回false,设定时间的话等到超时时间会返回false,所以不能让队列满,满了就会丢数据
问题4:hbase单线程插入只有500左右
多线程方式或批量插入方式解决,测速大概在50000条每秒,大概50MB左右的数据量,占带宽的一半。
hbase shell wiki: http://wiki.apache.org/hadoop/Hbase/Shell
hbase依赖的jar包:
hadoop core 需要使用 commons.logging
zookeeper 却使用log4j
其实hbase客户端只需要几个jar包即能完成常用功能
commons-configuration-1.6
commons-lang-2.6
commons-logging-1.1.1
hadoop-core-1.0.0
hbase-0.92.1
log4j-1.2.16
slf4j-api-1.6.1
slf4j-log4j12-1.5.8
zookeeper-3.4.3