1. 程式人生 > 其它 >mysql資料遷移hbase問題

mysql資料遷移hbase問題

無法直接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