Apache Spark ile Oracle Veritabanından Veri Okumak

Herkese Selam,

Bu yazıda Apache Spark ile Oracle DB’ye bağlanıp doğrudan veri okuyup bir data frame’e yazacağım umarım farkındalık anlamında faydalı bir yazı olur.

Hepimizin şahit olduğu gibi günlük hayatta ürettiğimiz verinin miktarının hızlı bir şekilde artmasını takiben, Big Data teknolojileri hayatımıza çok hızlı bir şekilde giriş yaptı. Artık ihtiyaçlarımızı karşılayabilme adına geleneksel çözümleri bir kenara bırakıp işlerimizi hızlı ve etkin bir şekilde çözebilme kapasitesine sahip araçları kullanmaya başladık. Apache Spark’da bu ihtiyaçlarımızı karşılayabilen kullanımı yaygın bir teknoloji .

Apache Spark çok hızlı ve dağıtık olarak veri işleyebilen bir framework esasında. Bu yazıda Apache Spark teknolojisini ayrıntılı bir şekilde anlatmayacağım için detaylarını merak edenler aşağıdaki linkten Apach Spark ile ilgili dokümantasyona ulaşabilirler.

APACHE SPARK_DOCUMENTATION

Apache Spark ile RDBS veritabanlarımızda sakladığımız verileri işlemek için genellikle tercih edilen yöntem, işleyeceğimiz veriyi önce  hadoop ortamımıza inmek (HDFS) daha sonra dağıtık olarak hadoop’ta  (HDFS) sakladığımız veriyi okuyarak Apache Spark ile işlemek şeklinde gelişiyor.  Hadoop ekosistem deneyimi olanların iyi bildiği üzere, Hadoop ekosistemi ile diğer sistemler  (RDBMS-NOSQL) arasındaki veri alış verişini hadoop ekosisteminde entegre olan araçlardan SQOOP ile gerçekleştiriyoruz. Sqoop, kullanımı oldukça kolay, yaygın ve etkin çalışan bir veri transfer aracı.

İşleyeceğimiz veriyi RDBMS’den önce Hadoop ortamına taşımak, daha sonra buradaki veriyi Apache Spark ile işlenebilcek formata getirmenin bir miktar zahmeti bulunmakta. Özellikle HDFS’e indiğimiz veri daha sonra çok kullanılmayacaksa hem HDFS’te belli bir miktar yer tutacak hemde veri hazırlığı sürecimi uzatacaktır. Bu yöntem yerine özellikle daha sonra çok kullanılmayacak verileri hdfs’e inip orada saklamadan, doğrudan RDBMS’den okuyup kullanmanın Apache Spark ile bir yolu mevcut.

Şimdi bu işlemi nasıl yapacağımıza bakalım.

Örneğe geçmeden önce kullandığım teknolojiler ve versiyonları aşağıdaki gibidir.

Hadoop : Hadoop 2.7.1

Apache Spark: Apache Spark-2.1.0

Oracle Database : Oracle 11g R2 – Enterprise Edition

Linux : SUSE Linux

Bu işlemi yapabilmek için sistemimizde ojdbc6.jar dosyasının olması gerekmekte. Bunu indirmek için aşağıdaki linki kullanabilirsiniz.

http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html

İlk etapta Oracle’dan okuyacağımız tabloları veritabanında yaratalım ve içerisine örnek data koyalım.

CREATE TABLE EMP
(
   EMPNO      NUMBER,
   ENAME      VARCHAR (10),
   JOB        VARCHAR (9),
   MGR        NUMBER,
   SAL        NUMBER,
   COMM       NUMBER,
   DEPTNO     NUMBER
);

INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, 800, 50, 20);

INSERT INTO EMP VALUES
(7499, 'ALLEN', 'SALESMAN', 7698, 1600, 300, 30);

INSERT INTO EMP VALUES
(7521, 'WARD', 'SALESMAN', 7698, 1250, 500, 30);

INSERT INTO EMP VALUES
(7566, 'JONES', 'MANAGER', 7839, 2975, NULL, 20);

INSERT INTO EMP VALUES
(7654, 'MARTIN', 'SALESMAN', 7698, 1250, 1400, 30);

INSERT INTO EMP VALUES
(7698, 'BLAKE', 'MANAGER', 7839, 2850, NULL, 30);

INSERT INTO EMP VALUES
(7782, 'CLARK', 'MANAGER', 7839, 2450, NULL, 10);

INSERT INTO EMP VALUES
(7788, 'SCOTT', 'ANALYST', 7566, 3000, NULL, 20);

INSERT INTO EMP VALUES
(7839, 'KING', 'PRESIDENT', NULL, 5000, NULL, 10);

INSERT INTO EMP VALUES
(7844, 'TURNER', 'SALESMAN', 7698, 1500, 0, 30);

INSERT INTO EMP VALUES
(7876, 'ADAMS', 'CLERK', 7788, 1100, NULL, 20);

INSERT INTO EMP VALUES
(7900, 'JAMES', 'CLERK', 7698, 950, NULL, 30);

INSERT INTO EMP VALUES
(7902, 'FORD', 'ANALYST', 7566, 3000, NULL, 20);

INSERT INTO EMP VALUES
(7934, 'MILLER', 'CLERK', 7782, 1300, NULL, 10);

CREATE TABLE DEPT
(
   DEPTNO   NUMBER,
   DNAME    VARCHAR (14),
   LOC      VARCHAR (13)
);

INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');

COMMIT;

Şimdi Apache Spark’ı Pyspark arayüzü ile (Python Interface) linux terminalinden başlatıyoruz.

/spark-2.1.0-bin-hadoop2.7/bin/pyspark 
--jars "/home/jars/ojdbc6.jar" 
--master yarn-client 
--num-executors 10 
--driver-memory 16g 
--executor-memory 8g

Evet Apache Spark’ı başlattık. Şimdi veritabanından okuma yapacağımız Python kodunu yazalım ve çalıştıralım.

empDF = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:oracle:thin:username/password@//hostname:portnumber/SID") \
    .option("dbtable", "hr.emp") \
    .option("user", "db_user_name") \
    .option("password", "password") \
    .option("driver", "oracle.jdbc.driver.OracleDriver") \
    .load()

Tablodaki veriyi empDF dataframe’ine yazdık şimdi bu dataframe’in içeriğine göz atalım.

 
empDF.printSchema()

empDF.show()

Evet görüldüğü üzere Apache Spark ile Oracle veritabanına doğrudan bağlanıp veriyi hdfs’e inmeden, işlemek için kullanıma hazırladım.

Benzer şekilde bir sorgu sonucunu da aynı şekilde almak mümkün.

query = "(select empno,ename,dname from emp, dept where emp.deptno = dept.deptno) emp"

empDF = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:oracle:thin:username/password@//hostname:portnumber/SID") \
    .option("dbtable", query) \
    .option("user", "db_user_name") \
    .option("password", "password") \
    .option("driver", "oracle.jdbc.driver.OracleDriver") \
    .load()

empDF.printSchema()

empDF.show()


Yukarıda yaptığımız örneklerden de görüleceği üzere kullanımı oldukça kolay ve pratik.

Bu yöntem ile büyük boyutlu tabloları da doğrudan ve paralel bir şekilde yüklemek mümkün ancak bunun performans değerlendirmesini başka bir yazıda yapacağım.

 

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Uncategorized and tagged , , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.