Sunday, February 14, 2016

Memahami Software-Software Big Data Melalui Analogi Sederhana

Anda sudah memahami konsep dari Big Data namun bingung dengan daftar software-software Big Data yang beragam? Pertama-tama Anda mungkin mendengar istilah Hadoop dan Map Reduce. Apakah semua itu? Saya akan mencoba membantu Anda memahami semuanya dengan analogi-analogi sederhana berikut.

Hadoop dan HDFS
Kedua istilah diatas sering digunakan terbolak-balik. Perhatikan gambar windows explorer berikut:




Di Windows explorer kita bisa menyimpan file apa saja, misalnya foto-foto liburan atau file-file pekerjaan kantor. Kita tau persis di drive dan folder mana data kita tersimpan. Jika harddisk kita penuh, kita cukup menggunakan media penyimpanan tambahan. Nah bagaimana jika file kita semakin besar dan banyak sekali, apakah menambah media penyimpanan solusi yang tepat? Berikut isu-isu yang akan Anda hadapi:
  • Menambah media penyimpanan tidak menambah computing power, pada satu titik Anda akan mulai kesulitan mengakses file-file tersebut secara cepat karena komputer Anda masih tetap satu dengan beban yang bertambah.
  • Baiklah, Anda berpikir dengan menambah beberapa komputer hasilnya akan lebih baik, benarkah? Tidak sesederhana itu, apakah komputer-komputer tersebut dapat bekerja sama secara paralel untuk menyelesaikan suatu program? Bagaimana Anda akan mengingat file mana ditaruh di komputer yang mana? 
  • Apabila salah satu media penyimpanan Anda itu rusak atau satu komputer Anda rusak, Anda akan kehilangan data Anda yang berharga
Sekarang perhatikan "windows explorer" hadoop berikut.


Pada dasarnya Anda melihat prinsip yang sama. Saya punya folder /user/anto/Hive/Jars yang bisa saya gunakan untuk menyimpan file-file saya. Yang membuatnya berbeda dari windows explorer adalah:
  • Infrastruktur hadoop tersebut terdiri dari beberapa server (lebih dikenal dengan istilah node), sehingga saya sebenarnya tidak tau persis dimana file saya disimpan. Folder tersebut hanyalah representasi logical dari rangkaian node-node hadoop tersebut. Hadoop sebenarnya membagi dan menyebarkan file-file tersebut ke beberapa node.
  • File-file tersebut otomatis terduplikasi pada beberapa node. Artinya apabila terjadi kegagalan hardware, file kita masih tersimpan dengan aman di node yang lain.
  • Node-node tersebut bekerja sama secara paralel untuk menyelesaikan suatu proses.
Mekanisme penyimpanan file yang tersebar di beberapa node inilah yang disebut dengan Hadoop File System atau HDFS. Jadi apakah Hadoop sama dengan HDFS? Berikut ilustrasinya.

HADOOP = HDFS + MAP REDUCE

Hadoop dan Map Reduce
Jika HDFS adalah mekanisme Hadoop menyimpan file di beberapa node, Map Reduce adalah mekanisme bagaimana Hadoop memproses file-file tersebut secara paralel. Detail perbedaan Map Reduce vs Biasa sebenarnya sangat teknikal. Perhatikan contoh kode python berikut yang digunakan untuk menghitung jumlah karakter, kata, dan baris dari suatu dokumen.

from mrjob.job import MRJob class HitungJumlahKata(MRJob): def mapper(self, _, line): //membaca baris per baris dokumen yang masuk yield "chars", len(line) //keluarkan berapa banyak huruf di tiap baris yield "words", len(line.split()) //keluarkan berapa banyak kata di tiap baris yield "lines", 1 //tiap satu baris berarti hitung 1 def reducer(self, key, values): yield key, sum(values//aggregate semua huruf, kata, dan baris  if __name__ == '__main__': HitungJumlahKata.run()

Membingungkan? Well, misalnya kita ingin menghitung jumlah huruf, kata, dan baris dari kalimat berikut:
Jakarta hari ini sungguh macet
Lebih macet dari biasanya

