Spark ile Oracle ve Cassandra Üzerinde Veritabanı İşlemleri

Herkese Selam,

Bu yazıda Spark ile Cassandra veritabanına veri yazma ve veri okuma işlemi gerçekleştireceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

 

Günümüzde veri kaynaklarının ve veri miktarlarının hızla artması, geleneksel yöntemler ile toplanan verinin işlenmesini zorlaştırmıştır. Toplanan veri miktarının artması aynı zamanda verinin işlenme ihtiyacını her geçen gün arttırmıştır. Bu ihtiyaç ve zorlukları takiben büyük verinin hızlı analiz edilmesi ve depolanması ile ilgili çeşitli çözümler üretilmiştir. Spark verinin işlenmesi tarafında günümüzde kullanılan en yaygın ve performanslı bir çözüm iken Cassandra‘da büyük verinin depolanması ve sorgulanması konusunda endüstride yaygın kullanılan veritabanlarından biridir. Bu makalede bu iki güncel teknolojiyi bir arada kullanmayı deneyeceğiz.

Öncelikle bu örneği yaparken kullandığım yazılımlar hakkında bilgi vermek istiyorum.

İşletim Sistemi: SUSE

Spark: Spark 2.1.0

Oracle Database : Oracle 11g R2

Cassandra: Cassandra 3.4

Hadoop: Hadoop 2.7

İlk olarak Spark ile Oracle veritabanına bağlanıp örnek bir veri çekelim ve bunu hdfs’e yazalım.  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

Şimdi Oracle’dan okuyacağımız tabloyu 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);

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()

empDF.show()

empDF.select('EMPNO','ENAME','JOB','MGR','SAL','COMM','DEPTNO').write.format('com.databricks.spark.csv').save('/employees/')

Evet veriyi Oracle’dan Spark ile okuyup hdfs’e yazdık. Şimdi bu veriyi Cassandra veritabanında saklayacağımız tabloyu cassandra’da yaratalım.

CREATE TABLE emp(
empno int,
ename text,	
job text,
mgr text,
sal text,
comm text,
deptno text,
primary key(empno)	
);

Şimdi yeni bir pyspark başlatalım ve hdfs’e yazdığımız veriyi okuyup cassandra veritabanına yazalım. Ancak bunu yapmadan önce cassandra veritabanı ile bağlantı kurabilmek için bazı .jar dosyalarına ihtiyacımız bulunuyor. Bu .jar dosyalarını indirdikten sonra pyspark’ı bu jar dosyalarını kullanarak başlatıyoruz.

* spark-cassandra-connector-2.4.0-s_2.11.jar
* jsr166e-1.1.0.jar
* pyspark-cassandra-0.8.0.jar

/spark-2.1.0-bin-hadoop2.7/bin/pyspark \
  --jars /jar_s/spark-cassandra-connector-2.4.0-s_2.11.jar,/jar_s/jsr166e-1.1.0.jar\
  --py-files /jar_s/pyspark-cassandra-0.8.0.jar \
  --conf spark.cassandra.connection.host= CASSANDRA_IP_ADDRESS
from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext
from pyspark.sql import Row
from pyspark.sql import HiveContext
from pyspark.sql.functions import *


hive_context = HiveContext(sc)
sqlContext = SQLContext(sc)

RecEmp = Row('empno','ename','job','mgr','sal','comm','deptno')


dataEmp = sc.textFile("/employees/")
recEmp = dataEmp.map(lambda l: l.split(","))
dataEmp = recEmp.map(lambda l: RecEmp(float(l[0]),l[1],l[2],(l[3]),(l[4]),(l[5]),(l[6])))
dfEmp = hive_context.createDataFrame(dataEmp)
dfEmp.registerTempTable("emp")


spark = SparkSession.builder \
  .appName('SparkCassandraApp') \
  .config('spark.cassandra.connection.host', 'CASSANDRA_IP_ADDRESS') \
  .config('spark.cassandra.connection.port', 'CASSANDRA_PORT') \
  .config('spark.cassandra.auth.username','CASSANDRA_USER') \
  .config('spark.cassandra.auth.password','CASSANDRA_PASS') \
  .master('local[2]') \
  .getOrCreate()

Hdfs’e daha önce yazdığımız veriyi okudum ve cassandra bağlantılarını kurdum. Şimdi hdfs’den okuduğumuz veriyi cassandra veri tabanına yazalım.

dfEmp.write\
    .format("org.apache.spark.sql.cassandra")\
    .mode('append')\
    .options(table="emp", keyspace="test")\
    .save()

Evet data cassandra’ya başarılı bir şekilde yazıldı. Şimdi cassandra üzerinden veriyi kontrol edelim.

select * from emp;

Verinin başarılı bir şekilde yazıldığını gördük. Şimdi cassandraya yazdığımız veriyi Spark ile okuyup. Pyspark ile console üzerinde gösterelim.

ds = sqlContext \
  .read \
  .format('org.apache.spark.sql.cassandra') \
  .options(table='emp', keyspace='test') \
  .load()

ds.show()

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in 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 )

Connecting to %s

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