尝试在云服务器上部署 Flink 并提交计算任务

网站相似度计算:裸机 & Kubernetes 部署实战 背景与目标 任务:基于 Flink Table API,用 SQL 计算网站间的相似度(Jaccard Coefficient)。 数据:referrer-referree 格式的 CSV,数千到数万条记录。 目标: 跑通 Flink Job,并且能够在外部访问 flink web ui 在K8S集群中部署flink,能够使用多台机器共同计算较大的数据集 一些常用命令备忘: ## 将文本文件转换为csv # 1. 添加表头 echo "referrer,referree" > medium_relation.csv # 2. 替换空格为逗号并追加到新文件 sed 's/ /,/g' medium_relation >> medium_relation.csv ## 压缩和解压缩 tar -czvf xxx tar -xzvf xxx.tar.gz -C ~/ # -c 创建一个新的 tar 文件 # -x 解压文件 # -z 使用gzip压缩 后缀为.tar.gz # -j 使用bzip2压缩 后缀为.tar.bz2 # -v 显示详细的压缩过程 # -f 指定 tar 文件的名称 # -C 指定解压缩包的目录 ## 下载文件 curl -L -o helm-v3....

May 15, 2025 · 5 min · 885 words · sirius1y

计算机基础知识

计算机网络 TCP TCP为什么要进行三次握手? 三次握手是建立网络连接的过程,确保双方能够正确地进行数据传输。 第一次握手SYN:客户端向服务端发送SYN请求同步信号,并初始化客户端序列号; 第二次握手SYN+ACK:服务端收到了客户端发送的SYN信号后回复ACK确认收到,同时也发送SYN,指定自己的初始序列号; 第三次握手ACK:客户端收到服务端的ACK+SYN后,回复一个ACK,表示已经收到服务端的ACK+SYN。这个包的序列会加一,表示客户端已经准备好和服务端进行数据传输了。 为什么是三次握手?不是两次或者四次 原因1:阻止重复的历史连接初始化 如果是两次握手的话,因网络堵塞的问题,客户端发送了两次SYN给服务端,服务端收到了第一个SYN的时候,就回复SYN+ACK给客户端,并进入了ESTABLISHED状态。而客户端这边收到了服务端旧的ACK+SYN,会认为这是历史连接从而发送RST报文,使服务端断开连接。 原因2:同步双方的序列号 TCP协议的双方都必须要维护一个序列号。两次握手只能保证一方的序列号被接收。 原因3:避免资源浪费 如果是两次握手,那么服务端在收到SYN后回复ACK的时候就要主动建立连接,要是网络堵塞,对面发了好多个SYN来,那完蛋了,建立了好多个TCP连接,造成了资源浪费。 TCP的四次挥手 四次挥手是指在TCP断开连接的过程中发生的,一般是由客户端发起,服务端完成最后的断开。 因为TCP是全双工通信,所以需要两边都要通知对方停止数据传输,故需要四次挥手保证断开连接。 具体流程:(刚开始双方都处于ESTABLISHED状态) 1.客户端向服务端发起FIN报文,表示客户端不再发送数据;(客户端进入FIN_WAIT_1中状态) 2.服务端收到FIN报文后,回复一个ACK表示收到;(服务端进入CLOSED_WAIT状态,客户端收到ACK后进入FIN_WAIT_2状态) 3.服务端向客户端发起FIIN报文,表示服务端也不再发送数据;(服务端进入LAST_ACK状态) 4.客户端收到服务端的FIN报文后,也回复一个ACK。(客户端进入TIME_WAIT状态) 发送端在最后会进入到TIME_WAIT的状态, 为什么有TIME_WAIT状态? 原因1:保证历史连接中的数据不会干扰下一次连接。 原因2:保证被动关闭连接。如果服务端没有TIME_WAIT状态直接close的话,要是服务端没有收到客户端最后一次发送的ACK会重发FIN,如果服务器已经处于CLOSE状态,就会返回RST报文,RST报文会被服务端认定为错误。 为什么TIME_WAIT的时间是2MSL? MSL是报文的最大生存时间,超过这个时间的报文都会被丢弃。两个MSL时间可以保证客户端发送的ACK报文可以到达服务端+服务端要是在第一个MSL中没有收到ACK可以重发一次FIN到客户端,并保证能够到达客户端。 HTTP GET方法和POST方法有什么区别? 用途:GET方法一般用于请求服务器上的数据;POST方法用于向服务器提交数据。 请求参数:GET方法的请求参数一般放在URL中,POST的请求参数一般放在请求体中。 幂等:多次执行相同的操作,结果都相同。 幂等行:GET方法是安全幂等的,POST不是幂等的。 缓存机制:GET请求会被浏览器主动cache,如果下一次传输的数据相同,就会返回浏览器中的内容;而POST不会。 GET的请求参数会被保存在浏览器的历史记录中,而POST中的参数不会保留 时间消耗:GET产生一个TCP数据包,浏览器会把header和data一起发送出去,服务器相应200; POST产生两个TCP数据包,浏览器先发送hader,服务器相应100(继续发送),浏览器再发送data,服务器相应200 什么情况下会使用POST读取数据? 当查询的数据量很多,GET方式的URL太长太大,GET方式大概是4KB,POST上限是8MB 当对数据的安全性有更高要求的时候,可以在POST的请求体中对数据进行加密 HTTP版本对比 HTTP/0.9 只支持GET方法 HTTP/1.0 支持多种请求方式 引入了请求头和响应头 引入状态码 不支持长连接 HTTP/1.1 支持长连接 管道网络传输(可以同时发送A、B请求,不必等待A响应) 但是管道网络传输存在队头阻塞的问题 头部冗余 没有请求优先级 请求只能通过客户端推送,服务器不能主动推送 HTTP/2 使用HPACK进行头部压缩 把数据部分压缩成头信息帧和数据帧 并发传输:引入了stream的概念,多个Stream复用一条TCP连接,通过streamID识别,不同stream的帧可以乱序发送 支持服务器推送 HTTPS 和HTTP对比 优点 安全性更高 缺点 HTTPS涉及到了加解密的过程,所以对服务器的负荷会高一些; 握手阶段的延迟比较高,因为还有SSL/TLS握手; 加密过程 HTTPS采用了对称加密+非对称加密的混合加密模式...

