مقالات

اوراکل و کندو ، چگونه داده ها منتشر می شوند؟


در چند روز گذشته ، من 3 مقاله مرتبط را منتشر کرده ام: اولین ، پوشش گزینه Oracle و Hadoop Integration ، دوم که نحوه نصب و استفاده از کانکتور Oracle SQL را با HDFS و یک سوم توضیح می دهد ، توضیح می دهد که چگونه نصب و استفاده از کانکتور Oracle SQL را با یک کندو توضیح دهید. دو مقاله آخر برخی از سؤالاتی را که من یادداشت های زیر را بررسی کرده ام ، مطرح کرده است.

مستندات می گوید:

جدول خارجی اوراکل یک میز کندو زنده نیست. هنگام تغییر جدول Hive ، باید از ابزار Look برای ارسال داده ها یا ایجاد یک جدول بیرونی جدید استفاده کنید.

من مطمئن نبودم که چگونه این را تفسیر کنم. به خصوص قسمت “تغییرات در یک جدول کندو” و “انتشار داده ها” ایجاد شده است. جدول کندو به داده یا طرح اشاره دارد.

اولی ممکن است به این معنی باشد که داده ها منتقل شده و به سرور اوراکل حافظه پنهان می شوند. از این گذشته ، این همان چیزی است که “داده های جمهوری” به نظر می رسد؟ در واقع ، بسیار عجیب به نظر می رسد ، بسیار بیشتر به عنوان یک ابزار واردات. این مزیت از سرعت بیشتر درخواست و ضرر اجرای دستور را هر بار که منبع داده به روز می شود ، نشان می دهد. اما صبر کنید ، این کار Oracle Loader است ، درست است؟

در بعداً ، این ممکن است به این معنی باشد که پایگاه داده اوراکل در هر درخواست از متاستورهای کندو استفاده می کند. اما چرا از اطلاعات متاستی برای به دست آوردن محل پرونده استفاده نمی کنیم؟

ایجاد و ارسال

فقط یک یادآوری سریع با استفاده از Oracle SQL Loader ، پرونده HDFS و یک جدول Hive را با کلاس “جایگزین خارجی” ادغام می کنید. شما وقتی اولین منبع ورودی را اعلام می کنید ، از استدلال “خلاق” استفاده می کنید. بعداً برای به روزرسانی اطلاعات از آرگومان “انتشار” استفاده می کنید.

hadoop jar $OSCH_HOME/jlib/orahdfs.jar oracle.hadoop.exttab.ExternalTable -conf ./hive.xml -createTable

آیا داده ها در جایی دیگر نقل شده/کپی شده است

در اولین آزمایش من ، دو درخواست را برای شمارش همان جدول Hive متشکل از یک پرونده واحد شروع می کنم. تنها تفاوت بین دو درخواست در این است که مجموعه داده حاوی تعداد متفاوتی از سوابق است. درخواست دوم تعداد صحیح را منعکس می کند ، به این معنی که منبع داده در هر درخواست خوانده می شود.

در تست دوم خود ، دو درخواست را برای شمارش همان جدول Hive متشکل از یک پرونده واحد شروع می کنم. پرونده منبع داده یکسان است ، من فقط آن را از “000000_0” به “000000_1” تغییر نام دادم. نتیجه بسیار جالب است زیرا خطایی را چاپ می کند. در اینجا خروجی است:

SQL> select count(*) from oracle.ext_testdataload_test;
select count(*) from oracle.ext_testdataload_test
*
ERREUR a la ligne 1 :
ORA-12801: erreur signalee dans le serveur de requete parallele P000
ORA-29913: erreur d'execution de l'appel
ORA-29400: erreur de cartouche de donnees
KUP-04095: la commande de preprocesseur
/home/oracle/orahdfs-2.1.0/bin/hdfs_stream a rencontre une erreur "OSCH: Error
processing URI
hdfs://myhost:8020/user/oracle/db/testdataload/000000_0
File does not exist: /user/oracle/db/testdataload/000000_0
at
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocationsUpdateTimes
(FSNamesystem.java:1301)
at
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocationsInt(FSNames
ystem.java:1254)
at
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesyst
em.java:1227)
at
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesyst
em.java:1209)
at
org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getBlockLocations(NameN
odeRpcServer.java:393)
at
org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.g
etBlockLocations(ClientNamenodeProtocolServerSideTranslatorPB.java:170)

