ההבדלים בין 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, בקשת כתיבה שנשלחת לתא לא מושפעת מבקשת מחיקה שנשלחה קודם לאותו תא.
קבלת נתונים וסריקה
- סריקות הפוכות מאפשרות לקרוא טווח של שורות מהסוף להתחלה. פרטים נוספים מופיעים במאמר בנושא סריקות הפוכות.
- בניגוד ל-HBase, כששולחים בקשת קריאה, Bigtable לא מסננת באופן אוטומטי נתונים שתוקף השימוש בהם פג ומסומנים למחיקה במחזור הקרוב של איסוף נתונים מיותרים. כדי להימנע מקריאת נתונים שתוקף שלהם פג, צריך להשתמש במסנן בבקשת הקריאה. למידע נוסף, עיינו בסקירה כללית של איסוף אשפה.
- אין תמיכה בשאילתות לגבי גרסאות של משפחות עמודות בטווח של חותמות זמן. אי אפשר לקרוא לשיטות הבאות:
org.apache.hadoop.hbase.client.Query#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)org.apache.hadoop.hbase.client.Get#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)org.apache.hadoop.hbase.client.Scan#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
- אין תמיכה בהגבלת מספר הערכים בכל שורה בכל משפחת עמודות. אי אפשר להפעיל את ה-method
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit). - אי אפשר להגדיר את המספר המקסימלי של תאים שיוחזרו לכל קריאה ל-
next(). המערכת מתעלמת מקריאות לשיטהorg.apache.hadoop.hbase.client.Scan#setBatch(int batch). - אין תמיכה בהגדרת מספר השורות לאחסון במטמון. המערכת מתעלמת מקריאות לשיטה
org.apache.hadoop.hbase.client.Scan#setCaching(int caching).
מעבדים משותפים
אין תמיכה במעבדים משניים. אי אפשר ליצור כיתות שמטמיעות את הממשק org.apache.hadoop.hbase.coprocessor.
מסננים
בטבלה הבאה מפורטים המסננים הנתמכים. כל המסננים האלה נמצאים בחבילה org.apache.hadoop.hbase.filter.
| נתמך | נתמך, עם מגבלות | לא נתמך |
|---|---|---|
|
||
ColumnPrefixFilterFamilyFilterFilterListFuzzyRowFilterMultipleColumnPrefixFilterMultiRowRangeFilterPrefixFilter 6RandomRowFilterTimestampsFilter
|
ColumnCountGetFilter 1ColumnPaginationFilter 1ColumnRangeFilter 1FirstKeyOnlyFilter 1KeyOnlyFilter 2PageFilter 5QualifierFilter 3RowFilter 1, 4SingleColumnValueExcludeFilter 1, 4, 7SingleColumnValueFilter 4, 7ValueFilter 4
|
DependentColumnFilterFirstKeyValueMatchingQualifiersFilterInclusiveStopFilterParseFilterSkipFilterWhileMatchFilter |
בנוסף, ההבדלים הבאים משפיעים על המסננים ב-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)