פתרון בעיות בהעברה

במאמר הזה מוסבר איך לפתור בעיות נפוצות בהעברת מחסן נתונים (data warehouse) (כמו Teradata,‏ Amazon Redshift,‏ Oracle או Apache Hive) ל-BigQuery, כולל בעיות בהערכת המיגרציה, בתרגום אינטראקטיבי ובאצווה של SQL, וביצירת מטא-נתונים באמצעות כלי החילוץ של שורת הפקודה dwh-migration-dumper.

כדי לבדוק את פרטי הביצוע של העבודות, קודי השגיאה ושימוש במשבצות של שאילתות ועבודות שהועברו, אפשר גם להריץ שאילתה בתצוגה INFORMATION_SCHEMA.JOBS.

הערכת המיגרציה

בקטעים הבאים מוסברות בעיות נפוצות וטכניקות לפתרון בעיות שקשורות להעברת מחסן הנתונים ל-BigQuery.

dwh-migration-dumper שגיאות בכלי

כדי לפתור בעיות שקשורות לשגיאות ולאזהרות בפלט של מסוף הכלי dwh-migration-dumper שהתרחשו במהלך חילוץ מטא-נתונים או יומני שאילתות, אפשר לעיין במאמר פתרון בעיות שקשורות ליצירת מטא-נתונים.

שגיאות בהעברה של Hive

בקטעים הבאים מתוארות בעיות נפוצות שיכולות להתרחש כשמתכננים להעביר את מחסן הנתונים מ-Hive ל-BigQuery.

ה-hook של רישום חילוץ היומנים של שאילתות hadoop-migration-assessment כותב הודעות יומן לניפוי באגים ביומנים של hive-server2. אם נתקלים בבעיות, כדאי לעיין ביומני ניפוי הבאגים של ה-hook של הרישום ביומן, שמכילים את המחרוזת MigrationAssessmentLoggingHook.

טיפול בשגיאה ClassNotFoundException

יכול להיות שהשגיאה הזו נגרמת בגלל מיקום שגוי של קובץ ה-JAR של ה-hook של הרישום ביומן. מוודאים שהוספתם את קובץ ה-JAR לתיקייה auxlib באשכול Hive. לחלופין, אפשר לציין את הנתיב המלא לקובץ ה-JAR במאפיין hive.aux.jars.path – לדוגמה, file://AUXLIB_PATH/HiveMigrationAssessmentQueryLogsHooks_deploy.jar.

תיקיות משנה לא מופיעות בתיקייה שהוגדרה

יכול להיות שהבעיה הזו נגרמת בגלל הגדרה שגויה או בגלל בעיות במהלך אתחול של וו (hook) לרישום ביומן.

מחפשים בhive-server2 יומני ניפוי הבאגים את ההודעות הבאות של ווים לרישום ביומן:

Unable to initialize logger, logging disabled
Log dir configuration key 'dwhassessment.hook.base-directory' is not set,
logging disabled.
Error while trying to set permission

בודקים את פרטי הבעיה כדי לראות אם יש משהו שצריך לתקן כדי לפתור את הבעיה.

הקבצים לא מופיעים בתיקייה

הבעיה הזו יכולה להיגרם מבעיות שנתקלו בהן במהלך עיבוד האירועים או במהלך כתיבה לקובץ.

מחפשים בhive-server2 יומני ניפוי הבאגים את ההודעות הבאות של ווים לרישום ביומן:

Failed to close writer for file
Got exception while processing event
Error writing record for query

בודקים את פרטי הבעיה כדי לראות אם יש משהו שצריך לתקן כדי לפתור את הבעיה.

חלק מהאירועים של השאילתות לא נרשמים

יכול להיות שהבעיה הזו נגרמת בגלל הצפה של תור השרשורים של וו הרישום.

מחפשים בhive-server2 יומני ניפוי הבאגים את הודעת ה-hook הבאה של הרישום ביומן:

Writer queue is full. Ignoring event

אם ההודעה הזו מופיעה, כדאי להגדיל את הפרמטר dwhassessment.hook.queue.capacity.

כלי אינטראקטיבי לתרגום SQL

בקטעים הבאים מתוארות שגיאות נפוצות שמתרחשות במהלך השימוש בכלי האינטראקטיבי לתרגום SQL.

בעיות בתרגום של RelationNotFound או AttributeNotFound

אחרי תרגום שאילתה באמצעות כלי SQL אינטראקטיבי לתרגום, יכול להיות שיתקבל תרגום שנכשל עם השגיאה RelationNotFound או AttributeNotFound.

