Bài đăng trên blog này đã được xuất bản trên Hortonworks.com trước khi hợp nhất với Cloudera. Một số liên kết, tài nguyên hoặc tham chiếu có thể không còn chính xác.
Vào năm 2016, chúng tôi đã xuất bản phiên bản thứ hai v1.0.1 của Spark HBase Connector (SHC). Trong blog này, chúng ta sẽ điểm qua các tính năng chính mà chúng tôi đã triển khai trong năm nay.
Hỗ trợ người viết mã Phoenix
SHC có thể được sử dụng để ghi dữ liệu ra cụm HBase để xử lý tiếp theo. Nó hỗ trợ tuần tự hóa Avro cho dữ liệu đầu vào và đầu ra và mặc định là tuần tự hóa tùy chỉnh bằng cách sử dụng cơ chế mã hóa gốc đơn giản. Khi đọc dữ liệu đầu vào, SHC đẩy bộ lọc xuống HBase để quét dữ liệu hiệu quả. Với sự phổ biến của dữ liệu Phoenix trong HBase, việc hỗ trợ dữ liệu Phoenix làm đầu vào cho HBase ngoài dữ liệu Avro dường như là điều tự nhiên. Ngoài ra, mặc định là mã hóa nhị phân gốc đơn giản có vẻ dễ bị thay đổi trong tương lai và là rủi ro cho người dùng ghi dữ liệu từ SHC vào HBase. Ví dụ:với SHC trở đi, khả năng tương thích ngược cần phải được xử lý đúng cách. Vì vậy, theo mặc định, SHC cần phải thay đổi sang định dạng chuẩn hơn và được kiểm tra tốt như Phoenix.
Đối với hỗ trợ khóa tổng hợp, trước tính năng này, độ dài giá trị của mỗi thứ nguyên bắt buộc phải được cố định - ngoại trừ kích thước cuối cùng của khóa tổng hợp. Hạn chế này đã được Phoenix coder loại bỏ. Hiện tại, nếu người dùng chọn Phoenix làm bộ mã hóa dữ liệu, họ không cần chỉ định độ dài của từng phần của khóa tổng hợp trong danh mục.
Vì Phoenix là bộ mã hóa mặc định, thay đổi duy nhất đối với người dùng là nếu họ muốn sử dụng PrimitiveType làm bộ mã hóa dữ liệu, họ cần chỉ định “tableCoder”:“PrimitiveType” trong danh mục của họ để thông báo cho SHC rằng họ muốn sử dụng PrimitiveType thay thế của Phoenix là “tableCoder”.
def catalog =s ”” ”{
|” table ”:{“ namespace ”:” default ”,“ name ”:” table1 ″, “tableCoder”:”PrimitiveType”},
| ”rowkey ”:” Key ”,
|” cột ”:{
|” col0 ″:{“cf”:”rowkey”, “col”:”key”, “type”:”string”} ,
| ”col1 ″:{“ cf ”:” cf1 ″, “col”:”col1 ″,“ type ”:” boolean ”},
|” col2 ″:{“cf”:”Cf2 ″,“ col ”:” col2 ″, “type”:”double”},
| ”col3 ″:{“ cf ”:” cf3 ″, “col”:”col3 ″,“ type ” :”Float”},
| ”col4 ″:{“ cf ”:” cf4 ″, “col”:”col4 ″,“ type ”:” int ”},
|” col5 ″:{“Cf”:”cf5 ″,“ col ”:” col5 ″, “type”:”bigint”},
| ”col6 ″:{“ cf ”:” cf6 ″, “col”:”col6 ″, “Type”:”smallint”},
| ”col7 ″:{“ cf ”:” cf7 ″, “col”:”col7 ″,“ type ”:” string ”},
| ”Col8 ″:{“ cf ”:” cf8 ″, “col”:”col8 ″,“ type ”:” tinyint ”}
|}
|}” ””. StripMargin
Kết nối bộ nhớ đệm Spark HBase
SHC đã không lưu trữ các đối tượng kết nối vào HBase trước đây. Cụ thể, lệnh gọi đến ‘ConnectionFactory.createConnection’ được thực hiện mỗi khi SHC cần truy cập các bảng và vùng HBase. Người dùng có thể thấy điều này đơn giản bằng cách xem nhật ký của người thực thi và quan sát các kết nối của người giữ vườn thú được thiết lập cho mỗi yêu cầu. Trong tài liệu về Kết nối giao diện, nó nói rằng việc tạo kết nối là một hoạt động nặng và việc triển khai kết nối là an toàn theo luồng. Do đó, đối với các quy trình tồn tại lâu dài, SHC sẽ rất hữu ích để giữ kết nối được lưu trong bộ nhớ cache. Với tính năng này, SHC giảm đáng kể số lượng kết nối được tạo và cải thiện đáng kể hiệu suất của nó trong quá trình này.
Hỗ trợ họ cột trùng lặp
SHC đã hỗ trợ hỗ trợ họ cột trùng lặp. Giờ đây, người dùng có thể xác định danh mục của họ như sau:
def catalog =s ”” ”{
|” table ”:{“ namespace ”:” default ”,“ name ”:” table1 ″, “tableCoder”:”PrimitiveType”},
| ”rowkey ”:” Key ”,
|” cột ”:{
|” col0 ″:{“cf”:”rowkey”, “col”:”key”, “type”:”string”} ,
| ”col1 ″:{“ cf ”:” cf1 ″, “col”:”col1 ″,“ type ”:” boolean ”},
|” col2 ″:{“cf”:”Cf1 ″,“ col ”:” col2 ″, “type”:”double”},
| ”col3 ″:{“ cf ”:” cf1 ″, “col”:”col3 ″,“ type ” :”Float”},
| ”col4 ″:{“ cf ”:” cf2 ″, “col”:”col4 ″,“ type ”:” int ”},
|” col5 ″:{“Cf”:”cf2 ″,“ col ”:” col5 ″, “type”:”bigint”},
| ”col6 ″:{“ cf ”:” cf3 ″, “col”:”col6 ″, “Type”:”smallint”},
| ”col7 ″:{“ cf ”:” cf3 ″, “col”:”col7 ″,“ type ”:” string ”},
| ”Col8 ″:{“ cf ”:” cf3 ″, “col”:”col8 ″,“ type ”:” tinyint ”}
|}
|}” ””. StripMargin
Trong định nghĩa danh mục ở trên, cột ‘col0’, ‘col1’ và ‘col2’ có cùng họ cột ‘cf1’.
Sử dụng API Spark UnhandledFilters
SHC cũng đã triển khai API Spark, một cách tối ưu hóa hiệu quả. API này cho Spark biết về các bộ lọc SHC không triển khai thay vì trả lại tất cả các bộ lọc. Hành vi trước đó, trong trường hợp này, là áp dụng lại tất cả các bộ lọc khi dữ liệu được kéo trong Spark. Điều này phải là đơn giản, vì vậy không thay đổi bất kỳ dữ liệu nào, nhưng có thể tốn kém nếu bộ lọc phức tạp.
Cộng đồng SHC
Cộng đồng SHC lớn hơn và có ảnh hưởng hơn một năm trước. Vào năm 2016, chúng tôi đã nói chuyện trong Hội nghị thượng đỉnh Hadoop và trong buổi gặp mặt HBase / Spark và viết blog chi tiết. Với số lượng người dùng SHC ngày càng tăng, chúng tôi đang nhận được số lượng câu hỏi của người dùng cao hơn. Chúng tôi rất vui khi thấy SHC ngày càng được áp dụng nhiều hơn và nếu bạn có bất kỳ suy nghĩ nào về cách cải thiện nó hơn nữa, vui lòng cung cấp phản hồi cho chúng tôi qua Kết nối cộng đồng Hortonworks.
LỜI CẢM ƠN
Chúng tôi muốn cảm ơn nhóm Bloomberg đã hướng dẫn chúng tôi trong công việc này và cũng giúp chúng tôi xác nhận công việc này. Chúng tôi cũng muốn cảm ơn cộng đồng HBase đã cung cấp phản hồi của họ và làm cho điều này trở nên tốt hơn. Cuối cùng, công việc này đã tận dụng các bài học từ các tích hợp Spark HBase trước đó và chúng tôi muốn cảm ơn các nhà phát triển của họ đã mở đường.
THAM KHẢO:
SHC:https://github.com/hortonworks-spark/shc
Apache HBase:https://hbase.apache.org/
Apache Spark:http://spark.apache.org/
Apache Phoenix:https://phoenix.apache.org/