May 10, 2024 · 5 min · 987 words · sirius1y

Docker和K8S部署

生成ssh密钥并实现免密登录 docker 安装完成docker后进行检验: 安装k8s 验证kubeadm版本为1.18 在腾讯云中制作为镜像 更改主机名字hostname和hosts 重启之后关闭内存交换 初始化主结点 sudo kubeadm init --apiserver-advertise-address=172.19.16.2 --image-repository=registry.aliyuncs.com/google_containers --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config slave加入 sudo kubeadm join 172.19.16.2:6443 --token rthfcd.xkdz1bma0zr0pcf0 \ --discovery-token-ca-cert-hash sha256:7a255bd0f1a8a7d87bbc9f443bb901426e17f94057fe1a5a7ce4a246ddb2c749 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl get pods --all-namespaces kubectl get nodes 创建部署 查看状态 访问前端网站 放开端口30940之后就可以访问前端页面了 可以通过两个公网IP都能访问得到该网站。 尝试删除其中一个pod kubectl delete pod frontend-769fbdbdcc-5bkvz 在尝试删除一个front pod之后,可以看到kubernetes系统自动为我们新建了一个frontend的pod pod扩容 kubectl scale deployment frontend --replicas=5

December 14, 2023 · 1 min · 69 words · sirius1y

hadoop部署

生成密钥并实现自我登录 sudo apt-get install vim sudo apt-get install openssh-server cd .ssh ssh-keygen -t rsa -C "sirius1y@outlook.com" cat id_rsa.pub > authorized_keys 安装java sudo apt-get install openjdk-8-jre openjdk-8-jdk 检查java是否安装完成 java -version 下载hadoop 网站:https://archive.apache.org/dist/hadoop/common/hadoop-2.7.0/ wget https://archive.apache.org/dist/hadoop/common/hadoop-2.7.0/hadoop-2.7.0.tar.gz # 解压 sudo tar -zxf hadoop-2.7.0.tar.gz -C /usr/local 修改所有权: cd /usr/local sudo mv hadoop-2.7.0/ hadoop sudo chown -R ubuntu ./hadoop 设置JAVA_HOME环境变量 sudo vim ~/.bashrc # 把下面内容添加到末尾 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 删除~/.ssh/kown_hosts 创建镜像之后新建示例 发现能够存在hadoop —————–创建两台镜像 取机器的昵称 sudo vim /etc/hostname添加自己的名字 sudo vim /etc/hosts,这里都是使用的内网IP地址...

December 14, 2023 · 2 min · 307 words · sirius1y

在云服务器上部署mysql

实验要求 1.在云服务器上启动两个实例(server和client),并实现在两个实例之间进行SSH免密登录。 2.在两个实例上安装MySQL,在server上创建数据库和用户,并在Client上远程连接Server的数据库。 实验步骤 购买两个2核4GB的实例,操作系统为ubuntu20.04 软件更新和安装 sudo apt-get update sudo apt-get install vim sudo apt-get install ssh sudo spt-get install mysql-server SSH免密登录 在clinet端生成密钥,再把公钥添加到本地已认证的密钥中就可以实现本机对自己的免密登录。再把client上面的私钥公钥和已认证的密钥发送到server上,这样就能实现他们的相互免密登录。 ssh-keygen -t rsa -C yuanhao cd ~/.ssh cat id_rsa.pub > authorized_keys scp id_rsa ubuntu@43.132.187.176:~/.ssh/id_rsa scp id_rsa.pub ubuntu@43.132.187.176:~/.ssh/id_rsa.pub scp authorized_keys ubuntu@43.132.187.176:~/.ssh/authorized_keys 之后可以使用cat对authorized_keys进行检查。 client连接远程数据库 在server上安装mysql之后对mysql的配置文件进行修改,把绑定的端口从127.0.0.1改为0.0.0.0,以便于来自client的用户进行访问。 之后在server的mysql中创建用户并赋予权限。 在server上创建一个数据库db1,然后在client上实现对server的mysql登录,这需要在服务器的安全组里放开3306端口。然后检查是否登陆成功,并且能够看到之前创建的db1.

November 30, 2023 · 1 min · 48 words · sirius1y