Pada pemograman biasa (bukan Map Reduce), kalimat diatas akan dibaca baris-perbaris oleh program yang kemudian dihitung oleh prosesor (satu thread) di satu komputer. Dengan Map Reduce, kode:

def mapper(self, _, line):

membagi tiap-tiap baris dokumen diatas ke dalam beberapa thread (parallel dalam satu komputer) ataupun ke dalam beberapa komputer. Akibatnya proses bisa berlangsung lebih cepat karena prosesnya berlangsung secara paralel.

def reducer(self, key, values):











Sementara itu reducer mengumpulkan semua hasil proses parallel tadi menjadi satu output.


YARN
YARN sama dengan MapReduce dengan fitur tambahan. YARN atau dikenal dengan MapReduce v2.0 memberikan peningkatan kinerja dan operasional dari MapReduce v1.0. Tidak sekadar menjalankan program secara paralel, YARN memberikan peningkatan berupa:
  1. Pembagian resource infrastruktur hadoop agar dapat berjalan optimal. Maksudnya dalam operasional Map Reduce, ada banyak hal yang perlu dipertimbangkan. Misalnya beberapa user dapat melakukan query secara bersamaan di dalam infrastruktur tersebut. Contoh lain terdapat ResourceManager yang dapat mengatur antrian request-request Map Reduce. 
  2. Terdapat NodeManager yang berfungsi sebagai container dari operasi mapper dan reducer pada setiap node. Penambahan NodeManager ini pada setiap node dapat dilakukan dengan wizard secara mudah


HIVE
Anda mau membuat program Map Reduce setiap saat? Tentu saja tidak terutama apabila kita menangani operasional tabel-tabel database. Bicara mengenai HIVE adalah bicara tentang pemanfaatan Big Data sebagai Data Warehouse (DWH). Misalnya tabel berikut:

No Nama Birthday Age?
1 ANTO FEBRIANTO January 1, 2000
2 AZKA FEBRIANTO January 1, 2010

Untuk menentukan usia, dengan Map Reduce Anda harus membuat program   def mapper(self, _, line): //membaca baris per baris dokumen yang masuk yield line.split()[2], now() - line.split()[3] //mengurangi time now() dengan birthday

Sementara dengan hive, Anda cukup menggunakan SQL
         
         select a.*, now()-a.birthday from table_user

Lebih mudah bukan? Apalagi bagi Anda yang punya latar belakang RDBMS. Dengan Hive, kita terbantu dalam hal:

  1. Menjaga tipe data dalam operasi table terutama join antar tabel
  2. Kemudahan operasi karena menggunkan SQL
  3. Organisasi table dan metadata
Contoh query hive:



SQOOP
Nah sekarang Anda tau hive adalah DWH-nya Big Data, bagaimana cara memindahkan data dari dan ke Database exisiting? Cara manual tentu saja dengan mengupload file CSV atau TSV ke dalam Big Data. Tapi hal ini tidak praktis karena prosesnya tidak "streamline" alias tidak mudah. SQOOP membantu hal tersebut dengan menyiapkan berbagai interface dengan berbagai database. Namun demikian, dari pengalaman probadi, SQOOP bisa dikatakan belum matang untuk operasional. Anda bisa menggunakan ETL pihak ketiga seperti TALEND yang open source. Silahkan lihat pengalaman saya menggunakan TALEND untuk BIG DATA.

IMPALA
Hive "meng-encapsulate" MapReduce kedalam sintak SQL dan tidak mengubah bagaimana operasi program di dalamnya. Di dalam perkembangannya, hal ini tidak optimal karena:

  1. Operasi MapReduce banyak memerlukan I/O (Operasi pembacaan dan penulisan ke harrdisk) sehingga mengalami high latency (perlu waktu dari program diexecute sampai komputer mulai memprosesnya)
  2. Hive tidak benar-benar memafaatkan memori node-node untuk menyimpan tabel-tabelnya. Padahal memori jauh lebih cepat dari harddisk.
  3. Karena hal diatas, Hive tidak cocok dihubungkan langsung dengan platform Visual Analytics dan Business Intellegence seperti Tableau, karena response yang lambat. Hive lebih cocok untuk operasi data yang sangat besar dan diproses secara batch.
