tonglin0325的个人主页

Mac下安装minikube

1.安装kubectl命令

1
2
brew install kubectl

如果想安装指定版本的kubectl

1
2
3
4
5
curl -LO "https://dl.k8s.io/release/v1.20.0/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
sudo chown root: /usr/local/bin/kubectl

验证版本,会打印出client端和server端的版本,官方建议2个版本直接版本相差不要大于+/-1

1
2
3
4
kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.7", GitCommit:"132a687512d7fb058d0f5890f07d4121b3f0a2e2", GitTreeState:"clean", BuildDate:"2021-05-12T12:32:49Z", GoVersion:"go1.15.12", Compiler:"gc", Platform:"linux/amd64"}

  

2.下载和安装minikube

1
2
3
4
5
6
7
8
9
➜  /Users/lintong/Downloads $ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 68.6M 100 68.6M 0 0 9365k 0 0:00:07 0:00:07 --:--:-- 11.0M
➜ /Users/lintong/Downloads $ sudo install minikube-darwin-amd64 /usr/local/bin/minikube

Password:

参考

1
2
https://minikube.sigs.k8s.io/docs/start/

如果要安装指定版本的话,请到下面的地址下载

1
2
https://github.com/kubernetes/minikube/releases

比如安装v1.21.0版本

1
2
3
curl -LO https://github.com/kubernetes/minikube/releases/download/v1.21.0/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

卸载minikube

1
2
3
minikube delete
rm -rf ~/.minikube

  

3.安装virtualbox

1
2
brew install virtualbox

  

4.使用virtualbox来启动minikube集群

参考:在Mac上基于virtualbox安装minikube

全文 >>

Mac下安装mongodb

1.添加mongo的仓库

1
brew tap mongodb/brew

2.安装mongodb

1
brew install mongodb-community@4.4

参考:Mac OSX 平台安装 MongoDB

安装成功

3.打开mongo shell

1
2
/usr/local/opt/mongodb-community@4.4/bin/mongo xxx:27017/your_db

如果是mongo 6.0的话,是没有mongo命令的,需要额外安装mongosh,下载地址

1
2
https://www.mongodb.com/try/download/shell

4.查询数据

查看db

1
2
show dbs

如果遇到not master and slaveOk=false的报错,可以执行如下命令

1
2
3
4
rs.slaveOk()
或者
rs.secondaryOk()

如果遇到Error: Authentication failed的报错,可能是缺少了–authenticationDatabase admin参数

1
2
/Users/lintong/Downloads/mongosh-1.9.1-darwin-x64/bin/mongosh mongodb://xxx:27017/test -u xxx --authenticationDatabase admin -p

其他参数参考:https://www.mongodb.com/docs/mongodb-shell/reference/options/

查询数据

1
2
db.getCollection("your_collection").find()

查询一条数据

1
2
db.getCollection("your_collection").findOne()

  

全文 >>

Spark学习笔记——rdd,dataframe和dataset转换

1.生成RDD

1
2
val rdd: RDD[(String, Int)] = sc.parallelize(Seq(("cat", 30), ("fox", 40)))

2.生成case class RDD

1
2
3
case class WordCount(word: String, count: Long)
val rdd: RDD[WordCount] = sc.parallelize(Seq(WordCount("dog", 50), WordCount("cow", 60)))

3.rdd转df,注意这里需要隐式转换

1
2
3
4
import spark.implicits._

val df = rdd.toDF()

4.rdd转ds,注意

全文 >>

使用tweak插件修改HTTP请求

tweak是一款可以对request请求的response进行修改的浏览器插件,区别于ModHeader只能对header进行修改,tweak可以对请求的request payload(收费)和response payload(免费)进行拦截和修改。

下图是tweak的界面

同类产品还有requestlytweak的修改HTTP请求response功能是免费的requestly修改API response和request body都是需要收费版本才提供支持

参考:requestly 代理插件

Firefox tweak插件安装地址

https://addons.mozilla.org/en-US/firefox/addon/tweak-extension/

Chrome tweak插件安装地址

https://chromewebstore.google.com/detail/feahianecghpnipmhphmfgmpdodhcapi

tweak的使用分成拦截请求修改请求2个步骤

1.拦截请求#

点击图中按钮

在浏览器中请求对应的接口

接下来在URL中输入接口的相关关键字,tweak就能找到这个接口

2.修改请求#

修改HTTP请求的response,比如我们将返回json中的技术修改成技术xxxx,产品修改成产品yyyy

然后取消request autocomplete,勾选extension

再次刷新页面发起请求,这时我们会发生页面中的信息已经被拦截和修改

参考:方便智能的chrome数据mock插件

Spark学习笔记——使用CatalystSqlParser解析Spark SQL

Spark的parser使用的是antlr来实现,其g4文件如下

1
2
https://github.com/apache/spark/blob/master/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4

如果想解析spark SQL的语句,可以使用其原生的parser来进行解析,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.bigdata.spark

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.catalyst.analysis.UnresolvedRelation
import org.apache.spark.sql.catalyst.parser.CatalystSqlParser
import org.apache.spark.sql.catalyst.plans.logical.{InsertIntoTable, LogicalPlan}
import org.apache.spark.sql.catalyst.plans.logical._
import org.apache.spark.sql.execution.datasources.CreateTable

