ההבדלים בין HBase לבין Bigtable

אחת הדרכים לגשת ל-Bigtable היא באמצעות גרסה מותאמת אישית של לקוח Apache HBase ל-Java. באופן כללי, לקוח מותאם אישית חושף את אותו API כמו התקנה רגילה של HBase. בדף הזה מוסבר על ההבדלים בין לקוח Cloud Bigtable HBase ל-Java לבין התקנה רגילה של HBase. הרבה מההבדלים האלה קשורים למשימות ניהול ש-Bigtable מבצע באופן אוטומטי.

הלקוח Cloud Bigtable HBase ל-Java מיועד ללקוחות שעוברים ל-Bigtable מ-HBase ורוצים להמשיך להשתמש ב-HBase API. בכל המקרים האחרים, מפתחי Java צריכים להשתמש במקום זאת בלקוח Cloud Bigtable ל-Java, שקורא לממשקי Bigtable API.

קבוצות עמודות

כשיוצרים קבוצת עמודות, אי אפשר להגדיר את גודל הבלוק או את שיטת הדחיסה, לא באמצעות HBase shell ולא באמצעות HBase API. מערכת Bigtable מנהלת את גודל הבלוק ואת הדחיסה בשבילכם.

בנוסף, אם משתמשים במעטפת HBase כדי לקבל מידע על טבלה, מעטפת HBase תמיד תדווח שכל קבוצת עמודות לא משתמשת בדחיסה. בפועל, Bigtable משתמש בשיטות דחיסה קנייניות לכל הנתונים.

ב-Bigtable, שמות של משפחות עמודות צריכים להתאים לביטוי הרגולרי [_a-zA-Z0-9][-_.a-zA-Z0-9]*. אם אתם מייבאים נתונים ל-Bigtable מ-HBase, יכול להיות שתצטרכו קודם לשנות את שמות המשפחות כך שיתאימו לתבנית הזו.

שורות ותאים

  • אי אפשר להגדיר רשימת ACL לשורה בודדת.
  • אי אפשר להגדיר את רמת החשיפה של תאים בודדים.
  • אין תמיכה בתגים. אי אפשר להשתמש במחלקה org.apache.hadoop.hbase.Tag כדי להוסיף מטא-נתונים לתאים בודדים.

שינויים ומחיקות

  • פעולות Append ב-Bigtable הן אטומיות לחלוטין גם לקוראים וגם לכותבים. הקוראים לעולם לא יוכלו לקרוא פעולה של Append שהוחלה באופן חלקי.
  • אפשר למחוק גרסה ספציפית של עמודה ספציפית על סמך חותמת הזמן שלה, אבל אי אפשר למחוק את כל הערכים עם חותמת זמן ספציפית במשפחת עמודות או בשורה נתונה. אין תמיכה ב-methods הבאים במחלקה org.apache.hadoop.hbase.client.Delete:
    • new Delete(byte[] row, long timestamp)
    • addColumn(byte[] family, byte[] qualifier)
    • addFamily(byte[] family, long timestamp)
    • addFamilyVersion(byte[] family, long timestamp)
  • ב-HBase, פעולות מחיקה מסתירות פעולות הכנסה, אבל ב-Bigtable פעולות הכנסה לא מוסתרות אחרי פעולות מחיקה כשבקשות הכנסה נשלחות אחרי בקשות מחיקה. כלומר, ב-Bigtable, בקשת כתיבה שנשלחת לתא לא מושפעת מבקשת מחיקה שנשלחה קודם לאותו תא.

קבלת נתונים וסריקה

מעבדים משותפים

אין תמיכה במעבדים משניים. אי אפשר ליצור כיתות שמטמיעות את הממשק org.apache.hadoop.hbase.coprocessor.

מסננים

בטבלה הבאה מפורטים המסננים הנתמכים. כל המסננים האלה נמצאים בחבילה org.apache.hadoop.hbase.filter.