Impala memberikan peningkatan performance hive tanpa menggunakan MapReduce dan dengan memafaatkan memori node-node. Namun hingga tulisan ini saya buat, masih terdapat beberapa kekurangan seperti:

  1. Error yang sering terjadi apabila table output yang diproses lebih besar dari memori yang dialokasikan pada Impala
  2. Hanya basic SQL sementara untuk fungsi-fungsi lainnya di hive belum disupport
  3. Komunitas masih terbatas

Secara interface, hive dan impala memiliki desain yang sama, begitu juga dengan cara pengoperasiannya.

HUE
Hue adalah interface yang digunakan untuk berinteraksi dengan modul-modul Big Data seperti Hive, Impala, Sqoop dan lain-lain. Misalnya operasi Hive tanpa Hue berarti menggunakan terminal / command prompt yang jelas tidak user friendly. Hue menyediakan interface yang konsisten untuk semua modul-modul tersebut. Hue berbasis web sehingga mudah diakses dari jaringan.

OOZIE
Sekarang kita sudah mengetahui modul-modul utama dari Big Data namun bagaimana kita bisa menjadwalkan kerja masing-masingnya? Seringkali dalam operasional kita ingin melakukan download data dari RDBMS setiap jam 12 malam, memprosesnya setelah itu di Big Data secara berurutan, dan mengembalikan hasilnya ke RDBMS jam 7 pagi. OOZIE digunakan untuk mengatur hal-hal tersebut. Pada dasarnya untuk membantu proses otomatisasi komputasi pada Big Data.



ZOOKEEPER
Dalam Big Data, fungsi zookeeper sebenarnya tidak terlalu dirasakan oleh end-user. Ini karena ZooKeeper berfungsi untuk mengatur sikronisasi tasks, configurasi, dan status pada pada system terdistribusi (Hadoop yang terdari dari banyak node adalah contoh system terdistribusi). 

SPARK
Ingin menjalankan Machine Learning di Big Data? Spark menyediakan berbagai library machine learning yang memudahkan end-user menjalankannya. Pada dasarnya operasi machine learning berbeda dari operasi RDBMS karena pada machine learning terdapat proses yang sangat iteratif (berulang-ulang). Spark dapat menyimpan temporary operasi ke dalam memori sehingga proses iterarif tersebut dapat dilakukan dengan cepat. Namun tentu saja Spark juga bisa digunakan sebagai replacement atau complementary dari operasi SQL pada hive dan impala. Namun interfacenya masih heavy coding dan untuk operasional adhoc hal ini tidak praktis.

Dibawah terdapat contoh modul-modul utama dari Big Data. Tergantung dari use case Anda, modul yang terinstall mungkin berbeda dari apa yang saya gunakan dibawah. Contoh dibawah adalah use case Big Data sebagai complementary DWH dan sedikit analytics. 



Sebagai tambahan, terdapat beberapa modul lain yang mungkin berguna bagi Anda tergantu use casenya:

HBase
Perlu akses table secara cepat dengan query key? Hbase sangat berguna untuk ini. Pada kasus bank apabila Anda ingin informasi nasabah diretrieve secara cepat dengan memasukkan nomor rekening, hbase akan sangat membantu untuk hal itu.

FLUME
Ingin memasukkan data Twitter secara realtime ke dalam Big Data? Flume dapat digunakan untuk hal tersebut. Flume juga dapat digunakan untuk menyimpan log-log mesin ATM atau log-log server apalikasi berbasis Web.

SOLR
Perusahaan Anda mengeluarkan banyak dokumen-dokumen NOTA atau bagian legal mengeluarkan banyak dokumen dan Anda perlu Search Engine untuk mencari dokumen-dokumen tertentu? Solr seperti "search engine google" (tentu saja tidak secanggih itu). 



