作者:paul

[Docker] docker-compose定義檔範例

[Docker] docker-compose定義檔範例

當平台漸漸成形,對於外部套件、方案相依性定調以後,每次都要手動建置測試運行環境,即使docker已經把建置動作簡化到一行指令了,但是還是令人覺得瑣碎。

這個時候,docker-compose這個解決方案,大幅的簡化了我們的部署工作:傳送門

它僅需要配置服務定義檔(yml檔名),就可以跟現有的docker images整合,立即建置出所需的架構環境!

version: '2.1'

services:
  memcache:
    image: memcached
    ports:
      - "11211:11211"
    command: memcached -m 1024m

  hadoop:
    image: "sequenceiq/hadoop-docker:2.7.0"
    ports:
     - "8030:8030"
     - "8040:8040"
     - "8042:8042"
     - "8088:8042"
     - "19888:19888"
     - "49707:49707"
     - "50010:50010"
     - "50020:50020"
     - "50070:50070"
     - "5007:5007"
    command: /etc/bootstrap.sh -d

  cassandra:
    image: "cassandra"
    ports:
     - "9042:9042"
    volumes:
     - /mnt/cassandra/data:/var/lib/cassandra
 
  mariadb:
    image: mariadb
    ports:
     - "3306:3306"
    volumes:
     - /mnt/mariadb/data:/var/lib/mysql
     - /mnt/mariadb/config:/etc/mysql/conf.d
    restart: always
    environment:
       MYSQL_ROOT_PASSWORD: 525402040966518776
       MYSQL_USER: ap_user
       MYSQL_PASSWORD: jUqJ75aFbJEU
  
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - mariadb
    environment:
      PMA_HOST: mariadb
      PMA_PORT: 3306
    ports:
     - "8088:80"

  my-python-app:
    depends_on:
     - mariadb
     - cassandra
     - hadoop
     - memcache
    image: python35-app
    volumes:
     - /mnt/python-app/src:/usr/src/app
    ports:
     - "12345:12345"
    command: /usr/src/app/run.sh

註:

1.首先是version,據我所知,目前大部分幾個月前安裝的docker,至少可以支持到2.1,但不見得能支持到3.0的版本。相關upgrade的議題,必須持續survey

2.不需要export的port就不要開,可以透過link或是建立network來進行容器互連

3.可以善用command、environment、volumn等docker支持的掛載與注入的方式來配置容器

4.可以透過現成已build好的image或是動態透過build dockerfile來定義服務。這一段上述例子沒有,有需要時再查使用方式

 

最後,啟動服務群指令(記得加-d,否則會被lock在shell,被script轟炸):

sudo docker-compose up -d

若要下架也很簡單(其他還有run、stop等指令可用)

sudo docker-compose down

 

[CODE WAR記錄] 將Linked-List分成Front,Back2半的Linked-List(難度5)

[CODE WAR記錄] 將Linked-List分成Front,Back2半的Linked-List(難度5)

最近有點偷懶,沒有研究新的東西,blog鬧水荒,但是確實對於python的語法使用上還深深感到不足,因此還是來”高手村”練練功好了..,直接把codewar的練習結果與心得當作一篇好了XD

題目示例如下:

var source = 1 -> 3 -> 7 -> 8 -> 11 -> 12 -> 14 -> null
var front = new Node()
var back = new Node()
frontBackSplit(source, front, back)
front === 1 -> 3 -> 7 -> 8 -> null
back === 11 -> 12 -> 14 -> null

請建立frontBackSplit的程式碼

Read More Read More

[Code War記錄] 給定2參數:每個數字位數的總合與數字位數長度,找出區間內所有符合連續位數(由小到大)的數字組合

[Code War記錄] 給定2參數:每個數字位數的總合與數字位數長度,找出區間內所有符合連續位數(由小到大)的數字組合

之前為了訓練python的語感,去了codewar找題目來練練功,發現了這一題滿有趣的

1.找到所有的數字組合,其每位數的數字加總必須滿足給定的條件值
2.這些數字組合,必須是由小到大連續性的排列組合(例如, 118, 127, 136, 145, 226, 235, 244, 334)

請建立一Function,給定2個參數, x為位數加總的總合,y為預期位數長度,回傳set為3個值,a、b、c,a為滿足的個數,b為滿足的數字中,最小值,c為滿足條件的數字中,最大值

find_all(x, y)

