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

Apache Spark đi kèm với Apache HBase với Mô-đun HBase-Spark

Dự án SparkOnHBase trong Cloudera Labs gần đây đã được hợp nhất vào thân Apache HBase. Trong bài đăng này, hãy tìm hiểu lịch sử của dự án và tương lai sẽ như thế nào đối với mô-đun HBase-Spark mới.

SparkOnHBase lần đầu tiên được đẩy lên Github vào tháng 7 năm 2014, chỉ sáu tháng sau Spark Summit 2013 và năm tháng sau khi Apache Spark xuất xưởng lần đầu tiên trong CDH. Hội nghị đó là một bước ngoặt lớn đối với tôi, bởi vì lần đầu tiên tôi nhận ra rằng công cụ MapReduce có một đối thủ cạnh tranh rất mạnh. Spark chuẩn bị bước vào một giai đoạn mới thú vị trong vòng đời mã nguồn mở của nó và chỉ một năm sau, nó được sử dụng ở quy mô lớn ở mức 100, nếu không muốn nói là 1000 công ty (với hơn 200 trong số họ đang làm như vậy trên nền tảng của Cloudera).

SparkOnHBase xuất phát từ một yêu cầu đơn giản của khách hàng là có mức độ tương tác giữa HBase và Spark tương tự như mức độ tương tác đã có giữa HBase và MapReduce. Dưới đây là tóm tắt nhanh về chức năng có trong phạm vi:

  • Toàn quyền truy cập HBase trong bản đồ hoặc giảm bớt giai đoạn
  • Khả năng tải hàng loạt
  • Khả năng thực hiện các hoạt động hàng loạt như lấy, đặt, xóa
  • Khả năng trở thành nguồn dữ liệu cho các công cụ SQL

Bản phát hành ban đầu của SparkOnHBase được xây dựng cho khách hàng của Cloudera đã đồng ý cho phép công khai tác phẩm. Rất may, tôi đã nhận được sự trợ giúp sớm từ các thành viên của Clouderans và HBase PMC là Jon Hsieh và Matteo Bertozzi, và thành viên của Spark PMC là Như Lai Das, để đảm bảo rằng thiết kế sẽ hoạt động cho cả Apache Spark cơ bản cũng như Spark Streaming.

Không lâu trước khi những khách hàng khác bắt đầu sử dụng SparkOnHBase — đáng chú ý nhất là Edmunds.com với ứng dụng Spark Streaming trong thời gian thực cho Super Bowl Sunday. Khi các công ty khác tham gia, rõ ràng là một người duy trì dự án duy nhất (cụ thể là:tôi) sẽ không mở rộng quy mô. May mắn thay, vào thời điểm đó, Cloudera gần đây đã công bố Phòng thí nghiệm Cloudera, đây hóa ra là ngôi nhà hoàn hảo cho dự án. Nói một cách đơn giản, Cloudera Labs là một vùng chứa ảo cho các dự án hệ sinh thái mới nổi còn non trẻ về mức độ sẵn sàng phát triển và tham vọng của doanh nghiệp, nhưng lại có nhu cầu cao bởi những người dùng muốn thử các công nghệ mới nhất. SparkOnHBase đã trở thành một dự án Cloudera Labs trong quá trình đúng hạn.

Hôm nay, tôi vui mừng thông báo rằng SparkOnHBase gần đây đã được cam kết với thân HBase (HBASE-13992). HBASE-13992 thêm SparkOnHBase vào lõi HBase dưới biệt danh mới, mô-đun HBase-Spark. Tôi muốn cảm ơn Chủ tịch HBase Andrew Purtell vì đã động viên và “mở cửa” cho HBASE-13992 và thành viên PMC Sean Busbey vì sự cố vấn và hướng dẫn của anh ấy. Ngoài ra, tôi muốn cảm ơn Elliott Clark, Enis Soztutar, Michael Stack, Nicolas Liochon, Kostas Sakellis, Ted Yu, Lars Hofhansl và Steve Loughran vì những đánh giá mã của họ. (Như bạn có thể thấy, SparkOnHBase là một nỗ lực cộng đồng đích thực.)

