暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Dinky在IDEA远程调试实践分享

Dinky开源 2022-02-25
721
摘要:本文介绍了Dinky 如何在IDEA中进行远程调试的实践分享。内容包括:
  1. 基本环境
  2. 环境搭建
  3. 编译Dinky
  4. 部署Dinky
  5. 远程debug源码
  6. 总结
  7. 参考


Tips:历史传送门
Flink CDC 和 kafka 进行多源合并和下游同步更新
Dlink 在 FinkCDC 流式入湖 Hudi 的实践分享
Dlink 在 Flink-mysql-cdc 到 Doris 的实践
Dlink 在 Hive 的实践
 

 GitHub 地址 
https://github.com/DataLinkDC/dlink
https://gitee.com/DataLinkDC/dlink
欢迎大家关注 Dinky 的发展~


一、基本环境

环境
版本
jdk
1.8.0.181
flink
1.13.5
centos
7.4
CDH
6.3.1
hadoop
3.0.0
nvm
0.37.2
node
v12.22.8
maven
3.8.1
git
2.31.1
idea
2021.2.3
nginx
1.20.1
mysql
8.0
Dinky
dev
MAC
12.2.1


二、环境搭建


安装配置JDK

1、到 oracle 官网下载 jdk1.8.0.181.tar.gz

2、使用 root 用户或者具有 sudo 权限的用户在 linux 上创建 jdk 存放目录

mkdir usr/java

3、将jdk下载好的 jdk 上传到 usr/java 目录

4、解压

tar -zxvf jdk1.8.0.181.tar.gz

5、配置 java 环境变量

JAVA_HOME=/usr/java/jdk1.8.0_181
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME CLASSPATH

6、重新加载环境变量

source etc/profile

7、校验 java 环境是否安装成功

# linux 终端输入
java  -version

# 安装成功信息
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

安装scala

1、下载 scala

cd data/
wget https://downloads.lightbend.com/scala/2.12.8/scala-2.12.8.tgz

2、使用 root 用户或者具有 sudo 权限的用户在 linux 上创建 scala 存放目录

mkdir usr/sala

3、解压

tar -zxvf scala-2.12.8.tgz -C usr/scala

4、配置环境变量

SCALA_HOME=/usr/scala/scala-2.12.8
PATH=$PATH:$SCALA_HOME/bin
export SCALA_HOME

5、校验是否安装成功

 scala -version

安装Hadoop集群环境

部署 dlink 默认hadoop 集群已经部署完毕,本案例使用 cdh6.3.1 部署的 hadoop 集群。

安装配置 Flink

1、下载flik

# 在linux 终端切换到下载flink 安装包目录
cd data/
# 下载flink 安装包
wget https://dlcdn.apache.org/flink/flink-1.13.5/flink-1.13.5-bin-scala_2.12.tgz

2、解压

tar -zxvf flink-1.13.5-bin-scala_2.12.tgz

3、重命名

mv flink-1.13.5 flink

4、配置环境变量

JAVA_HOME=/usr/java/jdk1.8.0_181
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
HADOOP_HOME=/opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hadoop
HADOOP_CONF_DIR=/etc/hadoop/conf
FLINK_HOME=/data/flink
PATH=$PATH:$JAVA_HOME/bin:$FLINK_HOME/bin:$HADOOP_HOME/bin
export JAVA_HOME CLASSPATH HADOOP_HOME HADOOP_CONF_DIR FLINK_HOME PATH

5、配置flink-conf.yaml  注意:  1、配置文件需要根据自己hadoop环境来做修改    2、环境变量必须配置HADOOP_CONF_DIR  


jobmanager.rpc.address: localhost

jobmanager.rpc.port: 6123

jobmanager.memory.process.size: 1600m

taskmanager.memory.process.size: 1728m

taskmanager.numberOfTaskSlots: 4

parallelism.default: 1

high-availability: zookeeper

high-availability.storageDir: hdfs://nameservice1/user/flink/ha/

high-availability.zookeeper.quorum: 172.17.0.13:2181,172.17.0.9:2181,172,172.17.0.8:2181
high-availability.zookeeper.path.root: /flink

state.backend: filesystem

state.checkpoints.dir: hdfs://nameservice1/user/flink/flink-checkpoints

