首先列出几个网址:
pinpoint code github地址
pinpoint wiki github地址
pinpoint v1.8.3 official homepage
在这里我推荐的是,通过编译源码的方式来获取部署要用到的jar包。因为之后我们需要开发pinpoint的插件,同样需要搭建开发环境,那就在这里把这个搭建的步骤做了就完了。
Step 1. clone源码
到 pinpoint code github地址 下clone即可。
git clone https://github.com/naver/pinpoint.git
cd pinpoint
这个时候用命令git branch -a
看一下分支:
* 1.8.x
master
remotes/origin/#4558_support_grpc_transport
remotes/origin/1.0.x
remotes/origin/1.1.x
remotes/origin/1.5.x
remotes/origin/1.6.x
remotes/origin/1.7.x
remotes/origin/1.8.x
remotes/origin/HEAD -> origin/master
remotes/origin/gh-pages
remotes/origin/master
默认情况下当前分支是master分支,可以用git checkout -b dev(本地分支名) origin/dev(远程分支名)
的方式,将当前分支切换为1.8.x
Step 2. 编译
1. 设置环境变量:
# JAVA_HOMES for pinpoint
export JAVA_6_HOME=/opt/pinpoint/jdks/jdk1.6.0_45
export JAVA_7_HOME=/opt/pinpoint/jdks/jdk1.7.0_80
export JAVA_8_HOME=/opt/pinpoint/jdks/jdk1.8.0_201
export JAVA_9_HOME=/opt/pinpoint/jdks/java-se-9-ri/jdk-9
在这里说明一下为啥要设置这四个环境变量。pinpoint的agent(用于收集宿主应用性能数据的组件)需要针对不同版本的jdk进行一些有针对性的表现,区别在于以下目录:
而这四个环境变量指定的jdk类库,就作为这部分代码编译所需要的依赖。当然,如果不编译
profiler-optional-jdk9
这个module,将其移除,则JAVA_9_HOME
可以不设置。其他三个同理。
2. maven 编译
在编译之前,推荐先设置maven仓库为阿里云仓库,否则编译过程可能会很慢。可参考:三、配置阿里云镜像
编译过程很简单,直接cd 到pinpoint根目录,然后./mvnw install -DskipTests=true
。
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Detecting the operating system and CPU architecture
[INFO] ------------------------------------------------------------------------
[INFO] os.detected.name: osx
[INFO] os.detected.arch: x86_64
[INFO] os.detected.version: 10.14
.........................略.........
.........................略.........
然后就是漫长的等待,如果以上环境变量都设置了的话,应该没什么问题。
插一句,如果没见过mvnw命令对其有疑问,可以查看mvnw文件内容,其实就是设置一大堆环境变量,然后到最后还是mvn 执行的。
282 exec "$JAVACMD" \
283 $MAVEN_OPTS \
284 -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
285 "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
其中MAVEN_OPTS
的解释为:MAVEN_OPTS - parameters passed to the Java VM when running Maven
Step3. 部署启动
1. 说明
首先来简单说一下pinpoint的组成。
数据收集:agent -> collector -> hbase(存储)
数据查询:webUI -> hbase
其中,pinpoint又使用flink
预统计数据来优化查询性能,flink作为目前最先进的流式处理框架,性能优秀,一致性保证,轻量级容错。
pinpoint部署的官方文档,分为QuickStart和Installation两部分。参照:pinpoint v1.8.3 official homepage
如果只是为了在自己机器上尝尝鲜,了解一下pinpoint,那用QuickStart是没问题的。QuickStart是使用的mvn 自带的tomcat插件来启动的webUI和collector。随着部署的服务增多,数据量上来之后,难免需要进行一些参数设置,这个时候麻烦就来了。因此如果最终目的是生产的话,直接按照Installation进行。其中部署的思路推荐后从往前,也就是按照上述数据收集
和数据查询
的箭头反向进行。
2. 部署hbase
①下载hbase
在pinpoint的官方首页中,quickStart中并没有指出linux机器需要下载hbase,那是因为在quickstart/bin/start-hbase.sh 中会自动下载安装,见func_download_hbase
方法:
[root@im-test-cpr-1 bin]# cat start-hbase.sh
#!/usr/bin/env bash
HBASE_VERSION=hbase-1.0.3
HBASE_FILE=$HBASE_VERSION-bin.tar.gz
HBASE_DL_URL=http://apache.mirror.cdnetworks.com/hbase/$HBASE_VERSION/$HBASE_FILE
HBASE_ARCHIVE_DL_URL=http://archive.apache.org/dist/hbase/$HBASE_VERSION/$HBASE_FILE
function func_download_hbase
{
if type curl > /dev/null 2>&1; then
if [[ `curl -s --head $HBASE_DL_URL | head -n 1 2>&1 | grep "HTTP/1.[01] [23].."` ]]; then
curl -O $HBASE_DL_URL
else
curl -O $HBASE_ARCHIVE_DL_URL
fi
echo "true"
elif type wget > /dev/null 2>&1; then
if [[ `wget -S --spider $FAIL_URL 2>&1 | grep "HTTP/1.[01] [23].."` ]]; then
wget $HBASE_DL_URL
else
wget $HBASE_ARCHIVE_DL_URL
fi
echo "true"
else
echo "false"
fi
}
但是经过验证,这个自动下载经常失败,而且失败之后需要手动删除下载了一半的文件,否则它会视为已经下载过了然后去解压,导致报错,十分头疼。所以干脆我们就自己装一个,装在哪无所谓。但是推荐版本1.0.3,官方教程中就是这个版本。
②安装配置hbase
在安装之前,推荐看一下hbase quickstart中的standalone部分,因为我装的是单机版的。集群版本按照官方教程也可解决。
这是我的安装目录:
[root@im-test-cpr-1 hbase]# pwd
/opt/pinpoint/pinpoint/quickstart/hbase
下载解压:
wget http://archive.apache.org/dist/hbase/hbase-1.0.3/hbase-1.0.3-bin.tar.gz
tar -xzvf hbase-1.0.3-bin.tar.gz
hbase 启动时,可以根据实际情况选择集群或者单机方式进行;如果选择集群,可以选择自带ZooKeeper或者外置ZK。在这里我们安装单机版。
如果安装的是hbase集群,推荐选择外置ZK。这时候需要配置
hbase_dir/conf/hbase-env.sh
中的export HBASE_MANAGES_ZK=false
贴一下我的hbase_dir/conf/hbase-site.xml
配置文件
hbase.rootdir
file:///home/testuser/hbase
hbase.zookeeper.property.dataDir
/home/testuser/zookeeper
hbase.unsafe.stream.capability.enforce
false
Controls whether HBase will check for stream capabilities (hflush/hsync).
Disable this if you intend to run on LocalFileSystem, denoted by a rootdir
with the 'file://' scheme, but be mindful of the NOTE below.
WARNING: Setting this to false blinds you to potential data loss and
inconsistent system state in the event of process and/or node failures. If
HBase is complaining of an inability to use hsync or hflush it's most
likely not a false positive.
③ 运行hbase
然后运行pinpoint/quickstart/bin/start-hbase.sh
,根据提示,hbase的启动log会被重定向到一个log文件中,cat一下如果是空的,说明启动成功。如果输出的是error,那好吧,根据提示解决问题吧...
logging to /opt/pinpoint/pinpoint/quickstart/hbase/hbase-1.0.3/bin/../logs/hbase-root-master-im-test-cpr-1.out
hbase启动成功后,会有一个hbase的进程出现。
[root@im-test-cpr-1 bin]# jps -l -v |grep hbase
91262 org.apache.hadoop.hbase.master.HMaster -Dproc_master -XX:OnOutOfMemoryError=kill -9 %p -XX:+UseConcMarkSweepGC -Dhbase.log.dir=/opt/pinpoint/pinpoint/quickstart/hbase/hbase-1.0.3/logs -Dhbase.log.file=hbase-root-master-im-test-cpr-1.log -Dhbase.home.dir=/opt/pinpoint/pinpoint/quickstart/hbase/hbase-1.0.3 -Dhbase.id.str=root -Dhbase.root.logger=INFO,RFA -Dhbase.security.logger=INFO,RFAS
关于这个进程需要补充说明的是,它包含了以下职能(摘自官网quickstart):
A standalone instance has all HBase daemons — the Master, RegionServers, and ZooKeeper — running in a single JVM persisting to the local filesystem.
因此如果不考虑集群的情况下,无需安装其他zookeeper,即可默认监听2181端口,为collector
和web-ui
提供服务注册。
④初始化hbase
运行pinpoint/quickstart/bin/init-hbase.sh
,如果报错找不到hbase目录,修改init-hbase.sh
为如下内容后重新执行。原因在于默认的init脚本中hbase路径不带版本号。
#!/usr/bin/env bash
quickstart_bin=`dirname "${BASH_SOURCE-$0}"`
quickstart_bin=`cd "$quickstart_bin">/dev/null; pwd`
quickstart_base=$quickstart_bin/..
quickstart_base=`cd "$quickstart_base">/dev/null; pwd`
"$quickstart_bin"/../hbase/hbase-1.0.3/bin/hbase shell $quickstart_base/conf/hbase/init-hbase.txt
init脚本会初始化hbase中存储性能数据所需要的数据表。
⑤hbase运行验证
运行hbase shell客户端,键入list命令,看到列出所有表之后,hbase搭建完成。
[root@im-test-cpr-1 pinpoint]# cd quickstart/bin/
[root@im-test-cpr-1 bin]# cd ..
[root@im-test-cpr-1 quickstart]# cd hbase/hbase-1.0.3/bin/
[root@im-test-cpr-1 bin]# ls
draining_servers.rb hbase hbase-common.sh hbase-daemon.sh hirb.rb local-regionservers.sh regionservers.sh rolling-restart.sh start-hbase.sh test
get-active-master.rb hbase-cleanup.sh hbase-config.cmd hbase-daemons.sh hs_err_pid79021.log master-backup.sh region_status.rb shutdown_regionserver.rb stop-hbase.cmd thread-pool.rb
graceful_stop.sh hbase.cmd hbase-config.sh hbase-jruby local-master-backup.sh region_mover.rb replication start-hbase.cmd stop-hbase.sh zookeepers.sh
[root@im-test-cpr-1 bin]# ./hbase shell
2019-07-10 17:23:08,819 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell; enter 'help' for list of supported commands.
Type "exit" to leave the HBase Shell
Version 1.0.3, rf1e1312f9790a7c40f6a4b5a1bab2ea1dd559890, Tue Jan 19 19:26:53 PST 2016
hbase(main):001:0> list
TABLE
AgentEvent
AgentInfo
AgentLifeCycle
AgentStatV2
ApiMetaData
ApplicationIndex
ApplicationMapStatisticsCallee_Ver2
ApplicationMapStatisticsCaller_Ver2
ApplicationMapStatisticsSelf_Ver2
ApplicationStatAggre
ApplicationTraceIndex
HostApplicationMap_Ver2
SqlMetaData_Ver2
StringMetaData
TraceV2
15 row(s) in 0.3500 seconds
=> ["AgentEvent", "AgentInfo", "AgentLifeCycle", "AgentStatV2", "ApiMetaData", "ApplicationIndex", "ApplicationMapStatisticsCallee_Ver2", "ApplicationMapStatisticsCaller_Ver2", "ApplicationMapStatisticsSelf_Ver2", "ApplicationStatAggre", "ApplicationTraceIndex", "HostApplicationMap_Ver2", "SqlMetaData_Ver2", "StringMetaData", "TraceV2"]
hbase(main):002:0>