נתמך נתמך, עם מגבלות לא נתמך
  1. יש תמיכה רק במשפחת עמודות אחת.
  2. אין תמיכה בשיחות ל-setLenAsVal(true).
  3. תמיכה רק באופרטור ההשוואה BinaryComparator. אם משתמשים באופרטור אחר מלבד EQUAL, יש תמיכה רק במשפחה של עמודה אחת.
  4. יש תמיכה רק באופרטורים הבאים:
    • BinaryComparator
    • RegexStringComparator בלי דגלים (המערכת מתעלמת מדגלים) והאופרטור EQUAL
  5. אם PageFilter נמצא ב-FilterList,‏ PageFilter יפעל באופן דומה ל-HBase רק אם FilterList מוגדר ל-MUST_PASS_ALL, שזו התנהגות ברירת המחדל. אם הערך של FilterList מוגדר ל-MUST_PASS_ONE, ‏ Bigtable יתייחס ל-PageFilter כאל MUST_PASS_ALL ויחזיר רק מספר שורות שמתאים ל-pageSize של PageFilter.
  6. PrefixFilter סורק שורות ב-PrefixFilter ברוב המקרים. עם זאת, אם PrefixFilter הוא חלק מFilterList ויש לו את האופרטור MUST_PASS_ONE,‏ Bigtable לא יכול לקבוע את הטווח המרומז, ובמקום זאת מבצע סריקה לא מסוננת משורת ההתחלה לשורת הסיום. כדי לשפר את הביצועים במקרה הזה, אפשר להשתמש ב-PrefixFilter עם BigtableExtendedScan או בשילוב של מסננים.
  7. היא מסתמכת על מסנן התנאים של Bigtable, שיכול להיות איטי. נתמך אבל לא מומלץ.
ColumnPrefixFilter
FamilyFilter
FilterList
FuzzyRowFilter
MultipleColumnPrefixFilter
MultiRowRangeFilter
PrefixFilter 6
RandomRowFilter
TimestampsFilter
ColumnCountGetFilter 1
ColumnPaginationFilter 1
ColumnRangeFilter 1
FirstKeyOnlyFilter 1
KeyOnlyFilter 2
PageFilter 5
QualifierFilter 3
RowFilter 1, 4
SingleColumnValueExcludeFilter 1, 4, 7
SingleColumnValueFilter 4, 7
ValueFilter 4
DependentColumnFilter
FirstKeyValueMatchingQualifiersFilter
InclusiveStopFilter
ParseFilter
SkipFilter
WhileMatchFilter

בנוסף, ההבדלים הבאים משפיעים על המסננים ב-Bigtable:

  • במסננים שמשתמשים באופרטור ההשוואה של ביטויים רגולריים (org.apache.hadoop.hbase.filter.RegexStringComparator), הביטויים הרגולריים משתמשים בתחביר RE2, ולא בתחביר Java.
  • מסננים בהתאמה אישית לא אפשריים. אי אפשר ליצור כיתות שיורשות מ-org.apache.hadoop.hbase.filter.Filter.
  • יש מגבלת גודל של 20KB על ביטויי סינון. כדי לעקוף את הבעיה של הגדלת הגודל של ביטוי מסנן, אפשר להשתמש בעמודה משלימה שבה מאוחסן ערך הגיבוב של קריטריוני הסינון.

חותמות זמן

ב-Bigtable חותמות הזמן מאוחסנות במיקרו-שניות, וב-HBase חותמות הזמן מאוחסנות באלפיות השנייה. להבחנה הזו יש השלכות כשמשתמשים בספריית הלקוח של HBase ל-Bigtable ויש נתונים עם חותמות זמן הפוכות.

ספריית הלקוח מבצעת המרה בין מיקרו-שניות למילי-שניות, אבל מכיוון שחותמת הזמן הגדולה ביותר ב-HBase שאפשר לאחסן ב-Bigtable היא Long.MAX_VALUE/‎1000, כל ערך שגדול יותר מזה מומר ל-Long.MAX_VALUE/‎1000. כתוצאה מכך, יכול להיות שערכים גדולים של חותמות זמן הפוכות לא יומרו בצורה נכונה.

ניהול

בקטע הזה מתוארות שיטות בממשק org.apache.hadoop.hbase.client.Admin שלא זמינות ב-Bigtable, או שפועלות ב-Bigtable באופן שונה מאשר ב-HBase. הרשימות האלה הן חלקיות, ויכול להיות שהן לא משקפות את השיטות האחרונות של HBase API שנוספו.

רוב השיטות האלה לא נחוצות ב-Bigtable, כי משימות הניהול מתבצעות אוטומטית. חלק מהשיטות לא זמינות כי הן קשורות לתכונות ש-Bigtable לא תומך בהן.

משימות תחזוקה כלליות

