HBase
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> HBase

Cách thực hiện:Kiểm tra các ứng dụng HBase bằng các công cụ phổ biến

Trong khi việc áp dụng Apache HBase để xây dựng các ứng dụng người dùng cuối đã tăng vọt, nhiều ứng dụng trong số đó (và nhiều ứng dụng nói chung) vẫn chưa được kiểm tra tốt. Trong bài đăng này, bạn sẽ tìm hiểu một số cách có thể dễ dàng thực hiện thử nghiệm này.

Chúng tôi sẽ bắt đầu với kiểm tra đơn vị thông qua JUnit, sau đó chuyển sang sử dụng Mockito và Apache MRUnit, sau đó sử dụng một cụm nhỏ HBase để kiểm tra tích hợp. (Bản thân cơ sở mã HBase được kiểm tra thông qua một cụm nhỏ, vậy tại sao không khai thác vào đó cho các ứng dụng ngược dòng?)

Để làm cơ sở cho cuộc thảo luận, giả sử bạn có một đối tượng truy cập dữ liệu HBase (DAO) sẽ chèn phần sau vào HBase. Tất nhiên, logic có thể phức tạp hơn nhưng ví dụ, điều này thực hiện được công việc.

 public class MyHBaseDAO {public static void insertRecord (HTableInterface table, HBaseTestObj obj) throws Exception {Put put =createPut (obj); table.put (đặt); } private static Put createPut (HBaseTestObj obj) {Put put =new Put (Bytes.toBytes (obj.getRowKey ())); put.add (Bytes.toBytes ("CF"), Bytes.toBytes ("CQ-1"), Bytes.toBytes (obj.getData1 ())); put.add (Bytes.toBytes ("CF"), Bytes.toBytes ("CQ-2"), Bytes.toBytes (obj.getData2 ())); trả lại đặt; }} 

HBaseTestObj là một đối tượng dữ liệu cơ bản với getters và setters cho khóa hàng, data1 và data2.

InsertRecord thực hiện chèn vào bảng HBase đối với họ cột của CF, với CQ-1 và CQ-2 là các vòng loại. Phương thức createPut chỉ cần điền một lệnh Đặt và trả nó về phương thức gọi.

Sử dụng JUnit

JUnit, vốn nổi tiếng với hầu hết các nhà phát triển Java vào thời điểm này, dễ dàng áp dụng cho nhiều ứng dụng HBase. Đầu tiên, thêm phụ thuộc vào pom của bạn:

   junit   junit   4.11   test   

Bây giờ, trong lớp thử nghiệm:

 public class TestMyHbaseDAOData {@Test public void testCreatePut () ném Exception {HBaseTestObj obj =new HBaseTestObj (); obj.setRowKey ("ROWKEY-1"); obj.setData1 ("DATA-1"); obj.setData2 ("DATA-2"); Đặt put =MyHBaseDAO.createPut (obj); khẳng địnhEquals (obj.getRowKey (), Bytes.toString (put.getRow ())); khẳng địnhEquals (obj.getData1 (), Bytes.toString (put.get (Bytes.toBytes ("CF"), Bytes.toBytes ("CQ-1")). get (0) .getValue ())); khẳng địnhEquals (obj.getData2 (), Bytes.toString (put.get (Bytes.toBytes ("CF"), Bytes.toBytes ("CQ-2")). get (0) .getValue ())); }} 

Những gì bạn đã làm ở đây là để đảm bảo rằng phương thức createPut của bạn tạo, điền và trả về một đối tượng Put với các giá trị mong đợi.

Sử dụng Mockito

Vậy làm thế nào để bạn kiểm tra đơn vị phương thức insertRecord ở trên? Một cách tiếp cận rất hiệu quả là làm như vậy với Mockito.

Đầu tiên, thêm Mockito làm phụ thuộc vào pom của bạn:

   org.mockito   mockito-all   1.9.5   test    