Đáng chú ý, với HBASE-13992, lần đầu tiên tôi có thể thêm mã Spark và Scala vào dự án Apache HBase. Thật là vui khi có đặc quyền xây dựng thử nghiệm đơn vị Scala đầu tiên trong lịch sử của HBase!

Bây giờ, hãy đi sâu vào các chi tiết kỹ thuật.

Bên trong HBASE-13992

Trong HBASE-13992, bạn sẽ thấy rằng hầu hết mã gốc và thiết kế từ SparkOnHBase đều không thay đổi. Kiến trúc cơ bản vẫn được giữ nguyên, trong đó phần cốt lõi của mã được thiết kế để có được đối tượng kết nối HBase trong mọi Spark Executor.

Trong khi những điều cơ bản vẫn còn, có ba điểm khác biệt chính giữa bản vá HBASE-13992 và dự án Cloudera Labs SparkOnHBase:

  • API HBase: HBASE-13992 sử dụng tất cả các API HBase 1.0+ mới trong suốt.
  • Các hàm RDD và DStream: Một trong những phàn nàn lớn nhất về SparkOnHBase liên quan đến cách các chức năng được thực thi; Những người yêu thích Spark muốn thực hiện các hành động HBase trực tiếp từ RDD hoặc DStream. Trong HBASE-13992, khả năng đó được tích hợp thông qua các bài kiểm tra đơn vị và các ví dụ. Hơn nữa, có các ví dụ về mã của các hàm HBase trực tiếp ngoài RDD ở phần sau của bài đăng này, vì vậy bạn có thể hiểu được các API sẽ trông như thế nào.
  • Dễ dàng foreachmap chức năng: Giờ đây, việc thực hiện foreachPartition thậm chí còn dễ dàng hơn s và mapPartition s với kết nối HBase. Một ví dụ sẽ theo sau trong bài đăng này.

Bây giờ, chúng ta hãy dành một phút ngắn ngủi và xem qua sự khác biệt giữa cơ sở mã SparkOnHBase và bản vá HBASE-13992. Dưới đây là một ví dụ nhanh về bulkDelete từ SparkOnHBase:

val hbaseContext = new HBaseContext(sc, config);
hbaseContext.bulkDelete[Array[Byte]](rdd,
                  tableName,
                  putRecord => new Delete(putRecord),
                  4);

Lưu ý trong ví dụ này, chúng ta đang gọi một hàm ngay từ đối tượng HBaseContext, mặc dù hoạt động thực sự đang được thực thi trên RDD. Vì vậy, bây giờ chúng ta hãy xem xét mô-đun HBase-Spark cho cùng một mã:

val hbaseContext = new HBaseContext(sc, config)
rdd.hbaseBulkDelete(hbaseContext,
                  tableName,
                  putRecord => new Delete(putRecord),
                  4)

Sự khác biệt lớn là hbaseBulkDelete phương thức đi thẳng ra khỏi RDD. Ngoài ra, cách tiếp cận này mở ra cánh cửa cho các tùy chọn sau với JIRA trong tương lai:

val hbaseContext = new HBaseContext(sc, config)
rdd.hbaseBulkDelete(tableName)

Điều này là sạch như tôi có thể có ngay bây giờ, nhưng mục tiêu là làm cho nó thậm chí còn nhiều hơn nữa đơn giản và sạch sẽ.

Chúng ta cũng hãy xem nhanh các chức năng của foreach và map trong HBASE-13992. Bạn có thể xem trong ForeachPartition ví dụ dưới đây mà chúng tôi có một trình lặp và một HBase Connection vật. Điều này sẽ cung cấp cho chúng tôi toàn quyền để làm bất cứ điều gì với HBase khi chúng tôi lặp lại các giá trị của mình:

val hbaseContext = new HBaseContext(sc, config)
rdd.hbaseForeachPartition(hbaseContext, (it, conn) => {
      val bufferedMutator = conn.getBufferedMutator(TableName.valueOf("t1"))
      ...
      bufferedMutator.flush()
      bufferedMutator.close()
    })