כדי לראות את התרגומים שנכשלו, עוברים לדף פרטי התרגום ב-BigQuery במסוף Google Cloud ופותחים את הכרטיסייה הודעות יומן.

כדי להבטיח שהתרגום יהיה מדויק ככל האפשר, אפשר להזין את הצהרות שפת הגדרת הנתונים (DDL) של כל הטבלאות שמשמשות בשאילתה לפני השאילתה עצמה. לדוגמה, אם רוצים לתרגם את שאילתת Amazon Redshift select table1.field1, table2.field1 from table1, table2 where table1.id = table2.id;, מזינים את הצהרות ה-SQL הבאות בכלי האינטראקטיבי לתרגום SQL:

create table schema1.table1 (id int, field1 int, field2 varchar(16));
create table schema1.table2 (id int, field1 varchar(30), field2 date);

select table1.field1, table2.field1
from table1, table2
where table1.id = table2.id;

תיקון בעיות בתרגום באמצעות Gemini

כדי לתקן עבודות תרגום שנכשלו עם השגיאות RelationNotFound או AttributeNotFound, אפשר גם להשתמש ב-Gemini כדי לפתור את הבעיות האלה:

  1. ב-BigQuery במסוף Google Cloud , עוברים לדף Translation details (פרטי התרגום) ופותחים את הכרטיסייה Log Messages (הודעות יומן).
  2. לוחצים על השאילתה שמופיעה בה ההודעה RelationNotFound או AttributeNotFound בעמודה קטגוריה.
  3. לוחצים על הצעה לתיקון.
  4. לוחצים על אישור.
  5. כדי לתרגם מחדש את השאילתה, לוחצים על תרגום.

כלי לתרגום SQL באצווה

בקטעים הבאים מתוארות שגיאות נפוצות שמתרחשות במהלך השימוש בכלי לתרגום SQL באצווה.

בעיות בתרגום של RelationNotFound או AttributeNotFound

אחרי תרגום שאילתה באמצעות כלי התרגום של SQL באצווה, יכול להיות שיתקבל תרגום שנכשל עם השגיאה RelationNotFound או AttributeNotFound.

כדי לראות את התרגומים שנכשלו, עוברים לדף פרטי התרגום ב-BigQuery במסוף Google Cloud ופותחים את הכרטיסייה הודעות יומן.

התרגום פועל בצורה הכי טובה עם פקודות DDL של מטא-נתונים. אם לא ניתן למצוא הגדרות של אובייקטים ב-SQL, מנוע התרגום מעלה בעיות מסוג RelationNotFound או AttributeNotFound. מומלץ להשתמש בכלי לחילוץ מטא-נתונים כדי ליצור חבילות מטא-נתונים ולוודא שכל הגדרות האובייקטים קיימות. הוספת מטא-נתונים היא השלב הראשון המומלץ לפתרון רוב שגיאות התרגום, כי השלב הזה לרוב פותר הרבה שגיאות אחרות שנגרמות באופן עקיף מחוסר במטא-נתונים.

מידע נוסף זמין במאמר יצירת מטא-נתונים לתרגום ולבדיקה.

תיקון בעיות בתרגום באמצעות Gemini

כדי לתקן עבודות תרגום שנכשלו עם השגיאות RelationNotFound או AttributeNotFound, אפשר גם להשתמש ב-Gemini כדי לפתור את הבעיות האלה:

  1. עוברים לדף פרטי התרגום ופותחים את הכרטיסייה הודעות יומן.
  2. לוחצים על השאילתה שמופיעה בה ההודעה RelationNotFound או AttributeNotFound בעמודה קטגוריה.
  3. כדי לעבור לקובץ ולשורה שמכילים את השגיאה בכרטיסיית הקוד, לוחצים על

    הודעת שגיאה.

  4. בעמודה פעולה, לוחצים על הצעה לתיקון.

  5. בוחרים באחת מהאפשרויות הבאות, החלה או החלה והפעלה מחדש:

    • כדי להעתיק את קובץ הסכימה שנוצר מספריית הפלט לספריית הקלט, לוחצים על החלה.
    • כדי להעתיק את קובץ הסכימה שנוצר מספריית הפלט לספריית הקלט ולפתוח חלון להרצה חוזרת, לוחצים על החלה והרצה חוזרת.

יצירת מטא-נתונים לתרגום ולהערכה

בקטעים הבאים מוסברות כמה בעיות נפוצות וטכניקות לפתרון בעיות בכלי dwh-migration-dumper.

שגיאת אין זיכרון פנוי