state.savepoints.dir: hdfs://nameservice1/user/flink/flink-savepoints

jobmanager.execution.failover-strategy: region

yarn.application-attempts: 4

env.hadoop.conf.dir: /etc/hadoop/conf

安装配置nginx(可选)

    1、安装

说明:使用 linux root 用户或者具备 sudo 权限的普通用户操作  

# 下载centos 版本nginx yum 源
wget -O etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清除缓存
yum makecache
# 安装nginx
yum -y install epel-release
yum -y install nginx

    2、修改nginx配置

vim etc/nginx/nginx.conf


user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
   worker_connections 1024;
}

http {
   log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

   access_log var/log/nginx/access.log main;

   sendfile           on;
   tcp_nopush         on;
   tcp_nodelay         on;
   keepalive_timeout   65;
   types_hash_max_size 4096;

   include             etc/nginx/mime.types;
   default_type       application/octet-stream;

   # Load modular configuration files from the etc/nginx/conf.d directory.
   # See http://nginx.org/en/docs/ngx_core_module.html#include
   # for more information.
   include etc/nginx/conf.d/*.conf;

server {
       listen       12000;
       #listen       [::]:80;
       server_name bigdata3;
       root         data/dlink/html;
               gzip on;
    gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";

       # Load configuration files for the default server block.
       include etc/nginx/default.d/*.conf;

       location {
           # dlink html错在目录
           root   data/dlink/html;
           index data/dlink/html/index.html data/dlink/html/index.htm;
try_files $uri $uri/ index.html;
       }
       error_page 404 404.html;
       location = 404.html {
       }
       # To allow POST on static pages 允许静态页使用POST方法
       error_page 500 502 503 504 50x.html;
       location = 50x.html {
       }

       location ^~ api {
           # dlink 服务所在机器IP:端口
           proxy_pass http://172.17.0.17:8889;
           proxy_set_header   X-Forwarded-Proto $scheme;
           proxy_set_header   X-Real-IP         $remote_addr;
       }
   }

}

    3、查看安装版本号

nginx -v

    4、启动

设置开机启动

sudo systemctl enable nginx

启动、重启、停止、重新加载

sudo service nginx start
sudo service nginx restart
sudo service nginx stop
sudo service nginx reload

    5、校验是否启动成功

ps -ef | grep nginx

启动正常,显示如下:

nginx     3277  4245  0 2月10 ?       00:00:00 nginx: worker process
nginx     3278  4245  0 2月10 ?       00:00:00 nginx: worker process
nginx     3279  4245  0 2月10 ?       00:00:00 nginx: worker process
nginx     3280  4245  0 2月10 ?       00:00:00 nginx: worker process
root      4245     1  0 2月10 ?       00:00:00 nginx: master process /usr/sbin/nginx
root      8222 28340  0 18:52 pts/0    00:00:00 grep --color=auto nginx

安装mysql

    参考:https://cloud.tencent.com/developer/article/1584093



三、编译Dinky

    说明:本案例在 Mac 系统编译

安装前端编译环境  

    1、安装nvm

nvm 是 nodejs 版本管理工具,一个 nvm 可以管理多个 node 版本和 npm 版本。 

 1、在终端输入如下脚本,安装 nvm

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.37.2/install.sh | bash

2、查看版本号

nvm -v

2、安装nodejs

项目开发时所需要代码库

1、在终端输入如下脚本,安装 nodejs  

# 在终端输入
nvm install v12.22.8

2、查看版本号

node -v

安装后端编译环境

    篇幅有限,本文不再赘述后端编译环境,主要有 jdk、idea、maven、git。

克隆源码

git clone https://github.com/DataLinkDC/dlink

IDEA导入代码

1、idea 中导入项目打开idea -> 在打开的页面找到OPEN -> 找到Dinky源码所在目录pom.xml文件 ->  点击open按钮会自动导入

2、idea配置自定义mavenPreferences -> 搜索框输入maven -> 修改 Maven home path 为自定义maven的根目录 -> 修改User settingsfile 为自定义maven的setting文件 -> 修改Local rerpository 为本地自定义仓库

3、idea自动加载项目

编译

进入代码的根目录,输入以下命令进行编译

mvn clean install -Dmaven.test.skip=true



四、部署Dinky


上传安装包

Dlinky编译后在代码根目录下 build 文件夹中有一个 dlink-release-0.6.0-SNAPSHOT.tar.gz 文件,将dlink-release-0.6.0-SNAPSHOT.tar.gz 上传到部署目录 data/ 下。

解压安装包

tar -zxvf dlink-release-0.6.0-SNAPSHOT.tar.gz  

重命名

mv dlink-release-0.6.0-SNAPSHOT dlink

初始化数据库    

1、创建mysql用户

在安装 mysql linux 终端输入 mysql -u root -p 进入数据库客户端    

create user 'dlink'@'localhost'         identified by 'dlink';

2、创建数据库和表

将 data/dlink/sql 下 dlink.sql 脚本中的内容拷贝到 mysql 客户端执行,具体见包内脚本。

    3、授权远程访问

GRANT ALL ON  dlink.*        TO 'dlink'@'%'                  IDENTIFIED BY 'dlink';

    4、刷新权限

FLUSH PRIVILEGES;

修改数据库配置

cd data/dlink/config
将application.yml文件中数据库连接、数据库用户名、密码修改为当前部署环境的配置,如下,数据库连接修改为172.17.0.89,用户名为修改为dlink,密码为dlink,服务端口为8888
spring:
datasource:
  url: jdbc:mysql://127.0.0.1:3306/dlink?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  username: dlink
  password: dlink
  driver-class-name: com.mysql.cj.jdbc.Driver
application:
  name: dlink

server:
port: 8888

mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
 #实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.dlink.model
global-config:
  db-config:
    id-type: auto
configuration:
 ##### mybatis-plus打印完整sql(只适用于开发环境)
#   log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl

# Sa-Token 配置
sa-token:
   # token名称 (同时也是cookie名称)
  token-name: satoken
   # token有效期,单位s 默认10小时, -1代表永不过期
  timeout: 36000
   # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
  activity-timeout: -1
   # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
  is-concurrent: false
   # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
  is-share: true
   # token风格
  token-style: uuid
   # 是否输出操作日志
  is-log: false

创建plugins文件夹并上传依赖jar

plugins 文件夹下存放 flink 及 hadoop 的官方扩展 jar,根据实际应用,把对应 jar 放入 plugins中。

mkdir data/dlink/plugins
cp data/flink/lib data/dlink/plugins

最终plugins包含jar如下:
commons-cli-1.3.1.jar
flink-csv-1.13.5.jar
flink-dist_2.12-1.13.5.jar
flink-json-1.13.5.jar
flink-shaded-hadoop-3-uber.jar
flink-shaded-zookeeper-3.4.14.jar
flink-table_2.12-1.13.5.jar
flink-table-blink_2.12-1.13.5.jar
mysql-connector-java-8.0.28.jar

注意:flink-shaded-hadoop-3-uber.jar 需要将jar中srvlet文件夹删除

启动服务

cd data/dlink
sh auto.sh start


五、远程debug源码


修改启动脚本,开启远程调试

1、修改服务器上auto.sh脚本  修改脚本的start方法,在java -jar 中间添加上 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50001,具体如下:

#!/bin/bash
# 定义变量
# 要运行的jar包路径,加不加引号都行。注意:等号两边 不能 有空格,否则会提示command找不到
JAR_NAME="./dlink-admin-*.jar"
#java -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/jre/lib:./lib -classpath ."/lib/*.jar" -jar dlink-admin-*.jar
# 如果需要将FLINK依赖直接加入启动脚本,在SETTING中增加$FLINK_HOME/lib
SETTING="-Dloader.path=./lib,./plugins -Ddruid.mysql.usePingMethod=false"

# 首次启动时候自动创建plugins文件夹和引用flink\lib包!
if [ ! -d "./plugins" ];then
echo 'mkdir plugins now'
mkdir plugins
cd plugins
 if [ ! -d ${FLINK_HOME} ];then
 echo 'WARNING!!!...没有找到FLINK_HOME环境变量,无法引用Flink/lib到plugins,请手动引用或复制Flink jar到plugins文件夹'
 echo 'WARNING!!!...not find FLINK_HOME environment variable to reference Flink/lib to plugins, please reference or copy Flink jar to the plugins folder manually!!'
 else
 ln -s ${FLINK_HOME}/lib
 cd ..
 fi
fi

# 如果输入格式不对,给出提示!
tips() {
echo ""
echo "WARNING!!!......Tips, please use command: sh auto.sh [start|stop|restart|status].   For example: sh auto.sh start "
echo ""
exit 1
}


# 启动方法
start() {
       # 重新获取一下pid,因为其它操作如stop会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
       # -z 表示如果$pid为空时执行
if [ -z $pid ]; then
      nohup java $SETTING -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50001 -jar -Xms512M -Xmx2048M -XX:PermSize=512M -XX:MaxPermSize=1024M $JAR_NAME > dlink.log 2>&1 &
       pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
echo ""
       echo "Service ${JAR_NAME} is starting!pid=${pid}"
echo "........................Start successfully!........................."
else
echo ""
echo "Service ${JAR_NAME} is already running,it's pid = ${pid}. If necessary, please use command: sh auto.sh restart."
echo ""
fi
}

# 停止方法
stop() {
# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
       # -z 表示如果$pid为空时执行。注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
if [ -z $pid ]; then
echo ""
       echo "Service ${JAR_NAME} is not running! It's not necessary to stop it!"
echo ""
else
kill -9 $pid
echo ""
echo "Service stop successfully!pid:${pid} which has been killed forcibly!"
echo ""
fi
}

# 输出运行状态方法
status() {
       # 重新获取一下pid,因为其它操作如stop、restart、start等会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
       # -z 表示如果$pid为空时执行。注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
if [ -z $pid ];then
echo ""
       echo "Service ${JAR_NAME} is not running!"
echo ""
else
echo ""
       echo "Service ${JAR_NAME} is running. It's pid=${pid}"
echo ""
fi
}

# 重启方法
restart() {
echo ""
echo ".............................Restarting.............................."
echo "....................................................................."
# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
       # -z 表示如果$pid为空时执行。注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
if [ ! -z $pid ]; then
kill -9 $pid
fi
start
echo "....................Restart successfully!..........................."
}

# 根据输入参数执行对应方法,不输入则执行tips提示方法
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    tips
    ;;
esac

启动Dinky

sh auto.sh start

1使用FinalShell将服务器上50001端口映射到本地开发机器

1、选择连接属性

2、隧道、添加

3、添加映射配置并点击确定


配置IDEA远程调试

    1、进入idea 配置页面


    2、找到远程调试选项


    3、配置远程调试端口


Dinky上配置任务

    flink on yarn Per-Job方式

    添加集群配置


创建flinksql作业


CREATE TABLE datagen_source (
name VARCHAR,
score BIGINT
) WITH (
 'connector' = 'datagen'
)
;
CREATE TABLE print_table (
name VARCHAR,
score BIGINT
) WITH (
 'connector' = 'print'
);
CREATE TABLE print_table_a (
name VARCHAR,
score BIGINT
) WITH (
 'connector' = 'print'
);
insert into print_table
select name,score from datagen_source;
insert into print_table_a
select name,score from datagen_source


IDEA中远程调试

    1、启动远程debug

    2、页面提交flnksql 任务


    3、查看debug运行时明细


    4、在cdh的yarn应用上查看是否提交成功





六、总结

      本文涉及编译源码,服务部署,远程调试代码。源码编译,能灵活适配线上其它组件组件版本,减少不必要错误,同时为开发dinky做准备;服务部署,通过在流行的CDH平台环境部署,让dinky无缝融入线上环境,这得益于dinky轻量、便捷的特性;远程调试代码,对想深入了解底层或者二开的开发者,能通过这种方式快速理解上手,或者线上服务运行异常,能通过远程debug快速定位问题。



七、参考

https://mp.weixin.qq.com/s/uyfHA9grAdfCcD4KDG0_SA  
https://mp.weixin.qq.com/s/YAd4lWSqr5KraVT5kpUzUg  
https://juejin.cn/post/6943133861047959559  
https://juejin.cn/post/6943133861047959559    
https://developer.aliyun.com/ask/270621    
https://chenjiabing666.github.io/2020/10/28/SpringBoot%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95/  



扫描二维码获取

更多精彩

DataLink

数据中台




文章转载自Dinky开源,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论