Note:
Nah mungkin Anda bertanya-tanya kenapa artikel-artikel tentang Big Data selalu berkaitan dengan analisis social media seperti sentimen atau tentang data-data tak terstruktur namun semua modul-modul yang saya jelaskan diatas tidak ada menyinggung hal tersebut? Itu karena yang anda dengar adalah bagian dari Big Data Case (lihat artikel saya sebelumnya). Bicara mengenai sentimen, Anda harus mengerti bagaimana pendefinisian sentimen dalam Bahasa Indonesia (NLP = Natural Langauge Processing), dan bagaimana memprosesnya menggunakan Machine Learning yang sesuai (Spark MLlib). Setiap modul-modul yang saya jelaskan diatas dapat digunakan secara bersama-sama (bahkan secara real time) untuk menjawab case yang sesuai.

Semoga membantu...

Sunday, January 31, 2016

Penghitung Langkah Kaki menggunakan Accelerometer Handphone

Pernah melihat dan menggunakan Fitbit sebelumnya? Alat kecil seperti gelang ini ketika digunakan ditangan bisa menghitung berapa banyak Anda melangkah setiap hari. Beberapa aplikasi penghitung langkah ini juga banyak tersedia di Android dan Apple. Sebenarnya bagaimanakah mekanisme penghitung langkah ini bekerja? Kali ini kita mencoba mengkaji salah satu caranya menggunakan accelerometer. Fitbit dan alat kommersial lainnya tentu saja punya teknik lainnya yang proprietary. Kita tidak membicarakan cara mereka disini, poinnya adalah untuk mengetahui kira-kira bagaimana alat tersebut bekerja.

Perhatikan cara kerja accelerometer berikut:

Jika digerakkan keatas Y akan bernilai positif dan sebaliknya. Bagaimana kalau handphone sedang dalam keadaan diam? Dia akan negatif karena ada gravitasinya bumi 9.8 m/s2. Bagaimana jika handphone tersebut ditaruh didalam saku celana?


Perhatikan kondisi ketika ketika berjalan dan handphone berapa disaku celana.
  1. Berjalan biasa, berjalan cepat, ataupun berlari akan membuat handphone berayun sesuai dengan langkah kaki. Ayunan ini mengakibatkan ada percepatan yang ditangkap oleh accelerometer pada handphone. Dengan menangkap semua angka pada frekuensi tinggi (100Hz) atau sekitar 100 data poin setiap detik kita akan mendapatkan pergerakan angka-angka ayunan kaki tersebut secara granular.
  2. Langkah kaki pada umumnya bergerak pada bidang planar (mengayun ke atas dan bergerak ke depan). Artinya secara teori hanya dua sumbu accelerometer yang mendeteksi percepatan gerakan.
  3. Pada saku yang tidak ketat, handphone kemungkinan berpindah-pindah posisi sehingga deteksi percepatan mungkin terjadi pada semua sensor axis


Bagaimana kita bisa menyatukan semua gerakan axis accelerometer hingga bisa mendeteksi gerakan? Cara yang sederhana adalah dengan menambahkan nilai kuadrat semua nilainya.

Sensor Number= X2 + Y2 + Z2

Kenapa rumus diatas?
  1. Angka accelerometer ada yang negative, kuadrat akan membuat semua nilai positif
  2. Tipikal gerakan mengayun pada bidang planar secara teori mengakibatkan hanya dua axis yang meregister ayunan
  3. Apabila handphone berputar di dalam saku, pengurangan nilai pada satu axis akan dikompensasi dari nilai axis lainnya, akibatkan jumlah ketiganya secara probabilitas masih dalam angka yang sama


PROGRAM-nya:
Testing menggunakan Samsung Galaxy S4 dengan setting sensor maksimal. Alasannya karena hardware Samsung Galaxy S4 cukup akurat (flagship Samsung) dan sensor maksimal untuk memastikan granularity data.

Set sensor Android di 100Hz:
  @Override
  protected void onResume() {
    super.onResume();
    sensorManager.registerListener(this,
        sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
        SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
            SensorManager.SENSOR_DELAY_FASTEST);
  }


