2010-10-21 12 views
13

tôi có thể nói HBase để vô hiệu hóa và xóa bảng đặc biệt sử dụng:Một kịch bản mà xóa tất cả các bảng trong HBase

disable 'tablename' 
drop 'tablename' 

Nhưng tôi muốn xóa tất cả các bảng trong cơ sở dữ liệu mà không thể xác định rõ tên của bất kỳ các bảng . Có cách nào để làm việc này không? Tôi muốn làm điều này thông qua tiện ích dòng lệnh ./hbase shell, không thông qua Java hoặc Tiết kiệm.

Trả lời

18

disable_alldrop_all đã được thêm vào như là các lệnh trong shell HBase ruby. Các lệnh này được thêm vào trong jira HBASE-3506 Các lệnh này lấy một bảng regex để vô hiệu hóa/thả. Và họ sẽ yêu cầu xác nhận trước khi tiếp tục. Điều đó sẽ làm cho thả rất nhiều bảng khá dễ dàng và không yêu cầu thư viện bên ngoài hoặc kịch bản.

+4

Lưu ý rằng 'disable_all '*. *'' là lệnh thích hợp để vô hiệu hóa tất cả các bảng HBase. Khi sử dụng 'disable_all '*'', bạn sẽ nhận được một xác nhận vô hiệu hóa không chính xác từ HBase; đây là [vấn đề đã biết] (https://issues.apache.org/jira/browse/HBASE-6642) được sửa trong HBase 0.94.4 trở đi. –

+0

Cảm ơn Emaad vì mẹo đó. Tôi có thể xác nhận rằng nó vẫn không cố định trong 0.94.5. –

+2

'disable_all '. *'' Works –

6

Bạn có thể đặt lệnh đường ống cho lệnh bin/hbase shell. Từ đó bạn có thể sử dụng một số kịch bản để lấy tên bảng và đường dẫn các lệnh vô hiệu hóa/xóa trở lại HBase.

tức

echo "list" | bin/hbase shell | ./filter_table_names.pl > table_names.txt 
./turn_table_names_into_disable_delete_commands.pl table_names.txt | bin/hbase shell 
+0

Có, nhưng điều đó phụ thuộc vào những gì đầu ra vỏ cơ sở dữ liệu cung cấp. Tôi đã hy vọng hbase sẽ có một cái gì đó được xây dựng trong. –

+0

Bạn sẽ không tìm thấy chức năng đó từ phương thức shell và baja là gần như bạn sẽ nhận được. Tôi không nghĩ rằng có rất nhiều trong cách của kế hoạch để cải thiện vỏ hiện tại (mà là khá xấu). Tôi biết bạn muốn tránh tiết kiệm/java nhưng có lẽ nếu bạn có thể đăng các lý do của bạn để tránh họ thay thế khác có thể được đề xuất? – juhanic

0

Tôi không xóa bảng thông qua vỏ HBase nhưng tôi xóa chúng từ dòng lệnh bằng cách,
- xóa thư mục hadoop phân phối hệ thống tập tin của tôi, sau đó,
- tạo ra một mới hadoop sạch thư mục phân phối hệ thống tập tin, sau đó,
- định dạng hadoop phân phối hệ thống tập tin của tôi với 'hadoop namenode -format', sau đó,
- start-all.sh và start-hbase.sh

tham khảo:
http://hadoop.apache.org/common/docs/r0.20.1/api/overview-summary.html#overview_description

9

Tôi có một kịch bản tiện dụng mà không chính xác này, sử dụng thư viện Python Happybase:

import happybase 

c = happybase.Connection() 

for table in c.tables(): 
    c.disable_table(table) 
    c.delete_table(table) 
    print "Deleted: " + table 

Bạn sẽ cần Happybase cài đặt để sử dụng kịch bản này, và bạn có thể cài đặt nó như là :

sudo easy_install happybase 
+1

happybase thực sự tuyệt vời .. infact Tôi đang sử dụng nó để theo dõi mục đích HBase .. –

+1

Điều này cũng có thể được thực hiện trong một lần: connection.delete_table ('table-name', disable = True) http: // happybase. readthedocs.org/en/latest/api.html#happybase.Connection.delete_table –

1

Có lỗi. Mở tập tin $ HBASE_HOME/lib/ruby ​​/ shell/commands/list.rb và thêm dòng dưới đây vào cuối phương thức lệnh.

return list 

Sau đó, danh sách lệnh sẽ trả về một mảng tên của tất cả các bảng. Và sau đó làm như thế này.

list.each {|t| disable t;drop t} 
0

Nếu bạn đang tìm kiếm cái gì đó sẽ làm điều này trong một 'one-liner' qua một kịch bản shell bạn có thể sử dụng phương pháp này:

$ echo 'list.each {|t| disable t; drop t}; quit;' | hbase shell 

LƯU Ý: Trên đây được chạy từ dấu nhắc trình bao Bash. Nó lặp lại các lệnh thành hbase shell và thực hiện một vòng lặp thông qua tất cả các bảng được trả về từ lệnh list và sau đó vô hiệu hóa & giảm mỗi bảng khi nó lặp lại qua mảng mà list trả lại. Một khi nó được thực hiện, nó thoát.