البته چنین درخواستی در کندو کاملاً معتبر است. Hive نام پرونده را در متاستی خود ذخیره نمی کند ، بلکه فقط پوشه ای است که در آن ذخیره می شود. فرمان hive -e "use oracle; select count(*) from ext_testdataload_test;" شماره صحیح را چاپ می کند.

بنابراین ، معلوم می شود که اوراکل برای تعریف این طرح از کندو استفاده می کند ، اما نه تعیین محل داده ها.

اطلاعات پرونده ذخیره سازی اوراکل کجاست

با برخی از حفاری ها باید پرونده ای را در دایرکتوری خارجی خود با نام “OSCH-20130527011437-5756-1” با محتوا پیدا کنید ، مشابه با موارد زیر:


locationFile>
  header>
    version>1.0version>
    fileName>osch-20130527011437-5756-1fileName>
    createDate>2013-05-24T22:18:22createDate>
    publishDate>2013-05-27T01:14:37publishDate>
    productName>Oracle SQL Connector for HDFS Release 2.1.0 - ProductionproductName>
    productVersion>2.1.0productVersion>
  header>
  uri_list>
    uri_list_item size="613539" compressionCodec="">hdfs://noe003fn.noe.edf.fr:8020/user/big/omnivision/db/hiveload/000000_0uri_list_item>
  uri_list>
locationFile>

اگر با آزمون دوم من بازی کرده اید ، می توانید تغییر دهید uri_list_item این ملک به صورت دستی برای بازتاب محل پرونده HDFS شما و درخواست شماره شماره صحیح را برمی گرداند.

این پرونده اطلاعات مربوط به این طرح را ذخیره نمی کند. در عوض ، این طرح در هر درخواست استخراج می شود و در 2 پرونده “*.log” تولید شده (محتوای آنها یکسان است!) دور ریخته می شود.

این ناراحت کننده است ، با هر درخواست اطلاعات از متاستی استخراج می شود ، اما اوراکل از متاستی که محل پرونده را ذخیره می کند ، استفاده نمی کند. در عوض ، این شما را وادار می کند که هر بار که داده ها به روز می شوند ، دستور “انتشار” را اجرا کنید.

پایان

در یک گردش کار واقعی ، کهیر کهیر که می خواهید در اوراکل منتشر کنید ، احتمالاً نتیجه برنامه های طولانی و پیچیده MapReduce است. این برنامه ها برای به روزرسانی مطالب جداول نهایی Hive با بازنویسی مجموعه داده های اصلی یا اضافه کردن پرونده های جدید یا پارتیشن برنامه ریزی شده است.

اولین آزمون نشان می دهد که در صورت مشخص شدن پرونده HDFS ، کار اضافی لازم نیست. با این حال ، شما نمی توانید به این رفتار اعتماد کنید. آزمایش دوم نشان می دهد که شما همیشه باید اطلاعات مربوط به جدول Oracle را ارسال کنید.

با استفاده از دستور “نصب خارجی” ، آرگومان “-CreateTable” را به “-Publish” تغییر دهید. دستور نهایی به نظر می رسد:

hadoop jar $OSCH_HOME/jlib/orahdfs.jar oracle.hadoop.exttab.ExternalTable -conf ./hive.xml -publish


Source link

نوشته های مشابه

دیدگاهتان را بنویسید

همچنین ببینید
بستن
دکمه بازگشت به بالا