More Related Content Similar to Hadoop+spark實作 (20) Hadoop+spark實作2. • Education
– NCU (MIS)
– NCCU (CS)
• Experience Big data & DW
– Raritan, TWM, FET
• Teaching
– III, tcfst, ntunhs
• Community
– TW Spark User Group
– TW Hadoop User Group
• Research
– IoT
– A.I. robot
– Machine learning
• Skills
– PG, TPM, DM, ML, Big data architecture and IOT
4. 名稱 Arduino Uno Arduino Yun RS 3
價格 $25 $69 $35
處理器 ATmega328p ATmega32u4 博通 BCM2387 (4c)
顯示晶片 NA NA VideoCore IV (2c)
記憶體 32KB 64 MB 1GB
儲存單元 SRAM: 2KB
EEPROM: 1KB
SRAM: 2.5KB
EEPORM: 1KB
NA (外接記憶卡)
有線網路 NA NA 10/100 乙太網路
無線網路 NA • IEEE 802.11b/g/n
(Atheros AR9331)
• Flash: 32MB
• IEEE802.11
• 藍芽4.1
應用 感知端 感知端、控制端 感知端、控制端
其他 USB*4
4c: 4 cores
11. • NTP
• chkconfig ntpd on
• services ntpd start
• Edit host
• vi /etc/hosts
• Install jdk
• rpm -ivh /tmp/jdk-7u79-linux-x64.rpm
• ln -s /usr/java/jdk1.7.0_79 /usr/java/java
• Edit jdk profile
• vi /etc/profile
export JAVA_HOME=/usr/java/java
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin
12. • Security
• setenforce 0
• vi /etc/selinux/config
• service iptables stop
• chkconfig iptables off
• Ssh Config
• vi /etc/ssh/ssh_config
• Keygen at master
• ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ""
• cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
• ssh localhost
SELINUX=disabled
StrictHostKeyChecking no
13. • Hadoop 安裝 (hadoop-2.6.4)
• tar -zxvf /tmp/hadoop-2.6.4.tar.gz -C /tmp
• mv /tmp/hadoop-2.6.4 /opt
• ln -s /opt/hadoop-2.6.4 /opt/hadoop
• vi /etc/profile
• source /etc/profile
export HADOOP_HOME=/opt/hadoop/
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
14. • Hadoop 設定
• vi /opt/hadoop/libexec/hadoop-config.sh
• vi /opt/hadoop/etc/hadoop/hadoop-env.sh
• 建立 tmp 目錄
• mkdir -p $HADOOP_HOME/tmp
export JAVA_HOME=/usr/java/java
export JAVA_HOME=/usr/java/java
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
15. • DN 設定
• vi /opt/hadoop/etc/hadoop/slaves
• Hadoop 參數設定
• vi /opt/hadoop/etc/hadoop/core-site.xml
slaver1
slaver2
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
</configuration>
16. • vi /opt/hadoop/etc/hadoop/hdfs-site.xml
• vi /opt/hadoop/etc/hadoop/mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
<?xml version="1.0"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
17. • vi /opt/hadoop/etc/hadoop/yarn-site.xml
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>${hadoop.tmp.dir}/nodemanager/local</value>
</property>
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:8034</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>${hadoop.tmp.dir}/nodemanager/remote</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>${hadoop.tmp.dir}/nodemanager/logs</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
18. • 複製 public key
• ssh-copy-id -i ~/.ssh/id_rsa.pub root@slaver1
• ssh-copy-id -i ~/.ssh/id_rsa.pub root@slaver2
• 複製 hadoop
• scp -rp /opt/hadoop-2.6.4/ root@slaver2:/opt
• scp -rp /opt/hadoop-2.6.4/ root@slaver2:/opt
• 確定軟連結
• ln -s /opt/hadoop-2.6.4 /opt/hadoop
• 複製 profile
• scp /etc/profile root@slaver1:/etc/profile
• scp /etc/profile root@slaver2:/etc/profile
• 格式化 namenode
• hadoop namenode -format
19. • 啟動 hadoop
• start-all.sh
• 檢查服務
• jps
• 關閉 hadoop 服務,因為我們要進行 spark 安裝
• stop-all.sh
master slaver
20. • 安裝 spark (spark-1.6.1-bin-hadoop2.6)
• 設定
• 複製 spark
Spark Standalone 模式
24. • Spark streaming 來的資料,要定期寫入 Mysql
• 開啟 Eclipse,並匯入 ConnectPool 專案
• 調整內部 ip 資訊後,重新編譯產生 jar 檔
25. • Simple Build Tool 常用來編譯 Scala 程式
• 下載 sbt
• https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-
launch/0.13.11/sbt-
launch.jar?_ga=1.166007678.1150428719.1462532280
• 新增資料夾並放入此目錄
• mkdir -p /usr/local/sbt
• 新增並編輯 sbt 檔案於此目錄
• vi sbt
• chmod u+x sbt
• 檢查版本並初始化 (sbt 會下載一些必須函示庫,因此需要一點時間)
• ./sbt -version
http://www.scala-sbt.org/
#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
26. • 直接將 sparkapp 目錄放到家目錄當中
• 請注意,使用 sbt 編譯必須按照此目錄結構的方式
• 準備編譯檔
• vi simple.sbt
• 開始編譯
• cd ~/sparkapp
• /usr/local/sbt/sbt package
name := "Simple Project"
version := "1.0"
scalaVersion := "2.10.5"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.1"
示意圖
27. • 取出結果 jar 檔
• 複製此 jar 檔到 spark 執行目錄
• cp ./target/scala-2.10/writedatatomysql_2.10-1.0.jar
/usr/lib/spark/bin
28. • Spark Streaming 程式 (writedatatomysql_2.10-1.0.jar)
• 寫入 Mysql 程式 (ConnectPool.jar)
• 進入 spark 程式執行區
• cd /usr/lib/spark/bin
• 執行
• ./spark-submit --class com.dt.spark.streaming.WriteDataToMySQL
--jars
/root/sparkapp2/lib/ConnectPool.jar ./writedatatomysql_2.10-
1.0.jar
• 確定沒問題後,先關掉此程式,等前後端 Arduino 完成後才打開
34. • 新增 mosquitto安裝來源 (建議裝在 slaver1)
• vi /etc/yum.repos.d
• yum install mosquitto mosquitto-clients libmosquitto-devel
libmosquittopp-devel python-mosquitto
• ps -aux | grep mosquitto
• 啟動
• mosquitto -c /etc/mosquitto/mosquitto.conf
• 新增編輯
• vi /etc/mosquitto/mosquitto.conf
[home_oojah_mqtt]
name=mqtt (CentOS_CentOS-6)
type=rpm-md baseurl=http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-6/
gpgcheck=1
gpgkey=http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-6//repodata/repomd.xml.key
enabled=1
listener 1883
protocol mqtt
36. • Bridge 功能 (不用自己實作 keepalive 功能)
• $SYS/broker/connection/<clientid>/state
• 參考: http://mosquitto.org/man/mosquitto-8.html
• Message queue 是以 topic 進行區分,每個 client 均可訂閱 topic 獲取資料,
想法是以廣播方式,廣播給所有訂閱的 client
• 相關的 message queue 有: mqtt、xmpp、gcm 等等傳輸方式
• 以 mqtt 實作的產品有 Apache Apollo、HiveMQ、Mosca、Mosquitto、
RabbitMQ (請注意 kafka 目前並無支援)
37. • Paho 是一個免費的開放軟體
• 透過 Paho 方便與 mqtt 服務溝通
• 安裝
• pip search mqtt
• pip install paho-mqtt
• touch /root/iot.log (在 master)
• Paho 自此專案扮演的腳色
• 由 Paho 讀取 Mosquitto 上的資料,以 append 方式寫入檔案
• 透過 tail -F 方式將檔案灌入 spark streaming (在 master 執行)
• 測試程式碼
• 參考 paho1.py
http://www.eclipse.org/paho/
ssh root@192.168.100.163 tail -F /root/iot.log | nc 192.168.100.170 9999 -lk
亦可透過 flume 直接寫入 spark streaming
若要用網頁版,可參考 mqttws31-min.js
38. • 安裝 Mysql (5.1.38) (建議安裝於 slaver2)
• yum -y install mysql mysql-server
• chkconfig mysqld on
• 啟動 mysql
• service mysqld start
• 建立 root 登入密碼
• mysqladmin -u root password '1234'
• 建立資料庫與table
• create database spark;
• use spark;
• create table
create table searchKeyWord(insert_time date, keyword varchar(30), search_count int(11));
依照需求可改變持久層設計,重新改寫
ConnectPool.jar 即可
39. • 用來控制燈泡亮燈 (此做法是 gateway 作法)
• 請執行
• python iot_control_all_system.py
iot_control_all_system.py
read
web control
也可以透過 anduino (mqtt subscriber) 決定亮燈
40. • 準備 Arduino 與溫溼度感知器 (DHT11 )
• 準備 ethernet shield
• 開啟 Arduino IDE 並燒入程式
• 參考 mqttproducer.ino
亦可使用 ESP8266 (無線傳輸) 取代 ethernet
IDE 函式庫
Arduino 1.6.9
dht
PubSubClient
41. • 準備 Arduino、relay、燈泡
• 準備 ethernet shield
• 開啟 Arduino IDE 並燒入程式
• 參考 LAMPBALL.ino
IDE 函式庫
Arduino 1.0.3
WebServer
Streaming
請注意! 此 IDE 版本需為 1.0.3