object SparkSQLParser {

def main(args: Array[String]): Unit = {
// val spark = SparkSession.builder()
// .appName("SQL Create Table Parser")
// .master("local[*]")
// .enableHiveSupport() // 关键:启用 Hive 语法支持
// .getOrCreate()
// val logicalPlan: LogicalPlan = spark.sessionState.sqlParser.parsePlan(sql)

val sql = "SELECT id, name FROM users WHERE age > 18" // select
// val sql = "CREATE TABLE users (id INT, name STRING)" // create
// val sql = "INSERT INTO users VALUES (1, 'Alice')" // insert
// val sql = "INSERT INTO xx.table2 SELECT * FROM xx.table1" // insert


val logicalPlan: LogicalPlan = CatalystSqlParser.parsePlan(sql)
println(logicalPlan)
logicalPlan match {
// 解析建表语句
case createTable: CreateTable =>
println(s"SQL: [$sql] -> 这是一个 CREATE TABLE 语句")
// 解析insert语句
case _: InsertIntoTable =>
println(s"SQL: [$sql] -> 这是一个 INSERT 语句")
// 解析血缘
var inputTables = Set[String]()
var outputTable: Option[String] = None
// 遍历 LogicalPlan 解析血缘
logicalPlan.foreach {
case UnresolvedRelation(tableIdentifier) =>
inputTables += tableIdentifier.quotedString // 解析输入表
case InsertIntoTable(table, _, _, _, _) =>
table match {
case UnresolvedRelation(tableIdentifier) =>
outputTable = Some(tableIdentifier.quotedString) // 解析输出表
case _ =>
outputTable = Some(table.toString()) // 其他情况
}
case _ => // 其他情况忽略
}
println(s"输入表: ${inputTables.mkString(", ")}")
println(s"输出表: ${outputTable.getOrElse("无")}")
// 解析select语句
case _: Project | _: Filter | _: Aggregate | _: Join | _: LogicalPlan =>
println(s"SQL: [$sql] -> 这是一个 SELECT 查询语句")
case _ =>
println(s"SQL: [$sql] -> 未知类型")
}
}

}

1.解析insert语句

1
2
3
4
5
6
7
8
'InsertIntoTable 'UnresolvedRelation `xx`.`table2`, false, false
+- 'Project [*]
+- 'UnresolvedRelation `xx`.`table1`

SQL: [INSERT INTO xx.table2 SELECT * FROM xx.table1] -> 这是一个 INSERT 语句
输入表: `xx`.`table1`
输出表: `xx`.`table2`

2.解析select语句

1
2
3
4
5
6
'Project ['id, 'name]
+- 'Filter ('age > 18)
+- 'UnresolvedRelation `users`

SQL: [SELECT id, name FROM users WHERE age > 18] -> 这是一个 SELECT 查询语句

3.解析create语句

由于spark默认是不支持解析create sql的,需要依赖hive

使用sparksession解析会报

1
2
3
4
5
Exception in thread "main" java.lang.IllegalArgumentException: Unable to instantiate SparkSession with Hive support because Hive classes are not found.
at org.apache.spark.sql.SparkSession$Builder.enableHiveSupport(SparkSession.scala:869)
at com.bigdata.spark.SparkSQLParser$.main(SparkSQLParser.scala:17)
at com.bigdata.spark.SparkSQLParser.main(SparkSQLParser.scala)

使用CatalystSqlParser解析会报

1
2
3
4
5
6
7
8
9
10
11
Exception in thread "main" org.apache.spark.sql.catalyst.parser.ParseException: 
Unsupported SQL statement
== SQL ==
CREATE TABLE users (id INT, name STRING)
at org.apache.spark.sql.catalyst.parser.AbstractSqlParser$$anonfun$parsePlan$1.apply(ParseDriver.scala:74)
at org.apache.spark.sql.catalyst.parser.AbstractSqlParser$$anonfun$parsePlan$1.apply(ParseDriver.scala:69)
at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parse(ParseDriver.scala:100)
at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parsePlan(ParseDriver.scala:69)
at com.bigdata.spark.SparkSQLParser$.main(SparkSQLParser.scala:26)
at com.bigdata.spark.SparkSQLParser.main(SparkSQLParser.scala)

可以使用hive parser来解析建表语句,参考:antlr解析hive语句

全文 >>

CDH5.16安装flink1.10.0

1.采用parcels包的方式来安装flink

编译parcels请参考:制作Flink的Parcel包和csd文件

CDH5.16.1 集成 Flink-1.10.0

cdh5.15.1集成flink说明

2.将parcels包拷贝到对应目录

1
2
3
4
lintong@master:/opt/cloudera/parcel-repo$ ls | grep FLINK
FLINK-1.10.0-BIN-SCALA_2.11-xenial.parcel
FLINK-1.10.0-BIN-SCALA_2.11-xenial.parcel.sha

csd包

1
2
3
lintong@master:/opt/cloudera/csd$ ls
FLINK_ON_YARN-1.10.0.jar

3.安装

配置主机

配置flink集群参数

部署成功

flink集群部署后会在YARN上启动一个以flink用户运行的flink session,注意此时在此flink session中是不能认证成其他用户的,只能是flink用户,可以参考:Flink on Yarn with Kerberos

比如使用flink-scala-shell就会运行在此flink session中,而在里面认证是不会生效

部署成功

参考:Cloudera Manager中安装部署Flink服务

全文 >>