Cuối cùng, đây là một ví dụ về hàm phân vùng bản đồ, nơi chúng ta có thể nhận được một đối tượng kết nối khi chúng ta lặp lại các giá trị của mình:

val getRdd = rdd.hbaseMapPartitions(hbaseContext, (it, conn) => {
        val table = conn.getTable(TableName.valueOf("t1"))
        var res = mutable.MutableList[String]()
        ...
      })

Công việc trong tương lai

Các JIRA sau đây nằm trong danh sách CẦN LÀM của tôi:

HBASE-14150 - Thêm BulkLoad chức năng đối với Mô-đun HBase-Spark

Chẳng bao lâu nữa, chúng tôi sẽ có thể thực hiện tải hàng loạt ngay từ các RDD với mã trông đơn giản như:

 rdd.hbaseBulkLoad (tableName,
             t => {
            Seq((new KeyFamilyQualifier(t.rowKey, t.family, t.qualifier), t.value)).
            iterator
            },
      stagingFolder)

HBASE-14181 - Thêm Nguồn dữ liệu Spark DataFrame vào Mô-đun HBase-Spark

Với bản vá này, chúng tôi sẽ có thể tích hợp trực tiếp Spark SQL với HBase và thực hiện những điều thú vị như đẩy xuống bộ lọc và lựa chọn cột, cùng với đẩy xuống phạm vi quét. Mục tiêu của việc tương tác Spark SQL và HBase đơn giản như sau:

val df = sqlContext.load("org.apache.hadoop.hbase.spark",
      Map("hbase.columns.mapping" -> "KEY_FIELD STRING :key, A_FIELD STRING c:a, B_FIELD STRING c:b,",
      "hbase.table" -> "t1"))
df.registerTempTable("hbaseTmp")

sqlContext.sql("SELECT KEY_FIELD FROM hbaseTmp " +
      "WHERE " +
      "(KEY_FIELD = 'get1' and B_FIELD < '3') or " +
      "(KEY_FIELD <= 'get3' and B_FIELD = '8')").foreach(r => println(" - " + r))

Có những JIRA khác được thiết kế để làm cho mã dễ sử dụng hơn và làm cho bài kiểm tra đơn vị trở nên toàn diện hơn. Mục tiêu cá nhân của tôi là có thể báo cáo lại trong một bài đăng blog tiếp theo với tất cả những tiến bộ tuyệt vời mà chúng tôi đang đạt được. Mục đích là biến Spark trở thành công dân hạng nhất mà nó xứng đáng có được đối với HBase, tiếp tục củng cố nó như một sự thay thế MapReduce trong ngành. Việc thay thế MapReduce bằng Spark sẽ cho phép chúng tôi xử lý nhiều hơn nữa trên các cụm HBase mà không cần lo ngại rằng sẽ có nhiều tranh chấp IO về đĩa hơn.

Sẽ mất thời gian trước khi mô-đun HBase-Spark biến nó thành một bản phát hành của HBase. Trong thời gian chờ đợi, có kế hoạch chuyển một số mã từ mô-đun HBase-Spark vào SparkOnHBase trong Cloudera Labs. Hiện tại, SparkOnHBase hoạt động trên CDH 5.3 và 5.4 và mục tiêu sẽ là cập nhật SparkOnHBase với những tiến bộ của mô-đun HBase-Spark cho phiên bản CDH nhỏ sắp tới vào cuối năm 2015.

Ted Malaska là Kiến trúc sư giải pháp tại Cloudera, người đóng góp cho Spark, Apache Flume và Apache HBase, đồng thời là đồng tác giả của cuốn sách O’Reilly, Kiến trúc ứng dụng Hadoop .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hadoop InputFormat &Các loại InputFormat trong MapReduce

  2. Hadoop MapReduce Tutorial dành cho người mới bắt đầu

  3. Hadoop OutputFormat trong MapReduce là gì?

  4. 6 xuất sắc nhất MapReduce nghề Kỹ thuật Tối ưu hóa

  5. Apache Hadoop Ozone Security - Xác thực