Menjalankan Apache Hive di atas Engine Apache Spark
Tentang Apache Spark
Sebelumnya, kami sudah membahas Apache Spark pada tutorial ini berikut: http://www.planetpintar.net/2017/11/big-data-series-installing-spark-cluster.html
Tentang Apache Hive
Juga untuk Apache Hive pada link berikut ini: https://medium.com/@planet.pintar/berkenalan-dengan-apache-hive-5ea1a9f0e5d5
Apache Hive + Apache Spark
Apache Spark seperti yang kita ketahui merupakan platform High Performance Computing untuk Big Data Analysis. Penggunaan Apache Spark sendiri saat ini mulai menggeser penggunaan Map Reduce pada Hadoop yang dinilai cukup lambat. Namun demikian, Apache Spark sendiri tidak menggantikan fungsi storage system pada Hadoop. Menurut klaim dari pengembangnya, Spark 100 kali lebih cepat dalam memproses data. Cukup masuk akal, karena pemrosesan Spark, sebagian besar ada di memory (RAM) server, dibandingkan dengan Map Reduce yang sebagian besar dilakukan pada CPU.
Apache Hive sendiri seperti yang kita ketahui, secara default berjalan di atas engine Hadoop (Map Reduce). Engine ini dalam beberapa waktu ke depan kabarnya sudah tidak digunakan lagi pada Apache Hive, maka dari itu, dari pengembang Apache Hive sendiri sudah mulai menyarankan untuk beralih ke Spark sebagai query engine.
Menyiapkan Konfigurasi Apache Hive
Sumber dari konfigurasi ini kami ambil dari http://hadooptutorials.info/2017/10/09/part-5-using-spark-as-execution-engine-for-hive/ dengan beberapa modifikasi/penyesuaian. Untuk memulai, tambahkan baris script berikut ini pada file $HADOOP_HOME/hadoop/hive/conf/hive-site.xml
<property>
<name>spark.master</name>
<value>spark://127.0.0.1:7077</value>
</property>
<property>
<name>spark.eventLog.enabled</name>
<value>true</value>
</property>
<property>
<name>spark.eventLog.dir</name>
<value>/tmp</value>
</property>
<property>
<name>spark.executor.memory</name>
<value>1024m</value>
</property>
<property>
<name>spark.serializer</name>
<value>org.apache.spark.serializer.KryoSerializer</value>
</property>
<property>
<name>spark.yarn.jars</name>
<value>hdfs://localhost:8020/spark-jars/*</value>
</property>
Buat symbolic link ke file Jar
ln -s $SPARK_HOME/jars/scala-library*.jar
ln -s $SPARK_HOME/jars/spark-core*.jar
ln -s $SPARK_HOME/jars/spark-network-common*.jar
Di mana $SPARK_HOME pada distro pygmy terletak pada /opt/hadoop-3.1.1–1/hadoop/spark, dan $HIVE_HOME pada /opt/hadoop-3.1.1–1/hadoop/hive.
Copy driver JAR Apache Hive untuk Spark
Jalankan command berikut
cp $HIVE_HOME/lib/*hive*.jar $SPARK_HOME/jars/
Upload file .jar untuk Digunakan oleh YARN
Jalankan command berikut
hdfs dfs -mkdir /spark-jars
hdfs dfs -put $SPARK_HOME/jars/*.jar /spark-jars/
Ubah Setting pada YARN
Tambahkan konfigurasi berikut pada $HADOOP_HOME/hadoop/conf/yarn-site.xml
<property>
<name>yarn.application.classpath</name>
<value>$HADOOP_HOME/hadoop/share/hadoop/mapreduce/*,$HADOOP_HOME/hadoop/share/hadoop/mapreduce/lib/*,$HADOOP_HOME/hadoop/share/hadoop/hdfs/*,$HADOOP_HOME/hadoop/share/hadoop/hdfs/lib/*,$HADOOP_HOME/hadoop/share/hadoop/common/lib/*,$HADOOP_HOME/hadoop/share/hadoop/common/*,$HADOOP_HOME/hadoop/share/hadoop/yarn/lib/*,$HADOOP_HOME/hadoop/share/hadoop/yarn/*</value>
</property><property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_HOME/hadoop/share/hadoop/mapreduce/*,$HADOOP_HOME/hadoop/share/hadoop/mapreduce/lib/*,$HADOOP_HOME/hadoop/share/hadoop/hdfs/*,$HADOOP_HOME/hadoop/share/hadoop/hdfs/lib/*,$HADOOP_HOME/hadoop/share/hadoop/common/lib/*,$HADOOP_HOME/hadoop/share/hadoop/common/*,$HADOOP_HOME/hadoop/share/hadoop/yarn/lib/*,$HADOOP_HOME/hadoop/share/hadoop/yarn/*</value>
</property>
Ubah file hadoop-hdfs-3.1.1.jar/hadoop-default.xml
Ekstrak file hadoop-hdfs-3.1.1.jar buka file hadoop-default.xml, cari property dfs.client.datanode-restart.timeout dan ubah value nya menjadi 30. Setelah itu update lagi ke file hadoop-hdfs-3.1.1.jar.
<property>
<name>dfs.client.datanode-restart.timeout</name>
<value>30</value>
<description>
Expert only. The time to wait, in seconds, from reception of an
datanode shutdown notification for quick restart, until declaring
the datanode dead and invoking the normal recovery mechanisms.
The notification is sent by a datanode when it is being shutdown
using the shutdownDatanode admin command with the upgrade option.
Support multiple time unit suffix(case insensitive), as described
in dfs.heartbeat.interval.
</description>
</property>
Jalankan Spark Master
Jalankan script berikut ini
$ $SPARK_HOME/sbin/start-master.sh
Jalankan Spark Client
$ $SPARK_HOME/sbin/start-client.sh spark://localhost:7077
Buka browser di host komputer/secara remote, akses alamat berikut ini:
http://<ip-server-pygmy>:8080
Coba Query menggunakan Beeline
Berbekal tutorial berikutnya, jalankan query menggunakan fungsi agregat. Ingat, hive tidak akan menggunakan engine tambahan seperti Spark atau Tez, jika query yang akan kita eksekusi tidak mempunyai fungsi agregasi, join, dan sorting.
> select * from product order by name;
Hasil yang akan kita dapat:
Query Hive on Spark job[1] stages: [2, 3]
INFO : Spark job[1] status = RUNNING
INFO : Job Progress Format
CurrentTime StageId_StageAttemptId: SucceededTasksCount(+RunningTasksCount-FailedTasksCount)/TotalTasksCount
INFO : 2018-10-21 15:01:08,117 Stage-2_0: 1/1 Finished Stage-3_0: 0/1
INFO : 2018-10-21 15:01:09,138 Stage-2_0: 1/1 Finished Stage-3_0: 1/1 Finished
INFO : Spark job[1] finished successfully in 2.26 second(s)
INFO : Completed executing command(queryId=hadoop_20181021150106_429fc1cf-dbce-4027-be9d-5759e8eaccf4); Time taken: 2.592 seconds
INFO : OK
INFO : Concurrency mode is disabled, not creating a lock manager
+--------------+---------------+----------------+-------------------+
| product.eid | product.name | product.price | product.catagory |
+--------------+---------------+----------------+-------------------+
| 1104 | Beer | 450 | Beverage |
| 1105 | Bread | 10 | Food |
| 1103 | Cheese | 400 | Food |
| 1106 | Cola | 150 | Beverage |
| 1102 | Shampoo | 70 | Bathroom Eq. |
| 1101 | Soap | 50 | Bathroom Eq. |
| 1107 | Tootbrush | 12 | Bathroom Eq. |
+--------------+---------------+----------------+-------------------+
7 rows selected (2.897 seconds)
Cukup mudah bukan? :)