舉例來說:

find_all(10, 3) == [8, 118, 334]
 find_all(27, 3) == [1, 999, 999]

Read More Read More

以Dockerfile建置python-app的映象檔

以Dockerfile建置python-app的映象檔

繼上一篇:初試啼聲以後,我們希望能以更少的動作來佈署我們的應用程式,當然我們也可以一步一步pull下來python環境,然後連進去做一些環境準備,最後commit回來,後續可以export成tar檔或是push到registery中,達到分享與移動。其實這個時候,我們還可以應用到Dockerfile的機制來”包裝”我們的應用程式,讓剛剛所有的事情都可以自動化做掉

Read More Read More

ELK Stack安裝的眉眉角角-Part3:FileBeat

ELK Stack安裝的眉眉角角-Part3:FileBeat

上一篇尾聲記得我還提到,當時沒有使用FileBeat的原因是因為還沒架起來

結果今天重新從 getting started with filebeat的官網文件(傳送門)重新照表操課了一次

結果意外地就架起來了(所以讀官網文件是何等重要的一件事),雖然成果相當的陽春,但是也很足夠記錄下來

首先-設定檔,僅保留最簡單且最必要的部分

我如往常的在mnt下建立了filebeat的目錄,並加入了/mnt/filebeat/filebeat.yml檔案,內容如下