Sau đó, trong lớp thử nghiệm:

 @RunWith (MockitoJUnitRunner.class) public class TestMyHBaseDAO {@Mock private HTableInterface table; @Mock riêng HTablePool hTablePool; @Captor private ArgumentCaptor putCaptor; @Test public void testInsertRecord () throws Exception {// trả về bảng giả khi getTable được gọi khi (hTablePool.getTable ("tablename")). ThenReturn (table); // tạo đối tượng thử nghiệm và thực hiện cuộc gọi đến DAO cần thử nghiệm HBaseTestObj obj =new HBaseTestObj (); obj.setRowKey ("ROWKEY-1"); obj.setData1 ("DATA-1"); obj.setData2 ("DATA-2"); MyHBaseDAO.insertRecord (bảng, obj); xác minh (bảng) .put (putCaptor.capture ()); Đặt put =putCaptor.getValue (); khẳng địnhEquals (Bytes.toString (put.getRow ()), obj.getRowKey ()); khẳng định (put.has (Bytes.toBytes ("CF"), Bytes.toBytes ("CQ-1"))); khẳng định (put.has (Bytes.toBytes ("CF"), Bytes.toBytes ("CQ-2"))); khẳng địnhEquals (Bytes.toString (put.get (Bytes.toBytes ("CF"), Bytes.toBytes ("CQ-1")). get (0) .getValue ()), "DATA-1"); khẳng địnhEquals (Bytes.toString (put.get (Bytes.toBytes ("CF"), Bytes.toBytes ("CQ-2")). get (0) .getValue ()), "DATA-2"); }} 

Tại đây, bạn đã điền HBaseTestObj bằng các giá trị “ROWKEY-1”, “DATA-1”, “DATA-2”. Sau đó, bạn sử dụng bảng giả và DAO để chèn bản ghi. Bạn đã nắm bắt được Lệnh mà DAO sẽ chèn và xác minh rằng khóa hàng, data1 và data2 là những gì bạn mong đợi.

Chìa khóa ở đây là quản lý nhóm htable và tạo phiên bản htable bên ngoài DAO. Điều này cho phép bạn mô phỏng chúng một cách rõ ràng và kiểm tra Puts như được hiển thị ở trên. Tương tự, giờ đây bạn có thể mở rộng sang tất cả các thao tác khác như Nhận, Quét, Xóa, v.v.

Sử dụng MRUnit

Với việc kiểm tra đơn vị truy cập dữ liệu thường xuyên được bao phủ, hãy cùng hướng tới các công việc MapReduce đi ngược lại với bảng HBase.

Kiểm tra các công việc MR đi ngược lại với HBase cũng đơn giản như thử nghiệm các công việc MapReduce thông thường. MRUnit giúp dễ dàng kiểm tra các công việc MapReduce bao gồm cả các công việc HBase.

Hãy tưởng tượng bạn có một công việc MR ghi vào bảng HBase, “MyTest”, có một họ cột, “CF”. Việc giảm bớt công việc như vậy có thể giống như sau:

 public class MyReducer mở rộng TableReducer  {public static final byte [] CF ="CF" .getBytes (); public static cuối cùng byte [] QUALIFIER ="CQ-1" .getBytes (); public void Reduce (Text key, Iterable  giá trị, Context context) ném IOException, InterruptException {// nhóm xử lý để trích xuất dữ liệu được chèn vào, trong trường hợp của chúng tôi, giả sử chúng tôi chỉ // nối tất cả các bản ghi mà chúng tôi nhận được từ trình ánh xạ cho khóa // cụ thể này và chèn một bản ghi vào HBase StringBuffer data =new StringBuffer (); Đặt put =new Put (Bytes.toBytes (key.toString ())); for (Văn bản val:giá trị) {data =data.append (val); } put.add (CF, QUALIFIER, Bytes.toBytes (data.toString ())); // ghi vào HBase context.write (new ImmutableBytesWorites (Bytes.toBytes (key.toString ())), put); }} 

Bây giờ bạn làm cách nào để kiểm tra đơn vị trình giảm thiểu ở trên trong MRUnit? Đầu tiên, thêm MRUnit làm phụ thuộc vào pom của bạn.

   org.apache.mrunit   mrunit   1.0.0   test    

Sau đó, trong lớp thử nghiệm, hãy sử dụng ReduceDriver mà MRUnit cung cấp như bên dưới:

 public class MyReducerTest {ReduceDriver  ReduceDriver; byte [] CF ="CF" .getBytes (); byte [] QUALIFIER ="CQ-1" .getBytes (); @Before public void setUp () {MyReducer Reducer =new MyReducer (); ReduceDriver =ReduceDriver.newReduceDriver (bộ giảm tốc); } @Test public void testHBaseInsert () ném IOException {String strKey ="RowKey-1", strValue ="DATA", strValue1 ="DATA1", strValue2 ="DATA2"; List  list =new ArrayList  (); list.add (new Text (strValue)); list.add (new Text (strValue1)); list.add (new Text (strValue2)); // vì trong trường hợp của chúng ta, tất cả những gì trình giảm thiểu đang làm là thêm các bản ghi mà trình ánh xạ // gửi cho nó, chúng ta sẽ lấy lại các bản ghi sau String mong đợiOutput =strValue + strValue1 + strValue2; // Thiết lập đầu vào, bắt chước những gì người lập bản đồ sẽ chuyển // tới bộ giảm và chạy thử nghiệm ReduceDriver.withInput (new Text (strKey), list); // chạy trình giảm và nhận đầu ra của nó Danh sách  kết quả =giảmDriver.run (); // trích xuất khóa từ kết quả và xác minh quyết định khẳng định (Bytes.toString (result.get (0) .getFirst (). get ()), strKey); // trích xuất giá trị cho CF / QUALIFIER và xác minh Đặt a =(Đặt) result.get (0) .getSecond (); Chuỗi c =Bytes.toString (a.get (CF, QUALIFIER) .get (0) .getValue ()); khẳng địnhEquals (dự kiếnOutput, c); }} 

Về cơ bản, sau một loạt quá trình xử lý trong MyReducer, bạn đã xác minh rằng:

  • Đầu ra là những gì bạn mong đợi.
  • Lệnh được chèn vào HBase có “RowKey-1” làm phím hàng.
  • “DATADATA1DATA2” là giá trị cho họ cột CF và bộ định tính cột CQ.

Bạn cũng có thể kiểm tra Mappers lấy dữ liệu từ HBase theo cách tương tự bằng cách sử dụng MapperDriver hoặc kiểm tra các công việc MR đọc từ HBase, xử lý dữ liệu và ghi vào HDFS.

Sử dụng HBase Mini-cluster

Bây giờ chúng ta sẽ xem xét cách bắt đầu kiểm tra tích hợp. HBase đi kèm với HBaseTestingUtility, giúp kiểm tra tích hợp bằng văn bản với cụm mini HBase một cách dễ dàng. Để lấy đúng các thư viện, cần có các phụ thuộc sau trong pom của bạn:

   org.apache.hadoop   hadoop-common   2.0.0-cdh4.2.0   test-jar   test     org.apache.hbase   hbase   0.94.2-cdh4.2.0   test-jar   test     org.apache.hadoop   hadoop-hdfs   2.0.0-cdh4.2.0   test-jar   test     org.apache.hadoop   hadoop-hdfs   2.0.0-cdh4.2.0   test   

Bây giờ, hãy xem cách chạy qua kiểm tra tích hợp cho chèn MyDAO được mô tả trong phần giới thiệu:

 public class MyHBaseIntegrationTest {private static HBaseTestingUtility tiện ích; byte [] CF ="CF" .getBytes (); byte [] QUALIFIER ="CQ-1" .getBytes (); @ Beforepublic void setup () ném Exception {tiện ích =new HBaseTestingUtility (); tiện ích.startMiniCluster ();} @ Kiểm tra public void testInsert () ném Exception {HTableInterface table =tiện ích.createTable (Bytes.toBytes ("MyTest"), Bytes.toBytes ("CF")); HBaseTestObj obj =new HBaseTestObj (); obj.setRowKey ("ROWKEY-1"); obj.setData1 ("DATA-1"); obj.setData2 ("DATA-2"); MyHBaseDAO.insertRecord (bảng, obj); Get get1 =new Get (Bytes.toBytes (obj.getRowKey ())); get1.addColumn (CF, CQ1); Kết quả result1 =table.get (get1); khẳng địnhEquals (Bytes.toString (result1.getRow ()), obj.getRowKey ()); khẳng địnhEquals (Bytes.toString (result1.value ()), obj.getData1 ()); Get get2 =new Get (Bytes.toBytes (obj.getRowKey ())); get2.addColumn (CF, CQ2); Kết quả result2 =table.get (get2); khẳng địnhEquals (Bytes.toString (result2.getRow ()), obj.getRowKey ()); khẳng địnhEquals (Bytes.toString (result2.value ()), obj.getData2 ()); }} 

Tại đây, bạn đã tạo một cụm mini HBase và khởi động nó. Sau đó, bạn đã tạo một bảng có tên “MyTest” với một họ cột, “CF”. Bạn đã chèn một bản ghi bằng DAO mà bạn cần để kiểm tra, đã thực hiện Lấy từ cùng một bảng và xác minh rằng DAO đã chèn các bản ghi một cách chính xác.

Điều tương tự cũng có thể được thực hiện cho các trường hợp sử dụng phức tạp hơn nhiều cùng với các công việc MR như các công việc được hiển thị ở trên. Bạn cũng có thể truy cập các cụm mini HDFS và ZooKeeper được tạo trong khi tạo HBase, chạy một công việc MR, xuất ra HBase và xác minh các bản ghi đã chèn.

Chỉ cần lưu ý nhanh:khởi động một cụm nhỏ mất 20 đến 30 giây và không thể thực hiện được trên Windows nếu không có Cygwin. Tuy nhiên, vì chúng chỉ nên chạy định kỳ nên thời gian chạy lâu hơn có thể chấp nhận được.

Bạn có thể tìm mã mẫu cho các ví dụ trên tại https://github.com/sitaula/HBaseTest. Chúc bạn thử nghiệm vui vẻ!


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hadoop - Hướng dẫn Apache Hadoop cho người mới bắt đầu

  2. Cách thực hiện:Thêm Tìm kiếm Cloudera vào Cụm của bạn bằng Trình quản lý Cloudera

  3. HBase znodes là gì?

  4. Biểu đồ luồng thực thi công việc Hadoop MapReduce

  5. Cách thực hiện:Bật Xác thực và Ủy quyền Người dùng trong Apache HBase