השגיאה java.lang.OutOfMemoryError בפלט של מסוף הכלי dwh-migration-dumper קשורה בדרך כלל לזיכרון לא מספיק לעיבוד הנתונים שאוחזרו. כדי לפתור את הבעיה הזו, צריך להגדיל את הזיכרון הזמין או להקטין את מספר השרשורים לעיבוד.

כדי להגדיל את הזיכרון המקסימלי, אפשר לייצא את משתנה הסביבה JAVA_OPTS:

Linux

export JAVA_OPTS="-Xmx4G"

Windows

set JAVA_OPTS="-Xmx4G"

אפשר לצמצם את מספר השרשורים לעיבוד (ברירת המחדל היא 32) על ידי הוספת ערך לדגל --thread-pool-size. האפשרות הזו נתמכת רק במחברים של hiveql ושל redshift*:

dwh-migration-dumper --thread-pool-size=1

טיפול בשגיאה WARN...Task failed

יכול להיות שמדי פעם תופיע WARN [main] o.c.a.d.MetadataDumper [MetadataDumper.java:107] Task failed: … שגיאה בפלט של מסוף הכלי dwh-migration-dumper. כלי החילוץ שולח כמה שאילתות למערכת המקור, והפלט של כל שאילתה נכתב בקובץ משלו. אם הבעיה הזו מופיעה, סימן שאחת מהשאילתות האלה נכשלה. עם זאת, אם שאילתה אחת נכשלת, זה לא מונע את ההרצה של השאילתות האחרות. אם מופיעות יותר משתי שגיאות WARN, כדאי לבדוק את פרטי הבעיה ולראות אם יש משהו שצריך לתקן כדי שהשאילתה תפעל בצורה תקינה. לדוגמה, אם למשתמש במסד הנתונים שציינתם כשמריצים את כלי החילוץ אין הרשאות לקרוא את כל המטא-נתונים, נסו שוב עם משתמש שיש לו את ההרשאות הנכונות.

קובץ ZIP פגום

כדי לאמת את קובץ ה-ZIP של הכלי dwh-migration-dumper, מורידים את הקובץ SHA256SUMS.txt ומריצים את הפקודה הבאה:

Bash

sha256sum --check SHA256SUMS.txt

התוצאה OK מאשרת שהאימות של סכום הביקורת הצליח. כל הודעה אחרת מצביעה על שגיאה באימות:

  • ‫FAILED: computed checksum did NOT match: קובץ ה-ZIP פגום וצריך להוריד אותו מחדש.
  • ‫FAILED: listed file could not be read: לא ניתן לאתר את גרסת קובץ ה-ZIP. מורידים את קובצי ה-checksum ו-ZIP מאותה גרסת הפצה וממקמים אותם באותה ספרייה.

Windows PowerShell

(Get-FileHash RELEASE_ZIP_FILENAME).Hash -eq ((Get-Content SHA256SUMS.txt) -Split " ")[0]

מחליפים את RELEASE_ZIP_FILENAME בשם קובץ ה-ZIP שהורדתם של כלי החילוץ משורת הפקודה של מהדורת dwh-migration-dumper – לדוגמה, dwh-migration-tools-v1.0.52.zip.

התוצאה True מאשרת שהאימות של סכום הביקורת הצליח.

התוצאה False מציינת שגיאת אימות. מורידים את קובצי ה-ZIP ואת קובץ ה-checksum מאותה גרסת הפצה וממקמים אותם באותה ספרייה.

המידע מיומני השאילתות של Teradata נשלף לאט

כדי לשפר את הביצועים של צירוף טבלאות שצוינו באמצעות הדגלים -Dteradata-logs.query-logs-table ו--Dteradata-logs.sql-logs-table, אפשר לכלול עמודה נוספת מהסוג DATE בתנאי JOIN. העמודה הזו חייבת להיות מוגדרת בשתי הטבלאות וחייבת להיות חלק מהאינדקס הראשי המפוצל. כדי לכלול את העמודה הזו, צריך להשתמש בדגל -Dteradata-logs.log-date-column.

בדוגמה הבאה אפשר לראות איך משתמשים בדגל -Dteradata-logs.log-date-column:

Bash

dwh-migration-dumper \
  -Dteradata-logs.query-logs-table=historicdb.ArchivedQryLogV \
  -Dteradata-logs.sql-logs-table=historicdb.ArchivedDBQLSqlTbl \
  -Dteradata-logs.log-date-column=ArchiveLogDate

Windows PowerShell