filebeat.prospectors:
- type: log
  enabled: true
  paths:
    - /var/log/mesocollection/*/*.log
  
  reload.enabled: true
  reload.period: 30s

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  hosts: ["elasticsearch:9200"]
  template.enabled: false
  index: "meso_sys_localfile_fb"

註:這邊path因為上一篇google 到可以用*追蹤動態目錄(例如以日期、小時分類目錄)的情況,filebeat一樣可以支持,另外關於elasticsearch的index,我們一併在這邊設定好,後續可以透過es的api來檢查寫入的狀況。關於輸入elasticsearch,我們這次與logstash的file寫入少了定義filelds parsing的流程,這一段目前查詢起來,除了general像是apache、mysql等大應用的log格式(所以可以參考他們的log格式,可以省點事),否則可能必須透過filebeat轉接logstash再透過fileter parsing後,才能寫入自定義的fields到elasticsearch的index中。(待查證)

接著key入以下指令,我們就可以把filebeat的image run起來:

docker run -d --link elasticsearch-test:elasticsearch -v /mnt/filebeat/filebeat.yml:/filebeat.yml -v /mnt/python-app/mesocollection/logs:/var/log/mesocollection prima/filebeat:5

接著我們可以觸發一下記錄log的行為,例如call api,我們輸入docker logs的指令追蹤一下看看:

2017/07/31 02:57:30.841300 log.go:116: INFO File is inactive: /var/log/mesocollection/20170731/grpc_server_10.log. Closing because close_inactive of 5m0s reached.
2017/07/31 02:57:30.841296 log.go:116: INFO File is inactive: /var/log/mesocollection/20170731/RepositorySettingsHelper_10.log. Closing because close_inactive of 5m0s reached.
2017/07/31 02:57:32.836147 log.go:116: INFO File is inactive: /var/log/mesocollection/20170731/MC_Entry_10.log. Closing because close_inactive of 5m0s reached.
2017/07/31 02:57:32.836248 log.go:116: INFO File is inactive: /var/log/mesocollection/20170731/MC_MainService_10.log. Closing because close_inactive of 5m0s reached.
2017/07/31 02:57:32.836211 log.go:116: INFO File is inactive: /var/log/mesocollection/20170731/MC_Return_10.log. Closing because close_inactive of 5m0s reached.
2017/07/31 02:57:45.646417 metrics.go:39: INFO Non-zero metrics in the last 30s: filebeat.harvester.closed=5 filebeat.harvester.open_files=-5 filebeat.harvester.running=-5 publish.events=5 registrar.states.update=5 registrar.writes=1

若出現以上的logs,代表filebeat有偵測到檔案的變動。

接著我們一樣透過$ curl -XPOST http://yourhost:9200/meso_sys_filelog_fb/_search?pretty=true來看看es寫入的狀況

{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 41,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "meso_sys_localfile_fb",
        "_type" : "log",
        "_id" : "AV2WiYNRVf3DdKZYkE65",
        "_score" : 1.0,
        "_source" : {
          "@timestamp" : "2017-07-31T02:46:15.762Z",
          "beat" : {
            "hostname" : "6c8d38b686db",
            "name" : "6c8d38b686db",
            "version" : "5.3.0"
          },
          "input_type" : "log",
          "message" : "2017-07-31 10:46:11,021 - MC_MainService - INFO - entry log : behavior:update_system_user_rdb, data={\"$data$\": \"{\\\"firstName\\\": \\\"I-Ping\\\", \\\"email\\\": \\\"paul@meso-tek.com\\\", \\\"lastName\\\": \\\"Huang\\\"}\", \"$query$\": \"{\\\"id\\\": \\\"0e5564e8-1ac7-45db-9d0b-6f79643ca857-1501469142.056618\\\", \\\"account\\\": \\\"paul\\\"}\"}, files_count=0",
******************************************************略

若有以上的json記錄,那代表elasticsearch也可以正常的寫入了

大部分到此,kibana也不太有什麼問題了。

但問題仍是,因為log message沒有被拆解,所以我們只能把每一行當成是log message欄位來搜尋,對於報表並沒有直接幫助。

因此關於設定log message的機制,究竟只能透過logstash轉接,還是有filebeat的plugin可以用呢?這個列為本週任務來研究看看吧~

以上先記錄了filebeat最簡單的啟用與串接方式囉

 

參考:

FileBeat getting started:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html

How Filebeat works:https://www.elastic.co/guide/en/beats/filebeat/current/how-filebeat-works.html

 

Docker的Hadoop一鍵啟動之旅

Docker的Hadoop一鍵啟動之旅

大數據、雲端運算這麼夯,數據資料的基礎建設是何等的重要,Hadoop基本上是個分佈式的開源應用程式框架(任意門),除了提供經典的MapReduce的平台,另外還支援分佈式的檔案系統,會說它是經典是因為現在的實務的應用程式已經都轉移到Apache Spark去了,這邊就暫且不提。

 

一般hadoop要有成效,至少要有4台主機以上….因此要建置Hadoop Distributed File System,最簡單的方式,還是透過Docker了

DockerHub上就有公司很友善的提供了Image來讓我們可以建置(試用)Hadoop(支援到Hadoop 2.7版本) …傳送門

看過Hadoop安裝於Linux的許多教學後(從java安裝到node設定,會有點想死),會萬千感謝提供這個Images的善心人士整個弄到可以一鍵安裝

 

廢話不多說,Hadoop Image Docker啟動命令:

sudo docker run -d --name=hadoop-dev-server \
	-p 8020:8020 \
	-p 8030:8030 \
	-p 8040:8040 \
	-p 8042:8042 \
	-p 8088:8088 \
	-p 19888:19888 \
	-p 49707:49707 \
	-p 50010:50010 \
	-p 50020:50020 \
	-p 50070:50070 \
	-p 50075:50075 \
	-p 50090:50090 \
	-p 9000:9000 \
	762e8eefc162 /etc/bootstrap.sh -d

建立好以後我們列表出來所有的container,發現,他已經好好的在運行了。

c93953e56bb6 762e8eefc162 “/etc/bootstrap.sh -d” 9 hours ago Up 9 hours 0.0.0.0:8020->8020/tcp, 2122/tcp, 0.0.0.0:8030->8030/tcp, 0.0.0.0:8040->8040/tcp, 0.0.0.0:8042->8042/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:19888->19888/tcp, 0.0.0.0:49707->49707/tcp, 0.0.0.0:50010->50010/tcp, 0.0.0.0:50020->50020/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 8031-8033/tcp, 0.0.0.0:50090->50090/tcp hadoop-dev-server

註:這個image可以讓我們一鍵啟動Single Node來試著與他的介面試著交互,然而若要實作多node的hadoop,來建立真正的分散式服務,怎麼辦?

一樣透過docker啊,多好,又有人建立了dockerfile(傳送門again),這邊先不談,先把基礎環境建立與操作方法做一篇記錄:

 

這裡面有好多port都bind出來了,但僅介紹一些常用Port,有部分Port估計是分散式架構下在用的,首先是50070,這個是Web介面,除了可以看到Hadoop Service的運行狀態,空間使用狀況,還可以看到檔案目錄清單

接著是9000,預設HDFS協定的Port,等等我們立馬來使用看看

Hadoop的檔案系統的使用方式,我知道有2種(有沒有其他方式,待後續一探究竟)

一種就是透過Web的方式,Python裡面可以安裝WebHDFS套件,透過http://xxxxx:50070,實際上是透過Restful Api進行檔案傳輸

而另一個就是直接透過hdfs協定,然而,要透過HDFS協定,就要先安裝Hadoop的程式,官網

(注意版本…目前Hadoop 2.7版本,請下載盡量相近的Hadoop版本,我就有遇到用太舊的hadoop程式去連2.7版的,出現的錯誤訊息是IPC version 9 cannot communicate with client version 4,追查了一下發現只是版本太舊的問題,透過以下下載安裝方式,就可以解決了)

這一塊因為必須具備Hdfs 的driver,所以必須要有相關的環境,像我在windows 上跑的python就因為driver問題,而選擇透過webhfds來交互

 

這次我下載的是hadoop-2.6.5 binary的版本(我之前去下載一些舊版本的hdfsclient的程式,就有遇到過不相容的狀況)

#wget http://apache.stu.edu.tw/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz

#tar -xzcf hadoop-2.6.5.tar.gz

經過一連串解壓以後,我們多了一個Hadoop 2.6.5的目錄,然而,Hadoop的程式是透過Java 寫的,所以要運行起來的話,Java 環境也是必要安裝

一種是透過手動的方式配置,詳細記錄如下:

tar -zxvf /home/paul/download/jdk-8u144-linux-x64.tar.gz -C /usr/local
mv /usr/loca/jdk-8u144-linux-x64.tar.gz /usr/local/jdk
sudo /etc/profile.d/development.sh

# 加入以下內容
JAVA_HOME=/usr/local/jdk
CLASSPATH=.:$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH

# 立即生效
. /etc/profile
ln -s -f /usr/local/jdk/bin/java /usr/bin/java
ln -s -f /usr/local/jdk/bin/javac /usr/bin/javac

# 關閉selinux
sudo nano /etc/selinux/config
# 將SELINUX=enforcing改為SELINUX=disable
# 查看java版本
java -version

另一種就是透過centos的方式安裝

#sudo yum install java

#java -version

印出以下代表運行java 該有的環境已經有了

openjdk version “1.8.0_141”
OpenJDK Runtime Environment (build 1.8.0_141-b16)
OpenJDK 64-Bit Server VM (build 25.141-b16, mixed mode)

然後,我們立即對我們的容器進行hdfs連結

#cd ~/hadoop-2.6.5/bin

#./hdfs dfs -ls hdfs://localhost:9000/

註:若透過後者easy_install的方式安裝java,執行hadoop時若有出現JAVA_HOME未配置的話,就要再export JAVA_HOME=/usr/local/jdk就可以了

若有顯示檔案根目錄(理論上跟web:50070所看到的目錄結構應該要一致)

Found 3 items
drwxr-xr-x – root supergroup 0 2017-06-27 16:39 hdfs://localhost:9000/exchange
drwxr-xr-x – root supergroup 0 2017-07-26 11:28 hdfs://localhost:9000/upload_files
drwxr-xr-x – root supergroup 0 2015-07-22 23:17 hdfs://localhost:9000/user

那就代表大功告成啦啦啦啦,後續直接對這個檔案系統操作的話,再參考相關指令集教學

例如上傳檔案的話,可以透過

~/hadoop-2.6.5/bin/hdfs dfs -put ~/test.txt hdfs://localhost:9000/upload_files

不過,馬上就會面臨到權限問題:

put: Permission denied: user=paul, access=WRITE, inode=”/test.txt._COPYING_”:root:supergroup:drwxr-xr-x

web就可以直接指定root,但linux連過去會依目前的使用者作為user

因此,可以得知,只要su到root,再執行/home/paul/hadoop-2.6.5/bin/hdfs dfs -put /home/paul/test.txt hdfs://localhost:9000/upload_files就可以了

drwxr-xr-x – root supergroup 0 2017-07-26 11:50 hdfs://localhost:9000/upload_files/exchange
-rw-r–r– 3 root supergroup 5 2017-07-27 01:29 hdfs://localhost:9000/upload_files/test.txt

至於要怎麼解決這個問題,包含透過使用者有自行的目錄權限,就還需要再研究了,等明天看看吧…時候不早了..

待閱讀:hadoop權限問題參考

WP Facebook Auto Publish Powered By : XYZScripts.com