在Raspbian buster上运行Elastic Stack 7.5.1(有7.2以后的信息)
首先
对不起,没有在构建方法中提及编程技术。
随着5G的普及,最近物联网领域中边缘设备的数据分析正变得越来越受欢迎,并且有望随着5G的推广而加速发展。树莓派4B在国内开始销售,这使得边缘环境中的数据收集、分析和可视化成为现实。
在这里,我们记录了在树莓派上运行ElasticStack的方法。
ElasticStack是一款64位前提的产品,虽然它没有正式支持ARM架构,但它是一个移植性很高的Java/JavaScript平台的产品,所以您只需进行一些简单的工作即可使其运行。
[補充]從7.6.0版本開始,我們使用docker進行構建。
在Raspberry Pi 4B的docker上運行Elastic Stack 7.6.0。
前提条件
-
- Raspberry Pi 3B+/4B(RAM 4GB)
OS : Raspbian Buster (2020/1/4時点で apt upgrade 実施)
假设使用NOOBS安装的软件包组成,已经安装了Open JDK 11和Node.js 10.15.2。
设置根密码,并更改内核参数。
pi@raspberrypi:~ $ sudo passwd root
新しいパスワード:
新しいパスワードを再入力してください:
passwd: パスワードは正しく更新されました
pi@raspberrypi:~ $ su -
パスワード:
root@raspberrypi:~# echo "vm.max_map_count=262144" >> /etc/sysctl.conf
root@raspberrypi:~# sysctl -p
vm.max_map_count = 262144
一般来说,我们会确认各个版本。
重点是确认 Open JDK 的版本是「11」,以及 Node.js 的版本是「10.15.2」。
root@raspberrypi:~# uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux
root@raspberrypi:~# java --version
openjdk 11.0.5 2019-10-15
OpenJDK Runtime Environment (build 11.0.5+10-post-Raspbian-1deb10u1)
OpenJDK Server VM (build 11.0.5+10-post-Raspbian-1deb10u1, mixed mode)
root@raspberrypi:~# node -v
v10.15.2
从Kibana 7.2到7.4,需要编译nodegit,但在7.5.1中不再需要。
为了备用,以下是编译nodegit的准备命令,适用于7.2到7.4版本的Kibana。
[Kibana 7.2〜7.4の場合のみ実施]
root@raspberrypi:~# apt install libssh-dev libcurl4-openssl-dev
root@raspberrypi:~# ln -sr /usr/lib/arm-linux-gnueabihf/libcurl.a /usr/local/lib/libcurl.a
root@raspberrypi:~# mkdir -p /usr/local/ssl/lib
root@raspberrypi:~# ln -sr /usr/lib/arm-linux-gnueabihf/libssl.a /usr/local/ssl/lib/libssl.a
root@raspberrypi:~# ln -sr /usr/lib/arm-linux-gnueabihf/libcrypto.a /usr/local/ssl/lib/libcrypto.a
root@raspberrypi:~# ldconfig
安装和配置Elasticsearch
这是关于Elasticsearch安装、配置以及调整树莓派上熟悉的JVM内存设置的说明。(以pi用户身份进行操作)
pi@raspberrypi:~ $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-linux-x86_64.tar.gz
pi@raspberrypi:~ $ tar xzvf elasticsearch-7.5.1-linux-x86_64.tar.gz
pi@raspberrypi:~ $ ln -s elasticsearch-7.5.1 elasticsearch
pi@raspberrypi:~ $ echo "network.host: 0.0.0.0" >> elasticsearch/config/elasticsearch.yml
pi@raspberrypi:~ $ echo "discovery.type: single-node" >> elasticsearch/config/elasticsearch.yml
pi@raspberrypi:~ $ echo "xpack.ml.enabled: false" >> elasticsearch/config/elasticsearch.yml
pi@raspberrypi:~ $ perl -pi -e "s/Xms1g/Xms512m/" elasticsearch/config/jvm.options
pi@raspberrypi:~ $ perl -pi -e "s/Xmx1g/Xmx512m/" elasticsearch/config/jvm.options
通过在名为「elasticsearch」的目录中创建符号链接,可以避免在版本更改时修改systemd的服务启动文件。
虽然不详细解释Elasticsearch的配置选项,但请将「xpack.ml.enabled」设置为「false」。
这是一个用于付费许可的机器学习扩展功能,因为它在32位环境下无法运行。
JVM的内存配置设置为”512MB”,但如果要进行正式使用,我认为需要1GB。
在运行后,监视logs/gc.log文件,如果不足的话,将进行扩展。
使用sudo命令创建将其作为systemd服务注册的配置文件。
pi@raspberrypi:~ $ sudo vi /etc/systemd/system/elasticsearch.service
[Unit]
After=syslog.target network.target
[Service]
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-armhf"
ExecStart=/home/pi/elasticsearch/bin/elasticsearch
WorkingDirectory=/home/pi/elasticsearch
User=pi
Group=pi
Nice=10
SyslogIdentifier=Elasticsearch
StandardOutput=syslog
Restart=on-failure
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
启动服务时使用systemctl。
pi@raspberrypi:~ $ sudo systemctl start elasticsearch
在运行 journalctl -f 的同时,一旦确认看到了 “started” 的消息,就使用 [Ctrl]+[c] 键来结束。
pi@raspberrypi:~ $ journalctl -f
1月 04 17:14:58 raspberrypi Elasticsearch[13552]: [2020-01-04T17:14:58,265][INFO ][o.e.n.Node ] [raspberrypi] started
1月 04 17:14:59 raspberrypi Elasticsearch[13552]: [2020-01-04T17:14:59,273][INFO ][o.e.l.LicenseService ] [raspberrypi] license [ca46ae11-79ad-4fb7-bb51-38bfe88a3242] mode [basic] - valid
1月 04 17:14:59 raspberrypi Elasticsearch[13552]: [2020-01-04T17:14:59,279][INFO ][o.e.x.s.s.SecurityStatusChangeListener] [raspberrypi] Active license is now [BASIC]; Security is disabled
1月 04 17:14:59 raspberrypi Elasticsearch[13552]: [2020-01-04T17:14:59,424][INFO ][o.e.g.GatewayService ] [raspberrypi] recovered [3] indices into cluster_state
如果在服务启动时没有问题,则将其配置为在操作系统启动时启动。
pi@raspberrypi:~ $ sudo systemctl enable elasticsearch
Kibana的安装和配置
这是有关Kibana安装和配置的内容。已将语言设置为日语。
pi@raspberrypi:~ $ wget https://artifacts.elastic.co/downloads/kibana/kibana-7.5.1-linux-x86_64.tar.gz
pi@raspberrypi:~ $ tar xzvf kibana-7.5.1-linux-x86_64.tar.gz
pi@raspberrypi:~ $ ln -s kibana-7.5.1-linux-x86_64 kibana
pi@raspberrypi:~ $ echo 'server.host: "0.0.0.0"' >> kibana/config/kibana.yml
pi@raspberrypi:~ $ echo 'i18n.locale: "ja-JP"' >> kibana/config/kibana.yml
将Kibana使用的”node”命令符号链接到操作系统提供的命令符。
pi@raspberrypi:~ $ rm kibana/node/bin/node
pi@raspberrypi:~ $ ln -sr `which node` kibana/node/bin/node
首先,将适用于ARM的ctags放置在Kibana中的elastic-ctags中(需要7.4或更高版本)。
然后,在pi用户的文件夹中,下载并编译ctags模块进行安装。
[Kibana 7.4〜の場合のみ実施]
pi@raspberrypi:~ $ npm install ctags
npm WARN npm npm does not support Node.js v10.15.2
npm WARN npm You should probably upgrade to a newer version of node as we
npm WARN npm can't make any promises that npm will work with this version.
npm WARN npm Supported releases of Node.js are the latest release of 4, 6, 7, 8, 9.
npm WARN npm You can find the latest version at https://nodejs.org/
> ctags@3.0.0 install /home/pi/node_modules/ctags
> node-gyp rebuild
make: ディレクトリ '/home/pi/node_modules/ctags/build' に入ります
CC(target) Release/obj.target/ctags/src/readtags.o
CXX(target) Release/obj.target/ctags/src/tags.o
In file included from ../src/tags.h:5,
:
npm WARN pi No description
npm WARN pi No repository field.
npm WARN pi No README data
npm WARN pi No license field.
+ ctags@3.0.0
added 10 packages from 13 contributors in 41.862s
完成ctags安装后,创建一个适用于arm的目录并将其复制到Kibana的elastic-ctags中。
[Kibana 7.4〜の場合のみ実施]
pi@raspberrypi:~ $ mkdir kibana/node_modules/@elastic/node-ctags/ctags/build/ctags-node-v64-linux-arm
pi@raspberrypi:~ $ cp node_modules/ctags/build/Release/ctags.node kibana/node_modules/@elastic/node-ctags/ctags/build/ctags-node-v64-linux-arm/.
在Kibana的7.2〜7.4版本中,需要编译和安装nodegit,但在7.5.1版本中不需要。
为了确认,我将提供编译适用于7.2〜7.4版本的nodegit的命令。
[Kibana 7.2〜7.4の場合のみ実施]
pi@raspberrypi:~ $ cd kibana/node_modules/@elastic/
pi@raspberrypi:~/kibana/node_modules/@elastic $ rm -rf nodegit/
pi@raspberrypi:~/kibana/node_modules/@elastic $ git clone http://github.com/elastic/nodegit.git
pi@raspberrypi:~/kibana/node_modules/@elastic $ cd nodegit/
pi@raspberrypi:~/kibana/node_modules/@elastic/nodegit $ npm install
与 Elasticsearch 时一样,使用 root 用户创建一个将作为 systemd 服务注册的配置文件。
pi@raspberrypi:~ $ sudo vi /etc/systemd/system/kibana.service
[Unit]
After=elasticsearch.service
[Service]
Environment="NODE_OPTIONS=--max-old-space-size=512"
ExecStart=/home/pi/kibana/bin/kibana
WorkingDirectory=/home/pi/kibana
User=pi
Group=pi
Nice=10
SyslogIdentifier=Kibana
StandardOutput=syslog
Restart=on-failure
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
尽管我们将内存限制在512MB,但根据经验来说,如果经常使用的话,大约需要1GB左右的内存。
要启动服务,请使用systemctl命令。
pi@raspberrypi:~ $ sudo systemctl start kibana
Kibana的启动有点慢。请使用journalctl -f等待启动。
我认为只要出现“Server running at http://0.0.0.0:5601”就可以了。
pi@raspberrypi:~ $ journalctl -f
1月 04 17:44:57 raspberrypi Kibana[14224]: {"type":"log","@timestamp":"2020-01-04T08:44:57Z","tags":["listening","info"],"pid":14224,"message":"Server running at http://0.0.0.0:5601"}
1月 04 17:44:57 raspberrypi Kibana[14224]: {"type":"log","@timestamp":"2020-01-04T08:44:57Z","tags":["info","http","server","Kibana"],"pid":14224,"message":"http server running at http://0.0.0.0:5601"}
1月 04 17:44:57 raspberrypi Kibana[14224]: {"type":"log","@timestamp":"2020-01-04T08:44:57Z","tags":["reporting","error"],"pid":14224,"message":"The Reporting plugin encountered issues launching Chromium in a self-test. You may have trouble generating reports."}
1月 04 17:44:57 raspberrypi Kibana[14224]: [17.4K blob data]
1月 04 17:44:57 raspberrypi Kibana[14224]: {"type":"log","@timestamp":"2020-01-04T08:44:57Z","tags":["reporting","warning"],"pid":14224,"message":"See Chromium's log output at \"/home/pi/kibana-7.5.1-linux-x86_64/data/headless_shell-linux/chrome_debug.log\""}
1月 04 17:44:57 raspberrypi Kibana[14224]: {"type":"log","@timestamp":"2020-01-04T08:44:57Z","tags":["reporting","warning"],"pid":14224,"message":"Reporting plugin self-check failed. Please check the Kibana Reporting settings. Error: Could not close browser client handle!"}
我不确定是否与环境相关,但是在/home/pi/kibana/目录中可能会生成具有控制字符文件名的文件。由于这些文件存在,导致kibana无法启动,因此我将删除它们。
虽然这些文件不容易删除。
首先,我们会检查文件名的真实身份。在/home/pi/kibana路径下,我们会按两次Tab键来执行ls命令。
pi@raspberrypi:~/kibana $ ls (TABを2回打つ)
^A??^B@???^G@8^L@47^F^D@@@?^B?^B^H^C^D?^B?^B?^B^\^\^A^A^D^\??^B^\??^B^P^A^E??^B??^B??^B^P??^D^P??^D^P^A^F@?^G@?^G@?^G@?4@?4^P^A^F@?^G@?^G@?^G??^Bt+^\^P^G^D@?^G@?^G@?^G^X?@^B^F^X??^G^X??^G^X??^G^B^HR?td^D@?^G@?^G@?^G55^AP?td^D??^P^B??^P^B??^P^B^L^_^]^L^_^]^DQ?td^F^D^D?^B?^B?^B
.i18nrc.json
LICENSE.txt
NOTICE.txt
README.txt
:
由于「^A」开头,因此在 rm 命令之后按下 [Ctrl]+[v],[Ctrl]+[a],然后使用星号“*”删除后续字符。
按下 [Ctrl]+[v] 进入控制字符输入模式,了解这一点很方便。
pi@raspberrypi:~/kibana $ rm ^A*
在Kibana的启动脚本开头,将上述的rm命令放置进去。
但是,这个文件到底是什么呢?
pi@raspberrypi:~/kibana $ vi bin/kibana
#!/bin/sh
SCRIPT=$0
rm /home/pi/kibana/^A*
# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
while [ -h "$SCRIPT" ] ; do
ls=$(ls -ld "$SCRIPT")
# Drop everything prior to ->
link=$(expr "$ls" : '.*-> \(.*\)$')
if expr "$link" : '/.*' > /dev/null; then
SCRIPT="$link"
else
SCRIPT=$(dirname "$SCRIPT")/"$link"
fi
done
DIR="$(dirname "${SCRIPT}")/.."
NODE="${DIR}/node/bin/node"
test -x "$NODE"
if [ ! -x "$NODE" ]; then
echo "unable to find usable node.js executable."
exit 1
fi
NODE_OPTIONS="--no-warnings --max-http-header-size=65536 ${NODE_OPTIONS}" NODE_ENV=production exec "${NODE}" "${DIR}/src/cli" ${@}
如果在服务启动时没有问题,将其设置为在操作系统启动时启动。
pi@raspberrypi:~ $ sudo systemctl enable kibana
用可视化方法尝试一下
让我们实际使用Elasticsearch插入数据并进行可视化。
在root用户下,获取Load Avg.(负载平均值)和CPU温度,并创建一个通过REST API将其投入Elasticsearch的shell脚本,并且以每分钟的间隔在cron中执行。
pi@raspberrypi:~ $ su -
パスワード:
root@raspberrypi:~# mkdir bin
root@raspberrypi:~# cd bin
root@raspberrypi:~/bin# vi rpiinfo.sh
#!/bin/bash
HOST=`hostname`
DATE=`date --iso-8601="seconds"`
LOAD=`cat /proc/loadavg | cut -d' ' -f1`
CPUTEMP=`vcgencmd measure_temp | cut -d= -f2 | cut -d"'" -f1`
JSON='{"date":"'${DATE}'","'${HOST}'-temp":'${CPUTEMP}',"'${HOST}'-load":'${LOAD}'}'
curl --no-keepalive -s -XPOST -H "Content-Type: application/json" http://localhost:9200/rpi-`hostname`/_doc?pretty -d "${JSON}"
root@raspberrypi:~/bin# chmod +x rpiinfo.sh
虽然可以使用 crontab -e 命令,但我个人更喜欢使用文件注册的步骤。
root@raspberrypi:~/bin# vi cronfile
*/1 * * * * /root/bin/rpiinfo.sh >/dev/null 2>&1
root@raspberrypi:~/bin# crontab cronfile
root@raspberrypi:~/bin# crontab -l
*/1 * * * * /root/bin/rpiinfo.sh >/dev/null 2>&1
从网络中的终端浏览器访问Kibana。URL为”http://<树莓派的IP地址>:5601/”。
一旦启动,点击”开发工具”中的控制台,然后按下”GET _search”查询旁边的播放按钮来执行注册的查询。
如果在结果的底部有从shell注册的数据,则数据已成功投入。
接下来,在“管理”中的“索引模式”下,我们将创建Kibana的索引模式。时间轴字段为“date”。
从左侧菜单的“可视化”选项开始创建新的可视化图表。
我们可以创建一个折线图吗?
按下播放按钮后,将以线形图形式显示时间序列温度。
通过反复创建向Elasticsearch投入数据和可视化的组件,最终可以将其集中在仪表板上。
在边缘设备上可能会感到有些重,但Elasticsearch+Kibana在可视化和BI工具中是相当流行的。所以,我认为学习这项技术是一个好选择。
不仅仅是在其他云服务中,对于不确定是否能善加利用的服务,我都会非常犹豫去付费。即使有免费额度,但在担心限制的情况下学习也是相当可怕的事情。
我认为ElasticStack是一个很好的产品,因为它提供了可以在本地运行的软件包,所以可以先充分学习本地部署,然后再考虑云服务。