dwh-migration-dumper `
  "-Dteradata-logs.query-logs-table=historicdb.ArchivedQryLogV" `
  "-Dteradata-logs.sql-logs-table=historicdb.ArchivedDBQLSqlTbl" `
  "-Dteradata-logs.log-date-column=ArchiveLogDate"

חריגה ממגבלת הגודל של שורה ב-Teradata

ב-Teradata גרסה 15, גודל השורה מוגבל ל-64KB. אם חורגים מהמגבלה, כלי החילוץ נכשל ומציג את ההודעה הבאה:

[Error 9804] [SQLState HY000] Response Row size or Constant Row size overflow

כדי לפתור את השגיאה הזו, אפשר להגדיל את מגבלת השורות ל-1MB או לפצל את השורות לכמה שורות:

  • מתקינים ומפעילים את התכונה 1 MB Perm and Response Rows ואת התוכנה הנוכחית של TTU. מידע נוסף זמין במאמר בנושא הודעה 9804 של Teradata Database.
  • כדי לפצל את הטקסט הארוך של השאילתה לכמה שורות, משתמשים בדגלים -Dteradata.metadata.max-text-length ו--Dteradata-logs.max-sql-length.

הפקודה הבאה מראה איך להשתמש בדגל -Dteradata.metadata.max-text-length כדי לפצל טקסט ארוך של שאילתה לכמה שורות, כל אחת עם עד 10,000 תווים:

Bash

dwh-migration-dumper \
  --connector teradata \
  -Dteradata.metadata.max-text-length=10000

Windows PowerShell

dwh-migration-dumper `
  --connector teradata `
  "-Dteradata.metadata.max-text-length=10000"

הפקודה הבאה מראה איך להשתמש בדגל -Dteradata-logs.max-sql-length כדי לפצל טקסט ארוך של שאילתה לכמה שורות, כל אחת באורך של 10,000 תווים לכל היותר:

Bash

dwh-migration-dumper \
  --connector teradata-logs \
  -Dteradata-logs.max-sql-length=10000

Windows PowerShell

dwh-migration-dumper `
  --connector teradata-logs `
  "-Dteradata-logs.max-sql-length=10000"

בעיה בחיבור ל-Oracle

במקרים נפוצים כמו סיסמה או שם מארח לא תקינים, הכלי dwh-migration-dumper מדפיס הודעת שגיאה משמעותית שמתארת את בעיית הבסיס. עם זאת, במקרים מסוימים, הודעת השגיאה שמוחזרת על ידי שרת Oracle עשויה להיות כללית וקשה לבדיקה.

אחת מהבעיות האלה היא IO Error: Got minus one from a read call. השגיאה הזו מציינת שהחיבור לשרת Oracle נוצר, אבל השרת לא קיבל את הלקוח וסגר את החיבור. הבעיה הזו מתרחשת בדרך כלל כשהשרת מקבל רק חיבורים של TCPS. כברירת מחדל, הכלי dwh-migration-dumper משתמש בפרוטוקול TCP. כדי לפתור את הבעיה, צריך לבטל את כתובת ה-URL של חיבור Oracle JDBC.

במקום לספק את הדגלים oracle-service, host ו-port, אפשר לפתור את הבעיה הזו על ידי אספקת הדגל url בפורמט הבא: jdbc:oracle:thin:@tcps://HOST_NAME:PORT/ORACLE_SERVICE. בדרך כלל, מספר היציאה TCPS שמשמש את שרת Oracle הוא 2484.

בדוגמה הבאה אפשר לראות איך מציינים את כתובת ה-URL של החיבור בפקודה:

dwh-migration-dumper \
  --connector oracle-stats \
  --url "jdbc:oracle:thin:@tcps://HOST_NAME:PORT/ORACLE_SERVICE" \
  --assessment \
  --driver "JDBC_DRIVER_PATH" \
  --user "USER" \
  --password

בנוסף לשינוי פרוטוקול החיבור ל-TCPS, יכול להיות שתצטרכו לספק את הגדרת ה-SSL של trustStore שנדרשת כדי לאמת את אישור השרת של Oracle. אם חסרה הגדרת SSL, מוצגת הודעת שגיאה Unable to find valid certification path. כדי לפתור את הבעיה, מגדירים את משתנה הסביבה JAVA_OPTS:

set JAVA_OPTS=-Djavax.net.ssl.trustStore="JKS_FILE_LOCATION" -Djavax.net.ssl.trustStoreType=JKS -Djavax.net.ssl.trustStorePassword="PASSWORD"

יכול להיות שיהיה צורך לספק גם את ההגדרות של keyStore, בהתאם להגדרות של שרת Oracle. מידע נוסף על אפשרויות ההגדרה זמין במאמר בנושא SSL עם Oracle JDBC Driver.

המאמרים הבאים