מערכת Bigtable מטפלת ברוב משימות התחזוקה באופן אוטומטי. כתוצאה מכך, ה-methods הבאות לא זמינות:

  • abort(String why, Throwable e)
  • balancer()
  • enableCatalogJanitor(boolean enable)
  • getMasterInfoPort()
  • getOperationTimeout()
  • isCatalogJanitorEnabled()
  • rollWALWriter(ServerName serverName)
  • runCatalogScan()
  • setBalancerRunning(boolean on, boolean synchronous)
  • shutdown()
  • stopMaster()
  • updateConfiguration()
  • updateConfiguration(ServerName serverName)

קבוצות לפי יישוב

ב-Bigtable אי אפשר לציין קבוצות של אזורים מקומיים עבור משפחות עמודות. כתוצאה מכך, אי אפשר להפעיל שיטות של HBase שמחזירות קבוצת מיקומים.

מרחבי שמות

ב-Bigtable לא משתמשים במרחבי שמות. אפשר להשתמש בתחיליות של מפתחות שורות כדי לדמות מרחבי שמות. השיטות הבאות לא זמינות:

  • createNamespace(NamespaceDescriptor descriptor)
  • deleteNamespace(String name)
  • getNamespaceDescriptor(String name)
  • listNamespaceDescriptors()
  • listTableDescriptorsByNamespace(String name)
  • listTableNamesByNamespace(String name)
  • modifyNamespace(NamespaceDescriptor descriptor)

ניהול אזורים

ב-Bigtable נעשה שימוש בטאבלטים, שדומים לאזורים. מערכת Bigtable מנהלת את הטאבלטים באופן אוטומטי. לכן, השיטות הבאות לא זמינות:

  • assign(byte[] regionName)
  • closeRegion(byte[] regionname, String serverName)
  • closeRegion(ServerName sn, HRegionInfo hri)
  • closeRegion(String regionname, String serverName)
  • closeRegionWithEncodedRegionName(String encodedRegionName, String serverName)
  • compactRegion(byte[] regionName)
  • compactRegion(byte[] regionName, byte[] columnFamily)
  • compactRegionServer(ServerName sn, boolean major)
  • flushRegion(byte[] regionName)
  • getAlterStatus(byte[] tableName)
  • getAlterStatus(TableName tableName)
  • getCompactionStateForRegion(byte[] regionName)
  • getOnlineRegions(ServerName sn)
  • majorCompactRegion(byte[] regionName)
  • majorCompactRegion(byte[] regionName, byte[] columnFamily)
  • mergeRegions(byte[] encodedNameOfRegionA, byte[] encodedNameOfRegionB, boolean forcible)
  • move(byte[] encodedRegionName, byte[] destServerName)
  • offline(byte[] regionName)
  • splitRegion(byte[] regionName)
  • splitRegion(byte[] regionName, byte[] splitPoint)
  • stopRegionServer(String hostnamePort)
  • unassign(byte[] regionName, boolean force)

Snapshots

השיטות הבאות לא זמינות.

  • deleteSnapshots(Pattern pattern)
  • deleteSnapshots(String regex)
  • isSnapshotFinished(HBaseProtos.SnapshotDescription snapshot)
  • restoreSnapshot(byte[] snapshotName)
  • restoreSnapshot(String snapshotName)
  • restoreSnapshot(byte[] snapshotName, boolean takeFailSafeSnapshot)
  • restoreSnapshot(String snapshotName, boolean takeFailSafeSnapshot)
  • snapshot(HBaseProtos.SnapshotDescription snapshot)

ניהול טבלאות

משימות כמו דחיסת טבלאות מתבצעות באופן אוטומטי. לכן, השיטות הבאות לא זמינות:

  • compact(TableName tableName)
  • compact(TableName tableName, byte[] columnFamily)
  • flush(TableName tableName)
  • getCompactionState(TableName tableName)
  • majorCompact(TableName tableName)
  • majorCompact(TableName tableName, byte[] columnFamily)
  • modifyTable(TableName tableName, HTableDescriptor htd)
  • split(TableName tableName)
  • split(TableName tableName, byte[] splitPoint)

מעבדים משותפים

‫Bigtable לא תומך במעבדים משותפים. כתוצאה מכך, השיטות הבאות לא זמינות:

  • coprocessorService()
  • coprocessorService(ServerName serverName)
  • getMasterCoprocessors()

תהליכים מבוזרים

‫Bigtable לא תומך בפרוצדורות מבוזרות. לכן, השיטות הבאות לא זמינות:

  • execProcedure(String signature, String instance, Map<String, String> props)
  • execProcedureWithRet(String signature, String instance, Map<String, String> props)
  • isProcedureFinished(String signature, String instance, Map<String, String> props)