Ambil nilainya:
  @Override
  public void onSensorChanged(SensorEvent event) {
    if ((event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)&&(Running)) {
      getAccelerometer(event);
    }
    if ((event.sensor.getType() == Sensor.TYPE_GYROSCOPE)&&(Running)) {
        getGyroscope(event);
      }
  }

  private void getAccelerometer(SensorEvent event) {
    float[] values = event.values;
    long actualTime = System.nanoTime();
    float x = values[0];
    float y = values[1];
    float z = values[2];
    try {
        result= result+ "ACC\t"+actualTime+"\t"+x+"\t"+y+"\t"+z+"\n";
        counter++;
        if (counter%15==0){
            out.append(result);
            counter=0;
            result="";
        }
    } catch (Exception e){
        e.printStackTrace();
    }

  }


Selain itu, perhatikan hal-hal teknis berikut:
  1. Rekam ke dalam sdcard data hasil sensor minal untuk setiap 20 record. Kecepatan penulisan SDCard berbeda-beda dan kita berusaha menghindari masalah I/O
  2. Prevent Sleeping pada Andorid. Ini supaya sensor terus bekerja meskipun didalam celana
  3. Time series ubah ke dalam System.nanoTime();  untuk memastikan granularity

 Perhatikan plot hasil rekaman accelerometer diatas dalam chart berikut:


Anda lihat? terdapat pola pada setiap langkah kita? Hmm silahkan explore lebih lanjut ya, dengan menquantifisir chart tersebut ke dalam algoritma SAX dan PLA, kita bisa membedakan mana yang jalan biasa, jalan cepat, dan berlari. 

Friday, January 29, 2016

Mempersiapkan Ubuntu agar bisa diinstall dengan Hadoop (Cloudera)

Anda sudah melihat petunjuk instalasi Hadoop (Cloudera) di internet namun setelah mencoba-coba sendiri Anda menemukan proses tersebut tidak selancar apa yang disampaikan? Saya juga mengalami hal yang sama, namun setelah pengalaman instalasi beberapa kali, problem-problem tersebut muncul karena mengabaikan beberapa hal-hal kecil yang perlu dipersiapkan. Big Data Cloudera pada dasarnya distributed computing dimana beberapa server bekerja secara bersama untuk menyimpan dan mengolah data. Setiap server harus saling berkomunikasi dan saling sinkron, bahkan sampai ke detik jam server tersebut! 

Installasi ini sedikit banyak juga berlaku buat OS lain seperti CentOS. Pemilihan saya menggunakan Ubuntu adalah karena kemudahan setting dan update OS-nya yang rutin setiap saat. Instalasi ini mengasumsikan minimal ada 3 node dimana satu node berfungsi sebagai Cloudera Server Manager, satu node untuk Namenode, dan satu node lagi untuk Datanode.
  1. Install Ubuntu dengan USB drive karena Anda akan menginstall pada banyak server / node. Dengan USB Drive kita juga dapat memperbanyak ke USB Drive yang lain sehingga installasi dapat dilakukan secara parallel.
  2. Konek ke internet dan lakukan update setelah installasi selesai.
    • pada layar terminal lakukan sudo apt-get update dilanjutkan dengan sudo apt-get install
    • Lakukan update pada menu system update (search update di start menu)
  3. Salah satu server harus bertindak sebagai ntp server untuk mensinkronkan jam setiap server. Pada server tersebut lakukan 
    • sudo apt-get install ntp
    • setelah terinsall stop terlebih dahulu sudo service ntp stop
    • sync dengan ntp server seperti sudo ntpdate time.nist.gov
    • start kembali ntp server sudo service ntp start
    • Pada server lainnya nanti lakukan sudo ntpdate [server ntp tersebut]
  4. Install java dengan mendownload tarnya pada browser (bawaan Ubuntu adalah firefox). Misalnya jalankan sudo tar -xvf jdk-7u75-linux-x64.tar.gz pada folder /usr/lib/jvm. Hati-hati apabila anda sudah pernah memiliki installasi java sebelumnya karena jika demikian, anda harus pastikan Ubuntu memilih java yang mana untuk Cloudera. Ubah ranking dan akses level sesuai petunjuk di stackoverflow berikut.
    1. sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0_75/bin/java" 1
      sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.7.0_75/bin/javac" 1
      sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.7.0_75/bin/javaws" 1
      This will assign Oracle JDK a priority of 1, which means that installing other JDKs will replace it as the default. Be sure to use a higher priority if you want Oracle JDK to remain the default.
      
      Correct the file ownership and the permissions of the executables:
      
      sudo chmod a+x /usr/bin/java
      sudo chmod a+x /usr/bin/javac
      sudo chmod a+x /usr/bin/javaws
      sudo chown -R root:root /usr/lib/jvm/jdk1.7.0_75
  5. Setting JAVA_HOME di /etc/environment dengan command sudo gedit /etc/environment kemudian tambahkan line JAVA_HOME="/usr/lib/jvm/jdk1.7.0_75/bin"
  6. install ssh-server karena cloudera server manager (satu server yang me-maintain semua node) harus bisa mengakses seluruh server yang lain. 
    • di semua node install sudo apt-get install openssh-server
    • di cloudera manager server dan namenode server buat ssh key dengan command ssh-keygen -t rsa
    • buat authorized keys untuk dengan command cat ~/.ssh/id_rsa.pub authorized_keys
    • copy authorized_keys tersebut disemua node pada folder ~/.ssh/authorized_keys 
  7. Install ethtool dengan command sudo apt-get install ethtool. Ethtool berguna untuk mengubah kecepatan ethernet card server. Perlu diperhatikan kalau Cloudera akan mereport error apabila ada kecepatan ethernet salah satu node tidak sama dengan yang lain. Kejadian ini bisa saja terjadi karena operational Big Data sangat berat di network, seringkali perangkat switch dan ethernet server down atau menurun kecepatannya dari 1Gbs ke 100Mbs. Untuk setting permanent tambahkan line post-up /sbin/ethtool -s $eth0 speed 1000 duplex full autoneg off
  8. Untuk datanode dan namenode di Server-Server tersebut gunakan harddisk yang terpisah dan tiap harddisk menggunakan satu mount sendiri. Apabila harddisk terbatas dan anda ingin harddisk yang terinstall OS juga berfungsi sebagai datanode/namenode, pastikan untuk menginstall quota. Fungsi quota untuk memastikan file datanode Anda membesar melebih kapasitas harddisk untuk OS sendiri. 
    • install quota dengan command sudo apt-get install quota
    • buat quota di folder user seperti mkdir -p /usr/disk-img
    • buat quota misalnya 230GB dengan command dd if=/dev/zero of=/usr/disk-img/disk-quota.ext3 count=450560000
    • edit gedit /etc/fstab tambahkan /usr/disk-img/disk-quota.ext3 /dfs ext3 rw,loop,usrquota,grpquota 0 0
    • Format quota yang sudah dibuat dengan command sudo mkfs -t ext3 -q /usr/disk-img/disk-quota.ext3 -F
    • mount dengan command sudo mount /dfs
  9. Pada harddisk terpisah terutama yang ukurannya lebih dari 2GB gunakan format GPT. Kalau tidak, maksimum kapasitas yang terlihat hanyalah 2GB meskipun kapasitas Harddisk sendiri adalah 4GB. Cara berikut asumsinya Anda pakai harddisk 4GB yang didetect sebagai sbd pada Ubuntu
    • sudo parted /dev/sdb
    • mklabel gpt
    • mkpart primary ext3 0GB 4000.8GB
    • quit
    • sudo mkfs.ext3 /dev/sdb1
  10. Hentikan automatic upgrade apabila semua proses diatas selesai. Perlu diperhatikan untuk menggunakan sistem operasi yang sama berikut versinya pada semua server. Automatic upgrade dapat dicegah dengan command sudo gedit /etc/update-manager/release-upgrades  Prompt=never
Demikian, semoga Anda tidak menemukan error yang pernah saya alami.