特别注意
-
在哪个机器上
-
在哪个文件夹
-
用哪个用户
-
-
使用Sync同步时
- 尽量少同步文件, 覆盖后很麻烦
- 同步后, 看一眼有没有成功, 步步为营的好习惯
yum 文件格式
排错
好习惯
| |
| 1 改配置前先备份 |
| 2 改完配置要分发 |
| 3 分发完后要看一眼, 个别需要改参数 |
| 4 改完参数再重启 |
vim常用命令备忘
| |
| dG |
| |
| dd |
| |
| o |
| |
| yny |
| ny |
| |
| u |
| |
| ctrl+r |
| |
| r |
| |
| : set nu |
| |
| : set nonu |
| |
| 3G |
| |
| $ |
| |
| ^ |
| |
bash常用命令备忘
| |
| cp -r |
| |
| |
| mkdir -p grand/parent/child |
| |
| |
| tar -czvf dest.tar.gz file.txt file2.txt |
| |
| |
| tar -xzvf sour.tar.gz -C /opt/module |
| |
| |
| / N |
| |
| |
| ctrl+a |
| |
| |
| ctrl+e |
| |
| |
| usermod -aG wheel atguigu |
| |
| |
| |
查看状态
| |
| $ ps -ef | grep |
| |
| |
| $ sudo netstat -nltp | grep |
| |
| |
| curl http://hadoop102:9200/_cat/nodes?v |
| |
| |
tar
| |
| tar -czvf a.tar.gz hello.txt world.txt |
| |
| tar -czvf hello.tar.gz opt/ |
| |
| tar -xzvf hello.tar.gz |
| |
| tar -xzvf hello.tar.gz -C /opt |
| |
| |
| f file 后紧跟的是目标文件名字 |
| c compact |
| v visual |
| x express |
| z gz |
RPM
| |
| rpm -qa | grep firefox |
| |
| |
| rpm -e xxxxxx |
| rpm -e --nodeps xxxxxx(不检查依赖) |
| |
| |
| rpm -ivh xxxxxx.rpm |
| rpm -ivh --nodeps fxxxxxx.rpm(--nodeps,不检测依赖进度) |
| |
| -i -i=install,安装 |
| -v -v=verbose,显示详细信息 |
| -h -h=hash,进度条 |
| --nodeps --nodeps,不检测依赖进度 |
| |
| |
| sudo systemctl status clickhouse-server |
| |
| |
shell 常用工具
1. cut(看懂)
1. 第2个“:”后
| echo $PAHT | cut -f 2- -d ":" |
| # 2- 代表2后所有 |
2. 切割IP地址
| ifconfig | grep inet | cut -f 9- -d " " | cut -f 2 -d " " |
| # 就是找规律, 一点点试出来 |
| |
2. sed(看懂)
1. 替换某行
| # 把含有GATEWAY 的行删掉, 替换成后边的. 带有引号等特殊字符时, 容易出错, 所以用删除整行, 添加整行的方式做 |
| sudo sed -i '/GATEWAY/c\GATEWAY="192.168.10.2"' /etc/sysconfig/network-scripts/ifcfg-ens33 |
| |
2. 替换第一次匹配到的字符
| # 只替换第一次匹配到的字符 |
| sudo sed -i 's/HADOOP_HOM/HADOOP_HOME/1' /etc/profile.d/my_env.sh |
sed经典
| |
| sudo sed -i '/GATEWAY/c\GATEWAY="192.168.10.2"' /etc/sysconfig/network-scripts/ifcfg-ens33 |
| |
| |
| sudo sed -i 's/HADOOP_HOM/HADOOP_HOME/1' /etc/profile.d/my_env.sh |
sed语法
| -i : 直接在文件上编辑 (edit files in place) |
| -e [默认选项]:只在命令行输出,而文件不改变 |
sed例子
| |
| |
| |
| sed -i 's/'''$old_str'''/'''$new_str'''/g' file |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| sed -i '2d' test.txt |
| |
| |
| sed -i '2,$d' test.txt |
| |
| |
| sed -i '2,3d' test.txt |
| |
| |
| sed -i '$d' test.txt |
| |
| |
| sed -i '1d;3d' test.txt |
| |
| |
| sed -i '2a append' test.txt |
| |
| |
| sed -i '2a append\(回车) |
| all test' test.txt |
| |
| |
| sed -i '2r append.txt' test.txt |
| |
| |
| sed -i '2c 替换成的值' test.txt |
| |
| |
| sed -i '/第二行/s/^/添加/g' test.txt--把'第二行'文字出现行数的数据的行首加上'添加'字符串 |
| |
| |
| sed -i 's/关键字/&字符串' test.txt--把字符添加到关键字后面 |
| sed -i 's/关键字/字符串&' test.txt--把字符添加到关键字前面 |
| |
3. sort(看懂)
选项 |
说明 |
-n |
依照数值的大小排序 |
-r |
以相反的顺序来排序 |
-t |
设置排序时所用的分隔字符 |
-k |
指定需要排序的列 |
1. 按照“:”分割后的第三列倒序排序
4. awk(看懂)
1. 切割IP
| ifconfig | grep "inet " | awk '{print $2}' |
| # '{}' 一定是一起的 |
| # |
| |
2. 将passwd文件中的用户id增加数值1并输出
| awk -v i=1 -F : '{print $3+i}' passwd |
3. 以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。
| awk -F : '/^root/{print $1", "$2}' passwd |
| # '{}' 里面只需要1个print |
4. 显示文件名, 行号, 列号
| awk '{print "文件名: " FILENAME "行号: " NR "列号: " NF}' awk.txt |
| # 比较粗暴, 直接写就行, 不用 , 分割 |
Shell
输入/输出重定向
命令 |
功能说明 |
command > file |
将输出重定向到 file |
command < file |
将输入重定向到 file |
command >> file |
将输出以追加的方式重定向到 file |
n > file |
将文件描述符为 n 的文件重定向到 file |
n >> file |
将文件描述符为 n 的文件以追加的方式重定向到 file |
n >& m |
将输出文件 m 和 n 合并 |
n <& m |
将输入文件 m 和 n 合并 |
<< tag |
将开始标记 tag 和结束标记 tag 之间的内容作为输入 |
脚本编辑
快捷方式 |
功能说明 |
shift |
参数左移 |
$@ |
所有的参数 |
$# |
参数的个数 |
shell常用判断
| 2)常用判断条件 |
| (1)两个整数之间比较 |
| == 字符串比较 |
| -lt 小于(less than) -le 小于等于(less equal) |
| -eq 等于(equal) -gt 大于(greater than) |
| -ge 大于等于(greater equal) -ne 不等于(Not equal) |
| (2)按照文件权限进行判断 |
| -r 有读的权限(read) -w 有写的权限(write) |
| -x 有执行的权限(execute) |
| (3)按照文件类型进行判断 |
| -f 文件存在并且是一个常规的文件(file) |
| -e 文件存在(existence) -d 文件存在并是一个目录(directory) |
| -n 参数是否存在 |
| |
脚本套路
| |
| |
| FLUME_HOME=/opt/module/flume "注意没有空格" |
| |
| |
| |
| -e,类似于在第二行写set -e其意义是Exit immediately if a command exits with a non-zero status. ; |
| |
| -x 的意思是Print commands and their arguments as they are executed |
脚本常用
脚本知识点
| |
| nohup |
| |
| |
| |
| ssh $host "command1; command2; #多条命令时, 必须有分号" |
| |
| $* |
| |
| |
| |
经典命令组合
| |
| ssh $host "command 1>f1.log 2>&1 &" |
| |
| |
| ssh $host "ps -ef | grep file-flume-kafka | grep -v grep | awk '{print \$2}' | xargs -n1 kill" |
| |
| |
| |
| |
| ssh $host "[ \$(ps -ef | grep file-flume-kafka | grep -v grep |wc -l) -eq 1 ] && echo ok || echo error" |
| |
| |
| |
| |
待整理
| #!/bin/bash |
| for i in hadoop102 hadoop103 |
| do |
| if [ $1 ] |
| then |
| echo "========== Creating log for $i ==========" |
| ssh $i "sed -i '/mock.date/d' /opt/module/applog/application.yml ; echo 'mock.date: \"$1\"' >> /opt/module/applog/application.yml" |
| fi |
| ssh $i "cd /opt/module/applog; nohup java -jar gmall2020-mock-log-2021-11-29.jar 1>/dev/null 2>&1 &" |
| |
| |
| done |
| |
| |
case
| case $1 in |
| "start") |
| start |
| ;; |
| "stop") |
| stop |
| ;; |
| *) |
| echo "Usage: f1.sh start|stop|status|restart" |
| ;; |
| esac |
for
| for host in hadoop102 hadoop103 hadoop104 |
| do |
| command |
| done |
配置小结
| |
| kafka, 要改node |
| kibanar, 要改node |
| |
| |
经典脚本, 弄熟了, 心里就会有底
Sync
| #!/bin/bash |
| |
| |
| if [ $# -lt 1 ] |
| then |
| echo Not Enough Arguement! |
| exit; |
| fi |
| |
| |
| for host in hadoop102 hadoop103 hadoop104 |
| do |
| echo ==================== $host ==================== |
| |
| |
| for file in $@ |
| do |
| |
| if [ -e $file ] |
| then |
| |
| pdir=$(cd -P $(dirname $file); pwd) |
| |
| |
| |
| fname=$(basename $file) |
| ssh $host "mkdir -p $pdir; cd $pdir; cp $file "$file.`date +%x`.bak"; cd .." |
| |
| rsync -av $pdir/$fname $host:$pdir |
| else |
| echo $file does not exists! |
| fi |
| done |
| done |
| |
SyncPro
| #!/bin/bash |
| |
| |
| if [ $# -lt 1 ] |
| then |
| echo Not Enough Arguement! |
| exit; |
| fi |
| |
| |
| for host in hadoop102 hadoop103 hadoop104 |
| do |
| echo ==================== $host ==================== |
| |
| for file in $@ |
| do |
| |
| if [ -e $file ] |
| then |
| |
| pdir=$(cd -P $(dirname $file); pwd) |
| |
| fname=$(basename $file) |
| ssh $host "mkdir -p $pdir; cd $pdir; cp $file "$file.`date +%x`.bak"; cd .." |
| rsync -av $pdir/$fname $host:$pdir |
| else |
| echo $file does not exists! |
| fi |
| done |
| done |
| |
| |
| |
脚本练习
Kafka启停脚本封装
| #! /bin/bash |
| |
| function kf_start(){ |
| for i in hadoop102 hadoop103 hadoop104 |
| do |
| ssh $i "/opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties" |
| echo " --------$i Kafka Started-------" |
| done |
| } |
| |
| function kf_stop(){ |
| for i in hadoop102 hadoop103 hadoop104 |
| do |
| ssh $i "/opt/module/kafka/bin/kafka-server-stop.sh " |
| echo " --------$i Kafka Stoped-------" |
| |
| done |
| } |
| |
| function kf_status(){ |
| for i in hadoop102 hadoop103 hadoop104 |
| do |
| echo " --------$i Kafka-------" |
| ssh $i "nc -z localhost 9092 && echo '正常' || echo '异常' " |
| done |
| } |
| |
| function list(){ |
| kafka-topics.sh --bootstrap-server hadoop102:9092 --list |
| } |
| |
| case $1 in |
| |
| "start") |
| kf_start |
| ;; |
| |
| "stop") |
| kf_stop |
| ;; |
| |
| "list") |
| list |
| ;; |
| |
| "status") |
| kf_status |
| ;; |
| |
| "restart") |
| kf_stop |
| sleep 15 |
| kf_start |
| ;; |
| |
| "kc") |
| if [ $2 ] |
| then |
| kafka-console-consumer.sh --bootstrap-server hadoop102:9092,hadoop103:9092,hadoop104:9092 --topic $2 |
| else |
| echo "Usage: kf.sh {start|stop|kc [topic]|kp [topic]}" |
| fi |
| ;; |
| |
| "kp") |
| if [ $2 ] |
| then |
| kafka-console-producer.sh --broker-list hadoop102:9092,hadoop103:9092,hadoop104:9092 --topic $2 |
| else |
| echo "Usage: kf.sh {start|stop|kc [topic]|kp [topic]}" |
| fi |
| ;; |
| |
| |
| *) |
| echo "Usage: kafka.sh start|start|stop|status|restart|kp TOPIC|kc TOPIC" |
| ;; |
| esac |
| |
flume
| #!/bin/bash |
| FLUME_HOME=/opt/module/flume |
| |
| function f1_start(){ |
| for host in hadoop102 hadoop103 |
| do |
| ssh $host "nohup $FLUME_HOME/bin/flume-ng agent -n a1 -c $FLUME_HOME/conf -f /opt/confs/flume/real-time-file-flume-kafka.conf -Dflume.root.logger=INFO,console 1>/opt/module/flume/f1.log 2>&1 &" |
| done |
| |
| } |
| |
| function f1_stop(){ |
| for host in hadoop102 hadoop103 |
| do |
| ssh $host "jps -l | grep org.apache.flume.node.Application | awk '{print \$1}' | xargs -n1 kill" |
| done |
| } |
| |
| function f1_status(){ |
| for host in hadoop102 hadoop103 |
| do |
| echo "========== $host ===========" |
| # 使用jps要比用ps更好 |
| ssh $host "[ \$(jps -l | grep org.apache.flume.node.Application |wc -l) -ge 1 ] && echo ok || echo error" |
| done |
| } |
| |
| case $1 in |
| "start") |
| f1_start |
| ;; |
| "stop") |
| f1_stop |
| ;; |
| "status") |
| f1_status |
| ;; |
| "restart") |
| f1_stop |
| sleep 5 |
| f1_start |
| ;; |
| *) |
| echo "Usage: f1.sh start|stop|status|restart" |
| ;; |
| esac |
| |
Redis
| |
| #!/bin/bash |
| |
| case "$1" in |
| start) |
| redis-server /opt/module/redis-6.2.1/redis.conf |
| echo "redis 6379 已启动" |
| ;; |
| stop) |
| ps -ef | grep 6379 | grep -v color | awk '{print $2}' | xargs -n1 kill -9 > /dev/null 2>&1 |
| echo "redis 6379 已停止" |
| ;; |
| status) |
| [ $(ps -ef | grep 6379 | grep -v grep |wc -l) -gt 0 ] && echo redis 6379 is ok || echo redis 6379 is down |
| ;; |
| *) |
| echo start|stop|status |
| ;; |
| esac |
| |
| |
nginx
| #!/bin/bash |
| APPNAME=gmall0906-logger-0.0.1-SNAPSHOT.jar |
| |
| case "$1" in |
| "start") |
| ssh hadoop102 "/opt/module/nginx/sbin/nginx ;echo nginx on hadoop102 is started success" |
| |
| for item in hadoop102 hadoop103 hadoop104 |
| do |
| echo -e "\n springboot on ${item} started success" |
| ssh $item "cd /opt/module/rt_gmall/log;nohup java -jar $APPNAME > /dev/null 2>&1 &" |
| done |
| ;; |
| |
| "stop") |
| /opt/module/nginx/sbin/nginx -s stop |
| |
| for item in hadoop102 hadoop103 hadoop104 |
| do |
| echo -e "\n stopping springboot on ${item}" |
| # 停止标准写法 |
| ssh $item "ps -ef | grep $APPNAME | grep -v grep | awk '{print \$2}' | xargs -n1 kill > /dev/null 2>&1 &" |
| |
| done |
| ;; |
| |
| "status") |
| |
| for item in hadoop102 hadoop103 hadoop104 |
| do |
| ssh $item "[ \$(ps -ef | grep $APPNAME | grep -v grep |wc -l) -eq 1 ] && echo springboot on $item is ok || echo springboot on $item is down" |
| done |
| ssh hadoop102 "[ \$(ps -ef | grep nginx | grep -v grep |wc -l) -eq 3 ] && echo nginx is ok || echo nginx is down; echo \$(ps -ef | grep nginx | grep -v grep |wc -l)" |
| ssh hadoop102 "ps -ef | grep nginx | grep -v grep" |
| ;; |
| |
| *) |
| echo "usage: rtlog_nginx_springboot.sh status|start|stop" |
| ;; |
| esac |
| |
| |
Hadoop
启动命令
| |
| sbin/start-all.sh |
| |
| |
| sbin/start-dfs.sh |
| |
| sbin/start-yarn.sh |
| |
| |
| |
| bin/hdfs --daemon start namenode/datanode/secondarynamenode |
| |
| bin/yarn --daemon start resourcemanager/nodemanager |
| |
| bin/mapred --daemon start historyserver |
| |
| |
| |
| (1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态) |
| (2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态) |
| (3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态) |
| (4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态) |
| (5) hfds fsck / |
| (6) hdfs fsck / -delete |
| |
| 进入安全模式的几种情况, 安全模式(safeMode)就是只能读不能写, |
| 1. NN磁盘空间满了或内存满了 |
| 加磁盘或加内存 |
| 2. 启动集群会进入安全模式 |
| 启动时候由于数据丢失无法退出安全模式 |
| 1. 手动退出安全模式 |
| hdfs dfsadmin -safemode leave |
| 2. 删掉丢失块的文件 |
| hdfs fsck -delete / |
| |
| 安全模式应用小技巧 |
| 1. 比如Hive框架启动时候,要求HDFS不在安全模式 |
| 2. 我们想通过脚本上传文件到HDFS,要求HDFS不在安全模式 |
| 如果集群处在安全模式,操作会失败,可以在脚本中加入hdfs dfsadmin -safemode wait阻塞脚本执行,直到集群退出安全模式 |
| |
| |
| 加入后需要刷新 |
| hdfs dfsadmin -refreshNodes |
| |
| |
| |

hadoop fs/hdfs dfs 命令
功能说明 |
命令 |
创建目录 |
hdfs dfs -mkdir -p /data/flink |
显示目录 |
hdfs dfs -ls / |
从HDFS拷贝到本地 |
hdfs dfs -copyToLocal /data/data.txt ./ |
文件上传到集群(从本地) |
hhdfs dfs -copyFromLocal data.txt / |
文件下载 |
hdfs dfs -get /data/flink |
删除集群的文件 |
hdfs dfs -rm /data/flink |
删除文件夹 |
hdfs dfs -rm -r -skipTrash /data |
从本地剪切粘贴到HDFS |
hdfs dfs -moveFromLocal data.txt /data/ |
追加一个文件到已经存在的文件末尾hdfs dfs -appendToFile data1.txt /data/data.txt |
|
显示文件内容 |
hdfs dfs -cat data.txt |
修改文件所属权限 |
hdfs dfs -chmod 777 xxx.sh |
修改文件所属用户组 |
hdfs dfs -chown root:root data.txt |
从HDFS的一个路径拷贝到HDFS的另一个路径 |
hdfs dfs -cp data.txt /data1.txt |
在HDFS目录中移动文件 |
hdfs dfs -mv data.txt /opt/ |
合并下载多个文件 |
hdfs dfs -getmerge /data/* ./data_merge.txt |
hadoop fs -put |
等同于copyFromLocal |
显示一个文件的末尾 |
hdfs dfs -tail data.txt |
删除文件或文件夹 |
hdfs dfs -rm /data/data.txt |
删除空目录 |
hdfs dfs -rmdir /data |
统计文件夹的大小信息 |
hdfs dfs -s -h /data |
统计文件夹下的文件大小信息 |
hdfs dfs -h /data |
设置HDFS中文件的副本数量 |
hdfs dfs -setrep 3 /data/data.txt |
yarn命令
功能说明 |
命令 |
查看正在运行的yarn任务列表 |
yarn application -list appID |
kill掉指定id的yarn任务 |
yarn application -kill appID |
查看任务日志信息 |
yarn logs -applicationId appID |
Zookeeper

启动命令
功能说明 |
命令脚本 |
启动zookeeper服务 |
zkServer.sh start |
查看zookeeper状态 |
zkServer.sh status |
停止zookeeper服务 |
zkServer.sh stop |
启动zookeeper客户端 |
zkCli.sh -server 127.0.0.1:2181 |
退出zookeeper客户端 |
quit |
基本操作
功能说明 |
命令脚本 |
当前znode中所包含的内容 |
ls / |
创建普通节点(前面是节点的路径,后面是值) |
create /bigdata/flink "flink" |
获取节点的值 |
get /bigdata |
修改节点的值 |
set /bigdata/flink "flinksql" |
删除节点 |
delete /bigdata/flink |
递归删除节点 |
rmr /bigdata |
四字母命令
命令 |
功能说明 |
例子 |
conf |
zk服务配置的详细信息 |
echo conf | nc 127.0.0.1 2181 |
stat |
客户端与zk连接的简要信息 |
参考上面 |
srvr |
zk服务的详细信息 |
参考上面 |
cons |
客户端与zk连接的详细信息 |
参考上面 |
mntr |
zk服务目前的性能状况 |
参考上面 |
crst |
重置当前的所有连接、会话 |
参考上面 |
dump |
列出未经处理的会话和连接信息 |
参考上面 |
envi |
列出zk的版本信息、主机名称、Java版本、服务器名称等等 |
参考上面 |
ruok |
测试服务器是否正在运行,如果在运行返回imok,否则返回空 |
参考上面 |
srst |
重置Zookeeper的所有统计信息 |
参考上面 |
wchs |
列出watch的总数,连接数 |
参考上面 |
wchp |
列出所有watch的路径及sessionID |
参考上面 |
mntr |
列出集群的关键性能数据,包括zk的版本、node数量、临时节点数等等 |
参考上面 |
Kafka
练习
1. 所有集群都关闭的情况下, 手动一个个启动下, 看能否正确启动
| 1. zookeeper启动 |
| 2. hdfs启动 |
| 3. 参数不能提示, 最好复制 |
查看当前服务器中的所有topic
| kafka-topics.sh --bootstrap-server hadoop102:9092 --list |
创建topic
| kafka-topics.sh --bootstrap-server hadoop102:9092 --create --partitions 1 --replication-factor 3 --topic first |
删除topic
注意: 需要server.properties中设置delete.topic.enable=true否则只是标记删除
| kafka-topics --zookeeper xxxxxx:2181 --delete --topic topic_name |
查看某个Topic的详情
| kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic first |
修改分区数, 不能修改副本数
| kafka-topics.sh --bootstrap-server hadoop102:9092 --alter --topic first --partitions |
删除topic
| kafka-topics.sh --bootstrap-server hadoop102:9092 --delete --topic first |
生产者
| kafka-console-producer --broker-list xxxxxx:9092 --topic topic_name |
| |
| 可加:--property parse.key=true(有key消息) |
消费者
| kafka-console-consumer --bootstrap-server xxxxxx:9092 --topic topic_name |
| |
| 注:可选 |
| |
| --from-beginning:会把主题中以往所有的数据都读取出来 |
| |
| --whitelist '.*' :消费所有的topic |
| |
| --property print.key=true:显示key进行消费 |
| |
| --partition 0:指定分区消费 |
| |
| --offset:指定起始偏移量消费 |
查看某个Topic的详情
| kafka-topics --zookeeper xxxxxx:2181 --describe --topic topic_name |
修改分区数
| kafka-topics --zookeeper xxxxxx:2181 --alter --topic topic_name --partitions 6 |
查看某个消费者组信息
| kafka-consumer-groups --bootstrap-server xxxxxx:9092 --describe --group group_name |
删除消费者组
| kafka-consumer-groups --bootstrap-server xxxxxx:9092 ---delete --group group_name |
重置offset
| kafka-consumer-groups --bootstrap-server xxxxxx:9092 --group group_name |
| |
| --reset-offsets --all-topics --to-latest --execute |
leader重新选举
指定Topic指定分区用重新PREFERRED:优先副本策略 进行Leader重选举
| kafka-leader-election --bootstrap-server xxxxxx:9092 |
| --topic topic_name --election-type PREFERRED --partition 0 |
所有Topic所有分区用重新PREFERRED:优先副本策略 进行Leader重选举
| kafka-leader-election --bootstrap-server xxxxxx:9092 |
| --election-type preferred --all-topic-partitions |
查询kafka版本信息
| kafka-configs --bootstrap-server xxxxxx:9092 |
| --describe --version |
增删改配置
功能说明 |
参数 |
选择类型 |
--entity-type (topics/clients/users/brokers/broker- loggers) |
类型名称 |
--entity-name |
删除配置 |
--delete-config k1=v1,k2=v2 |
添加/修改配置 |
--add-config k1,k2 |
topic添加/修改动态配置
| kafka-configs --bootstrap-server xxxxxx:9092 |
| --alter --entity-type topics --entity-name topic_name |
| --add-config file.delete.delay.ms=222222,retention.ms=999999 |
topic删除动态配置
| kafka-configs --bootstrap-server xxxxxx:9092 |
| --alter --entity-type topics --entity-name topic_name |
| --delete-config file.delete.delay.ms,retention.ms |
持续批量拉取消息
单次最大消费10条消息(不加参数意为持续消费)
| kafka-verifiable-consumer --bootstrap-server xxxxxx:9092 |
| --group group_name |
| --topic topic_name --max-messages 10 |
删除指定分区的消息
删除指定topic的某个分区的消息删除至offset为1024
json文件offset-json-file.json
| { |
| "partitions": [ |
| { |
| "topic": "topic_name", |
| "partition": 0, |
| "offset": 1024 |
| } |
| ], |
| "version": 1 |
| } |
| kafka-delete-records --bootstrap-server xxxxxx:9092 |
| --offset-json-file offset-json-file.json |
查看Broker磁盘信息
查询指定topic磁盘信息
| kafka-log-dirs --bootstrap-server xxxxxx:9090 |
| --describe --topic-list topic1,topic2 |
查询指定Broker磁盘信息
| kafka-log-dirs --bootstrap-server xxxxxx:9090 |
| --describe --topic-list topic1 --broker-list 0 |
Mysql
使用步骤
卸载
| #!/bin/bash |
| service mysql stop 2>/dev/null |
| service mysqld stop 2>/dev/null |
| rpm -qa | grep -i mysql | xargs -n1 rpm -e --nodeps 2>/dev/null |
| rpm -qa | grep -i mariadb | xargs -n1 rpm -e --nodeps 2>/dev/null |
| rm -rf /var/lib/mysql |
| rm -rf /var/log/mysqld.log |
| rm -rf /usr/lib64/mysql |
| rm -rf /etc/my.cnf |
| rm -rf /usr/my.cnf |
安装
配置
安装
安装
Hive
启动类
功能说明 |
命令 |
启动hiveserver2服务 |
bin/hiveserver2 |
启动beeline |
bin/beeline |
连接hiveserver2 |
beeline> !connect jdbc:hive2://hadoop102:10000 |
metastroe服务 |
bin/hive --service metastore |
hive 启动元数据服务(metastore和hiveserver2)和优雅关闭脚本
| 启动: hive.sh start |
| 关闭: hive.sh stop |
| 重启: hive.sh restart |
| 状态: hive.sh status |
脚本如下
| #!/bin/bash |
| HIVE_LOG_DIR=$HIVE_HOME/logs |
| mkdir -p $HIVE_LOG_DIR |
| |
| function check_process() |
| { |
| pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}') |
| ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1) |
| echo $pid |
| [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1 |
| } |
| |
| function hive_start() |
| { |
| metapid=$(check_process HiveMetastore 9083) |
| cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &" |
| cmd=$cmd" sleep4; hdfs dfsadmin -safemode wait >/dev/null 2>&1" |
| [ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动" |
| server2pid=$(check_process HiveServer2 10000) |
| cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &" |
| [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动" |
| } |
| |
| function hive_stop() |
| { |
| metapid=$(check_process HiveMetastore 9083) |
| [ "$metapid" ] && kill $metapid || echo "Metastore服务未启动" |
| server2pid=$(check_process HiveServer2 10000) |
| [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动" |
| } |
| |
| case $1 in |
| "start") |
| hive_start |
| ;; |
| "stop") |
| hive_stop |
| ;; |
| "restart") |
| hive_stop |
| sleep 2 |
| hive_start |
| ;; |
| "status") |
| check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常" |
| check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常" |
| ;; |
| *) |
| echo Invalid Args! |
| echo 'Usage: '$(basename $0)' start|stop|restart|status' |
| ;; |
| esac |
常用交互命令
功能说明 |
命令 |
不进入hive的交互窗口执行sql |
bin/hive -e "sql语句" |
执行脚本中sql语句 |
bin/hive -f hive.sql |
退出hive窗口 |
exit 或 quit |
命令窗口中查看hdfs文件系统 |
dfs -ls / |
命令窗口中查看hdfs文件系统 |
! ls /data/h |
SQL类(特殊的)
说明 |
语句 |
查看hive中的所有数据库 |
show databases |
用default数据库 |
use default |
查询表结构 |
desc table_name |
查看数据库 |
show databases |
重命名表名 |
alter table table1 rename to table2 |
修改表中字段 |
alter table table_name change name user_name String |
修改字段类型 |
alter table table_name change salary salary Double |
创建外部表 |
create external table .... |
查询外部表信息 |
desc formatted outsidetable |
创建视图 |
create view view_name as select * from table_name ..... |
添加数据 |
load data local inpath 'xxx' overwrite into table table_name partition(day='2021-12-01') |
内置函数
(1) NVL
给值为NULL的数据赋值,它的格式是NVL( value,default_value)。它的功能是如果value为NULL,则NVL函数返回default_value的值,否则返回value的值,如果两个参数都为NULL ,则返回NULL
| select nvl(column, 0) from xxx; |
(2)行转列
函数 |
描述 |
CONCAT(string A/col, string B/col…) |
返回输入字符串连接后的结果,支持任意个输入字符串 |
CONCAT_WS(separator, str1, str2,...) |
第一个参数参数间的分隔符,如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间。 |
COLLECT_SET(col) |
将某字段的值进行去重汇总,产生array类型字段 |
COLLECT_LIST(col) |
函数只接受基本数据类型,它的主要作用是将某字段的值进行不去重汇总,产生array类型字段。 |
(3)列转行(一列转多行)
Split(str, separator): 将字符串按照后面的分隔符切割,转换成字符array。
EXPLODE(col):
将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW
| 用法: |
| |
| LATERAL VIEW udtf(expression) tableAlias AS columnAlias |
解释:lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。
准备数据源测试
movie |
category |
《功勋》 |
记录,剧情 |
《战狼2》 |
战争,动作,灾难 |
SQL
| SELECT movie,category_name |
| FROM movie_info |
| lateral VIEW |
| explode(split(category,",")) movie_info_tmp AS category_name ; |
| |
测试结果
| 《功勋》 记录 |
| 《功勋》 剧情 |
| 《战狼2》 战争 |
| 《战狼2》 动作 |
| 《战狼2》 灾难 |
| |
窗口函数
(1)OVER()
定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。
(2)CURRENT ROW(当前行)
| n PRECEDING:往前n行数据 |
| |
| n FOLLOWING:往后n行数据 |
(3)UNBOUNDED(无边界)
| UNBOUNDED PRECEDING 前无边界,表示从前面的起点 |
| |
| UNBOUNDED FOLLOWING后无边界,表示到后面的终点 |
SQL案例:由起点到当前行的聚合
| select |
| sum(money) over(partition by user_id order by pay_time rows between UNBOUNDED PRECEDING and current row) |
| from or_order; |
SQL案例:当前行和前面一行做聚合
| select |
| sum(money) over(partition by user_id order by pay_time rows between 1 PRECEDING and current row) |
| from or_order; |
SQL案例:当前行和前面一行和后一行做聚合
| select |
| sum(money) over(partition by user_id order by pay_time rows between 1 PRECEDING AND 1 FOLLOWING ) |
| from or_order; |
SQL案例:当前行及后面所有行
| select |
| sum(money) over(partition by user_id order by pay_time rows between current row and UNBOUNDED FOLLOWING ) |
| from or_order; |
(4)LAG(col,n,default_val)
往前第n行数据,没有的话default_val
(5)LEAD(col,n, default_val)
往后第n行数据,没有的话default_val
SQL案例:查询用户购买明细以及上次的购买时间和下次购买时间
| select |
| user_id,,pay_time,money, |
| |
| lag(pay_time,1,'1970-01-01') over(PARTITION by name order by pay_time) prev_time, |
| |
| lead(pay_time,1,'1970-01-01') over(PARTITION by name order by pay_time) next_time |
| from or_order; |
| |
(6)FIRST_VALUE(col,true/false)
当前窗口下的第一个值,第二个参数为true,跳过空值。
(7)LAST_VALUE (col,true/false)
当前窗口下的最后一个值,第二个参数为true,跳过空值。
SQL案例:查询用户每个月第一次的购买时间 和 每个月的最后一次购买时间
| select |
| FIRST_VALUE(pay_time) |
| over( |
| partition by user_id,month(pay_time) order by pay_time |
| rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING |
| ) first_time, |
| |
| LAST_VALUE(pay_time) |
| over(partition by user_id,month(pay_time) order by pay_time rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING |
| ) last_time |
| from or_order; |
| |
(8)NTILE(n)
把有序窗口的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。(用于将分组数据按照顺序切分成n片,返回当前切片值)
SQL案例:查询前25%时间的订单信息
| select * from ( |
| select User_id,pay_time,money, |
| |
| ntile(4) over(order by pay_time) sorted |
| |
| from or_order |
| ) t |
| where sorted = 1; |
| |
4个By
(1)Order By
全局排序,只有一个Reducer。
(2)Sort By
分区内有序。
(3)Distrbute By
类似MR中Partition,进行分区,结合sort by使用。
(4) Cluster By
当Distribute by和Sorts by字段相同时,可以使用Cluster by方式。Cluster by除了具有Distribute by的功能外还兼具Sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
在生产环境中Order By用的比较少,容易导致OOM。
在生产环境中Sort By+ Distrbute By用的多。
排序函数
(1)RANK()
排序相同时会重复,总数不会变
(2)DENSE_RANK()
排序相同时会重复,总数会减少
(3)ROW_NUMBER()
会根据顺序计算
日期函数
datediff:返回结束日期减去开始日期的天数
| datediff(string enddate, string startdate) |
| |
| select datediff('2021-11-20','2021-11-22') |
| |
date_add:返回开始日期startdate增加days天后的日期
| date_add(string startdate, int days) |
| |
| select date_add('2021-11-20',3) |
| |
date_sub:返回开始日期startdate减少days天后的日期
| date_sub (string startdate, int days) |
| |
| select date_sub('2021-11-22',3) |
| |
启动脚本
Beeline
| #!/bin/bash |
| beeline -u jdbc:hive2://hadoop102:10000 -n atguigu --hiveconf hive.exec.mode.local.auto=true |
| |
hbase命令demo
| 1. HBase shell namespace |
| 1) 查看所有的namespace |
| list_namespace |
| 2) 创建namespace |
| create_namespace 'mydb' |
| create_namespace 'mydb1' , {'createtime'=>'2022-05-31' , 'author'=>'atguigu'} |
| 3) 查看namespace的详情 |
| describe_namespace 'mydb' |
| 4) 修改namespace |
| alter_namespace 'mydb1' , {METHOD=>'set' , 'author'=>'wyh' } |
| alter_namespace 'mydb1' , {METHOD=>'set' , 'addr'=>'beijing'} |
| alter_namespace 'mydb1' , {METHOD=>'set' , 'author'=>'wyh' ,'addr'=>'beijing'} |
| alter_namespace 'mydb1' , {METHOD=>'unset' , NAME=>'addr' } |
| 5) 删除namespace(只能删除空的namespace) |
| drop_namespace 'mydb' |
| 6) 查看namespace下的表 |
| list_namespace_tables 'mydb1' |
| |
| 2. HBase shell table ddl |
| |
| 1) 查看所有的表, 默认 |
| list |
| |
| 2) 创建表 |
| create 'test1', {NAME=>'info1' , VERSIONS=>'3'} , {NAME=>'info2'} |
| create 'my1:test2' , {NAME=>'info1'} |
| create 'test3' , 'info1' , 'info2' |
| |
| 3) 查看表的详情 |
| describe 'test1' |
| desc 'test1' |
| |
| 4) 修改表 |
| alter 'test3' , NAME=> 'info1' , VERSIONS => 5 |
| alter 'test3' , NAME=> 'info3' , VERSIONS => 5 |
| alter 'test3', NAME => 'info1', METHOD => 'delete' |
| alter 'test3', 'delete' => 'info2' |
| |
| 5) 表的状态 |
| is_enabled 'test3' |
| is_disabled 'test3' |
| disable 'test3' |
| enable 'test3' |
| |
| 6) 删除表 |
| disable 'test3' |
| drop 'test3' |
| |
| 7) 查看表是否存在 |
| exists 'test3' |
| |
| 8) 查看表的regions |
| list_regions 'test3' |
| |
| 3. HBase shell table dml |
| |
| 1) 新增数据 |
| disable 'stu' |
| drop 'stu' |
| create 'stu' , 'info1' , 'info2' |
| put 'stu' , '1001' , 'info1:name' , 'zhangsan' |
| put 'stu' , '1001' , 'info1:age' , '20' |
| put 'stu' , '1001' , 'info1:gender' , 'man' |
| put 'stu' , '1001' , 'info2:addr' , 'beijing' |
| |
| put 'stu' , '1002' , 'info1:name' , 'lisi' |
| put 'stu' , '1002' , 'info1:age' , '25' |
| put 'stu' , '1002' , 'info1:gender' , 'woman' |
| put 'stu' , '1002' , 'info2:addr' , 'shanghai' |
| put 'stu' , '1002' , 'info2:passwd' , 'nicai' |
| |
| put 'stu' , '1003' , 'info1:name' , 'wangwu' |
| put 'stu' , '1003' , 'info1:age' , '30' |
| put 'stu' , '1003' , 'info1:gender' , 'man' |
| put 'stu' , '1003' , 'info2:addr' , 'tianjing' |
| |
| put 'stu' , '10021' , 'info1:name' , 'zhaoliu' |
| put 'stu' , '10021' , 'info1:age' , '35' |
| put 'stu' , '10021' , 'info1:gender' , 'man' |
| put 'stu' , '10021' , 'info2:addr' , 'hebei' |
| |
| put 'stu' , '10020' , 'info1:name' , 'tianqi' |
| put 'stu' , '10020' , 'info1:age' , '40' |
| put 'stu' , '10020' , 'info1:gender' , 'women' |
| put 'stu' , '10020' , 'info2:addr' , 'shanxi' |
| |
| |
| 2) 基于rowkey查询数据 |
| get 'stu' , '1001' |
| get 'stu' , '1001' , 'info1:name' |
| |
| 3) 扫描数据 |
| scan 'stu' |
| scan 'stu' ,{STARTROW=>'1001' , STOPROW=> '1002!'} |
| scan 'stu' ,{STARTROW=>'1001' , STOPROW=> '1002|'} |
| scan 'stu' , {RAW=>true, VERSIONS=>5} |
| |
| 4) 修改数据 |
| put 'stu' , '1001' , 'info1:name' ,'zhangxiaosan' |
| |
| 5) 删除操作 |
| delete 'stu' , '1001' , 'info1:name' 删除指定版本的数据,默认最新版本(Delete) |
| deleteall 'stu' , '1002' , 'info1:name' 删除一个列所有版本的数据(DeleteColumn) |
| deleteall 'stu' , '1002' 删除整个列族的数据(DeleteFamily) |
| 6) 统计表中的数据条数 |
| count 'stu' |
| 7) 清空表数据 |
| truncate 'stu' 直接删除内存中对应的数据和HDFS中对应的数据文件 |
| |
| |
| |
| |
| |
| |
| |
Redis
约定
- 成功返回1, 不成功返回0
- 计算时, 成功, 返回当时的值
- ttl, -1永不过期, -2已过期, 其他正数, 代表还剩下的描述
- range, 从0开始, 左闭右闭. -1 代表最后一个元素
key
命令 |
功能说明 |
keys * |
查看当前库的所有键 |
exists |
判断某个键是否存在 |
type |
查看键的类型 |
del |
删除某个键 |
expire |
为键值设置过期时间,单位秒 |
ttl |
查看还有多久过期,-1表示永不过期,-2表示已过期 |
dbsize |
查看当前数据库中key的数量 |
flushdb |
清空当前库 |
Flushall |
通杀全部库 |
String
命令 |
功能说明 |
get |
查询对应键值 |
set |
添加键值对 |
append |
将给定的追加到原值的末尾 |
strlen |
获取值的长度 |
setnx |
只有在key 不存在时设置key的值 |
incr |
将key中存储的数字值增1只能对数字值操作,如果为空,新增值为1 |
decr |
将key中存储的数字值减1只能对数字之操作,如果为空,新增值为-1 |
incrby /decrby 步长 |
将key中存储的数字值增减,自定义步长 |
mset |
同时设置一个或多个key-value对 |
mget |
同时获取一个或多个value |
msetnx |
同时设置一个或多个key-value对,当且仅当所有给定的key都不存在 |
getrange <起始位置> <结束位置> |
获得值的范围,类似java中的substring |
setrange <起始位置> |
用覆盖所存储的字符串值,从<起始位置>开始 |
setex <过期时间> |
设置键值的同时,设置过去时间,单位秒 |
getset |
以新换旧,设置了新值的同时获取旧值 |
List
命令 |
功能说明 |
lpush/rpush |
从左边/右边插入一个或多个值。 |
lpop/rpop |
从左边/右边吐出一个值。值在键在,值光键亡。 |
rpoplpush |
从列表右边吐出一个值,插到列表左边 |
lrange |
按照索引下标获得元素(从左到右) |
lindex |
按照索引下标获得元素(从左到右) |
llen |
获得列表长度 |
linsert before |
在的后面插入 插入值 |
lrem |
从左边删除n个value(从左到右) |
Set
命令 |
功能说明 |
sadd .... |
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。 |
smembers |
取出该集合的所有值。 |
sismember |
判断集合是否为含有该值,有返回1,没有返回0 |
scard |
返回该集合的元素个数。 |
srem .... |
删除集合中的某个元素。 |
spop |
随机从该集合中吐出一个值, 会删除 取出来的元素. |
srandmember |
随机从该集合中取出n个值。不会从集合中删除 |
sinter |
返回两个集合的交集元素。 |
sunion |
返回两个集合的并集元素。 |
sunionstore |
复制整个集合, 加上sotre之后都可以存起来 |
sdiff |
返回两个集合的差集元素。 |
Hash
命令 |
功能说明 |
hset |
给集合中的 键赋值 |
hget |
从集合 取出 value |
hgetall |
|
hmset ... |
批量设置hash的值 |
hexists key |
查看哈希表 key 中,给定域 field 是否存在。 |
hkeys |
列出该hash集合的所有field |
hvals |
列出该hash集合的所有value |
hincrby |
为哈希表 key 中的域 field 的值加上增量 increment |
hsetnx |
将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 |
zset(Sorted set)
命令 |
功能说明 |
zadd ... |
将一个或多个 member 元素及其 score 值加入到有序集 key 当中 |
zrange [WITHSCORES] |
返回有序集 key 中,下标在 之间的元素带WITHSCORES,可以让分数一起和值返回到结果集。 |
zrangebyscore key min max [withscores] [limit offset count] |
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 |
zrevrangebyscore key max min [withscores] [limit offset count] |
同上,改为从大到小排列。 |
zincrby |
为元素的score加上增量 |
zrem |
删除该集合下,指定值的元素 |
zcount |
统计该集合,分数区间内的元素个数 |
zrank |
返回该值在集合中的排名,从0开始。 |
Flink
启动
run
| ./bin/flink run [OPTIONS] |
| |
| ./bin/flink run -m yarn-cluster -c com.wang.flink.WordCount /opt/app/WordCount.jar |
OPTIONS |
功能说明 |
-d |
detached 是否使用分离模式 |
-m |
jobmanager 指定提交的jobmanager |
-yat |
–yarnapplicationType 设置yarn应用的类型 |
-yD |
使用给定属性的值 |
-yd |
–yarndetached 使用yarn分离模式 |
-yh |
–yarnhelp yarn session的帮助 |
-yid |
–yarnapplicationId 挂到正在运行的yarnsession上 |
-yj |
–yarnjar Flink jar文件的路径 |
-yjm |
–yarnjobManagerMemory jobmanager的内存(单位M) |
-ynl |
–yarnnodeLabel 指定 YARN 应用程序 YARN 节点标签 |
-ynm |
–yarnname 自定义yarn应用名称 |
-yq |
–yarnquery 显示yarn的可用资源 |
-yqu |
–yarnqueue 指定yarn队列 |
-ys |
–yarnslots 指定每个taskmanager的slots数 |
-yt |
yarnship 在指定目录中传输文件 |
-ytm |
–yarntaskManagerMemory 每个taskmanager的内存 |
-yz |
–yarnzookeeperNamespace 用来创建ha的zk子路径的命名空间 |
-z |
–zookeeperNamespace 用来创建ha的zk子路径的命名空间 |
-p |
并行度 |
-yn |
需要分配的YARN容器个数(=任务管理器的数量) |
info
| ./bin/flink info [OPTIONS] |
OPTIONS |
功能说明 |
-c |
程序进入点,主类 |
-p |
并行度 |
list
| ./bin/flink list [OPTIONS] |
OPTIONS |
功能说明 |
-a |
–all 显示所有应用和对应的job id |
-r |
–running 显示正在运行的应用和job id |
-s |
–scheduled 显示调度的应用和job id |
-m |
–jobmanager 指定连接的jobmanager |
-yid |
–yarnapplicationId 挂到指定的yarn id对应的yarn session上 |
-z |
–zookeeperNamespace 用来创建ha的zk子路径的命名空间 |
stop
| ./bin/flink stop [OPTIONS] <Job ID> |
OPTIONS |
功能说明 |
-d |
在采取保存点和停止管道之前,发送MAX_WATERMARK |
-p |
savepointPath 保存点的路径 'xxxxx' |
-m |
–jobmanager 指定连接的jobmanager |
-yid |
–yarnapplicationId 挂到指定的yarn id对应的yarn session上 |
-z |
–zookeeperNamespace 用来创建ha的zk子路径的命名空间 |
cancel(弱化)
| ./bin/flink cancel [OPTIONS] <Job ID> |
OPTIONS |
功能说明 |
-s |
使用 "stop "代替 |
-D |
允许指定多个通用配置选项 |
-m |
要连接的JobManager的地址 |
-yid |
–yarnapplicationId 挂到指定的yarn id对应的yarn session上 |
-z |
–zookeeperNamespace 用来创建ha的zk子路径的命名空间 |
savepoint
| ./bin/flink savepoint [OPTIONS] <Job ID> |
OPTIONS |
功能说明 |
-d |
要处理的保存点的路径 |
-j |
Flink程序的JAR文件 |
-m |
要连接的JobManager的地址 |
-yid |
–yarnapplicationId 挂到指定的yarn id对应的yarn session上 |
-z |
–zookeeperNamespace 用来创建ha的zk子路径的命名空间 |
ElasticSearch
| ElasticSearch 本来立意就高, 要处理大量数据. 所以下面的配置不更改, 根本就起不来 |
| |
| sudo vim /etc/security/limits.conf |
| |
| * soft nofile 65536 |
| * hard nofile 131072 |
| * soft nproc 2048 |
| * hard nproc 65536 |
| |
| sudo vim /etc/sysctl.conf |
| |
| vm.max_map_count=262144 |
| |
| sudo vim /etc/security/limits.d/20-nproc.conf |
| |
| * soft nproc 65536 |
| |
| '注意分发, 分发完后看一眼' |
clickhouse
| $ mkdir clickhouse |
| $ cd clickhouse |
| $ curl -O 'https://builds.clickhouse.com/master/amd64/clickhouse' && chmod a+x ./clickhouse |
| $ ./clickhouse server |
再启动一个终端窗口,运行
面试问题
merge tree
- 在内存中将数据块排序
- 追加写入硬盘
- optimize: 按照归并排序合并数据块
replacing merge tree
- 在内存中将数据块排序并去重
- 追加写入硬盘
- optimize: 归并排序+去重
summing merge tree
- 在内存中将数据块排序并聚合
- 追加写入硬盘
- optimize: 归并排序+聚合
分布式一致性:
- paxos算法
- zookeeper中的zab协议
- raft算法(k8s的etcd,kafka 2.8之后的版本)
《数据密集型应用系统设计》(ddia)
kibanar
| #!/bin/bash |
| es_home=/opt/module/es7 |
| kibana_home=/opt/module/kibana7 |
| if [ $# -lt 1 ] |
| then |
| echo "USAGE:es.sh {start|stop}" |
| exit |
| fi |
| case $1 in |
| "start") |
| |
| for i in hadoop102 hadoop103 hadoop104 |
| do |
| ssh $i "source /etc/profile;nohup ${es_home}/bin/elasticsearch >/dev/null 2>&1 &" |
| done |
| |
| ssh hadoop102 "nohup ${kibana_home}/bin/kibana > ${kibana_home}/logs/kibana.log 2>&1 &" |
| ;; |
| "stop") |
| |
| ssh hadoop102 "sudo netstat -nltp | grep 5601 |grep -v tcp|awk '{print $7}' | awk -F / '{print \$1}'| xargs kill" |
| |
| for i in hadoop102 hadoop103 hadoop104 |
| do |
| ssh $i "ps -ef|grep $es_home |grep -v grep|awk '{print \$2}'|xargs kill" >/dev/null 2>&1 |
| done |
| |
| ;; |
| *) |
| echo "USAGE:es.sh {start|stop}" |
| exit |
| ;; |
| esac |
| |
| |
| |
pom
常用依赖
| <dependencies> |
| <dependency> |
| <groupId>org.apache.hadoop</groupId> |
| <artifactId>hadoop-client</artifactId> |
| <version>3.1.3</version> |
| </dependency> |
| |
| |
| <dependency> |
| <groupId>junit</groupId> |
| <artifactId>junit</artifactId> |
| <version>4.12</version> |
| </dependency> |
| <dependency> |
| <groupId>org.hamcrest</groupId> |
| <artifactId>hamcrest-core</artifactId> |
| <version>1.3</version> |
| </dependency> |
| |
| |
| <dependency> |
| <groupId>org.slf4j</groupId> |
| <artifactId>slf4j-nop</artifactId> |
| <version>1.7.2</version> |
| </dependency> |
| |
| |
| </dependencies> |
hadoop
去掉log4j报错
新建log4j
| log4j.rootCategory=ERROR,console |
| log4j.appender.console=org.apache.log4j.ConsoleAppender |
| log4j.appender.console.target=System.err |
| log4j.appender.console.layout=org.apache.log4j.PatternLayout |
| log4j.appender.console.layout.ConversionPattern=%d{yy/MM/ddHH:mm:ss}%p%c{1}:%m%n |
| |
| #Setthedefaultspark-shelllogleveltoERROR.Whenrunningthespark-shell,the |
| #loglevelforthisclassisusedtooverwritetherootlogger'sloglevel,sothat |
| #theusercanhavedifferentdefaultsfortheshellandregularSparkapps. |
| log4j.logger.org.apache.spark.repl.Main=ERROR |
| |
| #Settingstoquietthirdpartylogsthataretooverbose |
| log4j.logger.org.spark_project.jetty=ERROR |
| log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR |
| log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=ERROR |
| log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=ERROR |
| log4j.logger.org.apache.parquet=ERROR |
| log4j.logger.parquet=ERROR |
| |
| #SPARK-9183:SettingstoavoidannoyingmessageswhenlookingupnonexistentUDFsinSparkSQLwithHivesupport |
| log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL |
| log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR |
kafka
| <dependency> |
| <groupId>org.apache.kafka</groupId> |
| <artifactId>kafka-clients</artifactId> |
| <version>3.0.0</version> |
| </dependency> |
打包带有依赖
| <build> |
| <plugins> |
| <plugin> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-compiler-plugin</artifactId> |
| <configuration> |
| <source>1.8</source> |
| <target>1.8</target> |
| </configuration> |
| </plugin> |
| <plugin> |
| <artifactId>maven-assembly-plugin</artifactId> |
| <configuration> |
| <descriptorRefs> |
| <descriptorRef>jar-with-dependencies</descriptorRef> |
| </descriptorRefs> |
| </configuration> |
| <executions> |
| <execution> |
| <id>make-assembly</id> |
| <phase>package</phase> |
| <goals> |
| <goal>single</goal> |
| </goals> |
| </execution> |
| </executions> |
| </plugin> |
| </plugins> |
| </build> |
| |
Scala
| |
| <properties> |
| <maven.compiler.source>8</maven.compiler.source> |
| <maven.compiler.target>8</maven.compiler.target> |
| </properties> |
| <dependencies> |
| <dependency> |
| <groupId>org.apache.spark</groupId> |
| <artifactId>spark-core_2.12</artifactId> |
| <version>3.0.0</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.spark</groupId> |
| <artifactId>spark-sql_2.12</artifactId> |
| <version>3.0.0</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.spark</groupId> |
| <artifactId>spark-streaming_2.12</artifactId> |
| <version>3.0.0</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.spark</groupId> |
| <artifactId>spark-yarn_2.12</artifactId> |
| <version>3.0.0</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.spark</groupId> |
| <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> |
| <version>3.0.0</version> |
| </dependency> |
| <dependency> |
| <groupId>com.alibaba</groupId> |
| <artifactId>druid</artifactId> |
| <version>1.1.10</version> |
| </dependency> |
| <dependency> |
| <groupId>com.fasterxml.jackson.core</groupId> |
| <artifactId>jackson-core</artifactId> |
| <version>2.10.1</version> |
| </dependency> |
| <dependency> |
| <groupId>com.esotericsoftware</groupId> |
| <artifactId>kryo</artifactId> |
| <version>5.0.3</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.spark</groupId> |
| <artifactId>spark-hive_2.12</artifactId> |
| <version>3.0.0</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.hive</groupId> |
| <artifactId>hive-exec</artifactId> |
| <version>1.2.1</version> |
| </dependency> |
| <dependency> |
| <groupId>mysql</groupId> |
| <artifactId>mysql-connector-java</artifactId> |
| <version>5.1.27</version> |
| </dependency> |
| </dependencies> |
| |
Flink
| |
| <properties> |
| <flink.version>1.13.0</flink.version> |
| <java.version>1.8</java.version> |
| <scala.binary.version>2.12</scala.binary.version> |
| </properties> |
| |
| <dependencies> |
| <dependency> |
| <groupId>org.slf4j</groupId> |
| <artifactId>slf4j-nop</artifactId> |
| <version>1.7.2</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.flink</groupId> |
| <artifactId>flink-java</artifactId> |
| <version>${flink.version}</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.flink</groupId> |
| <artifactId>flink-streaming-java_${scala.binary.version}</artifactId> |
| <version>${flink.version}</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.flink</groupId> |
| <artifactId>flink-clients_${scala.binary.version}</artifactId> |
| <version>${flink.version}</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.flink</groupId> |
| <artifactId>flink-cep_${scala.binary.version}</artifactId> |
| <version>${flink.version}</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.flink</groupId> |
| <artifactId>flink-table-api-java-bridge_${scala.binary.version}</artifactId> |
| <version>${flink.version}</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.flink</groupId> |
| <artifactId>flink-table-planner-blink_${scala.binary.version}</artifactId> |
| <version>${flink.version}</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.flink</groupId> |
| <artifactId>flink-streaming-scala_${scala.binary.version}</artifactId> |
| <version>${flink.version}</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.flink</groupId> |
| <artifactId>flink-table-common</artifactId> |
| <version>${flink.version}</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.flink</groupId> |
| <artifactId>flink-connector-kafka_${scala.binary.version}</artifactId> |
| <version>${flink.version}</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.flink</groupId> |
| <artifactId>flink-csv</artifactId> |
| <version>${flink.version}</version> |
| </dependency> |
| <dependency> |
| <groupId>mysql</groupId> |
| <artifactId>mysql-connector-java</artifactId> |
| <version>5.1.47</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-assembly-plugin</artifactId> |
| <version>3.3.0</version> |
| </dependency> |
| </dependencies> |
| |
| <build> |
| <plugins> |
| <plugin> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-assembly-plugin</artifactId> |
| <version>3.3.0</version> |
| <configuration> |
| <descriptorRefs> |
| <descriptorRef>jar-with-dependencies</descriptorRef> |
| </descriptorRefs> |
| </configuration> |
| <executions> |
| <execution> |
| <id>make-assembly</id> |
| <phase>package</phase> |
| <goals> |
| <goal>single</goal> |
| </goals> |
| </execution> |
| </executions> |
| </plugin> |
| <plugin> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-compiler-plugin</artifactId> |
| <version>3.8.1</version> |
| <configuration> |
| <source>8</source> |
| <target>8</target> |
| </configuration> |
| </plugin> |
| </plugins> |
| </build> |
| |
git
Git
一、简介
1> Git是什么?
| 1. 是一个分布式版本控制系统 |
| 2. 以"行"为单位进行存储,可以监控每行的变化 |
| 3. 几乎所有的软件的代码管理现在都在使用git. |
2> Git能做什么
| a、"版本还原" |
| b、"代码备份" |
| c、"分支管理":秒级创建一个分支,分支进行代码编辑时,互不影响 |
| d、"冲突解决":当不同分支对同一行代码进行变更时,前后提交,就会出现代码冲突,Git能快速高效解决冲突问题 |
| e、"历史追查":可以看到代码修改的记录; |
| f、"版本记录":可以回到任何一个版本 |
| g、"权限管理":针对不同的人开始不同的权限。 |
| |
| |
| 1. 在 Git 中任何已提交的东西几乎总是可以恢复的 |
| 2. 任何你未提交的东西丢失后很可能再也找不到了 |
| |
| |
3> Git配置的3个级别
| 1 系统默认,位于git安装路径下; |
| 2 用户配置:在c盘下;名字叫 .gitconfig |
| 3 项目配置:在当前项目仓库的配置文件中。 |

4> Git的3个区转换
| 1.工作区(Working Directory):就是你电脑本地硬盘目录 |
| 2.本地库(Repository):工作区有个隐藏目录.git,它就是Git的本地版本库 |
| 3.暂存区(stage):一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index) |
| |
| |
| a、工作区 -> 暂存区 :git add file |
| b、暂存区 -> 本地仓库: git commit -m "备注信息" |
| |
| b、提交到暂存区,想打回给工作区: git restore --staged file |
| c、本地仓库的文件来覆盖工作区的文件: git checkout file |

二、git的基本操作
1. 设置Git账户
| 命令 含义 |
| git config --list 查看所有配置 |
| git config --list --show-origin 查看所有配置以及所在文件位置 |
| git config --global user.name xxx 设置git用户名 |
| git config --global user.email xxx 设置git邮箱 |
| git init 初始化本地库 |
| git config core.autocrlf false 取消换行符转换的warning提醒 |
2. 常用命令
| 命令 作用 |
| git status 查看本地库的状态(git status -s 简化输出结果) |
| git add [file] 多功能命令: 1. 开始跟踪新文件 |
| 2. 把已跟踪的文件添加到暂存区 |
| 3. 合并时把有冲突的文件标记为已解决状态 |
| git commit –m “xxx” [file] 将暂存区的文件提交到本地库,-m 后面为修改的说明 |
4. 忽略文件
- 一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。
- 通常都是些自动生成的文 件,比如日志文件,或者编译过程中创建的临时文件等。
- 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。
| --1. 使用场景 |
| a、当有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表种时。 |
| --2. 实现方式: |
| a、创建".gitignore" 的文件,列出要忽略的文件的模式 --文件的名字不能错 |
| b、模式匹配规则 |
| |
| *.a |
| |
| |
| !lib.a |
| |
| |
| /TODO |
| |
| |
| build/ |
| |
| |
| doc/*.txt |
| |
| |
| doc/**/*.pdf |
5. 版本的切换
- git reset --hard HEAD^
- git reset --hard HEAD~n
- git reset --hard [具体版本号,例如:1f9a527等]
| 相关命令: |
| |
| 命令 作用 |
| git log 以完整格式查看本地库状态(查看提交历史) |
| git log --pretty=oneline 以单行模式查看本地库状态 |
| git reset --hard HEAD^ 回退一个版本 |
| git reset --hard HEAD~n 回退N个版本 |
| git reflog 查看所有操作的历史记录 |
| git reset --hard [具体版本号] 回到(回退和前进都行)指定版本号的版本, |
| git checkout -- [file] 从本地库检出最新文件覆盖工作区的文件(文件还没有提交到暂存区, 否则无效) |
| git reset [file] 或者 git restore –staged [file] 从暂存区撤销文件 |
| git restore <file> 放弃在工作区的修改(还没有提交到暂存区) |
| git rm --cache [file] 撤销对文件的跟踪. |
6. 删除操作
- 文件夹内删除
- git add .
- git commit -m "delete"
7. 比较文件
减号和加号分别代表两个对比的文件!
- $ git diff
- $ git diff HEAD
- git diff --cached
8. git目录

9. 分支操作
| 命令 描述 |
| git branch [分支名] 创建分支 |
| git branch -v 查看分支,可以使用-v参数查看详细信息 |
| git checkout [分支名] 切换分支 |
| git merge [分支名] 合并分支; |
| 将merge命令中指定的分支合并到当前分支上 |
| 例如:如果想将dev分支合并到master分支,那么必须在master分支上执行merge命令 |
| 如果在dev分支上面,对一个文件做了修改,这个时候master分支上面对应的文件是没有修改信息的。 |
| 因此需要将分支合并! |
| |
| git branch –d[分支名] 删除分支 |
| 注意:必须切换到master,才能删除,不能自杀! |
| |
| git checkout –b [分支名] 新建并切换到当前分支 |
| git log --oneline --decorate --graph --all 它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况 |
概念:
- 不使用分支,就是人与人之间协作;
- 使用分支,就是小组与小组之间的协作;
- 从主干中拉取分支,开发完成,将工作,合并到主干。
10. 分支冲突
问题: 当同时编辑一个文件时, 主分支和其他分支同时修改了同一行, 则合并时会引起冲突.
解决: 编辑冲突的文件,把“>>>>>>>>>”、“<<<<<<”和“========”等这样的行删除,编辑至满意的状态,提交。
提交的时候注意:git commit命令不能带文件名。
三、github

1. 本地连接Github
| 1. 创建一个密钥对 |
| ssh-keygen |
| 2. 复制公钥 |
| catch ~/.ssh/id_rsa.pub |
| 3. 粘贴到github中的ssh keys中 |
| 4. 测试 |
| ssh -T git@github.com |
流程:
| 从本地和github通讯, 有两种方式: |
| |
| 1. 使用https |
| 2. 使用ssh |
| |
| 推送: |
| |
| 1. 先建一个远程仓库 |
| 2. 给远程仓库起个别名 |
| 3. 推送 |
| |
| 新员工入职: |
| |
| 1. 拿到所有代码 |
| |
| 协作冲突: |
| |
| 当两个人修改了共一个行会发生冲突. |
| |
| 谁先push, 谁成功! |
| |
| 解决: |
| |
| 1. 后push要拉倒最新的版本() |
| 2. 然后解决冲突 |
2. push
| 本地库推送到GitHub |
| ①准备本地库 |
| ②在GitHub上创建一个仓库 |
| ③增加远程地址 |
| git remote add <远端代号> <远端地址> |
| <远端代号> 是指远程链接的代号,一般直接用origin作代号,也可以自定义; |
| <远端地址> 默认远程链接的url; |
| |
| ④本地库推送到远程库 |
| git push -u <远端代号> <本地分支名称> |
| <远端代号> 是指远程链接的代号; |
| <分支名称> 是指要提交的分支名字,比如master; |
| |
| 我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 |
| |
| ⑤查看远程分支 |
| git remote –v |
3. pull
| 本地库抓取远程库 |
| 如果远程库的版本新于当前库,那么此时为了使当前库和远程库保持一致,可以执行pull命令 |
| git pull <远端代号> <远端分支名>; |
| |
| 例 git pull origin master |
4. clone
| 实际的情况可能是刚开始做项目的时候,需要从远程库将项目先整到本机。 |
| 执行命令:git clone <远端地址> <新项目目录名> |
| <远端地址> 是指远程链接的地址; |
| <项目目录名> 是指为克隆的项目在本地新建的目录名称,可以不填,默认是GitHub的项目名; |
| 命令执行完后,会自动为这个远端地址建一个名为origin的代号。 |
| |
| 例 git clone https://github.com/user111/Helloworld.git hello_world |
5. 解决冲突
尽量避免冲突:
- 尽量不要修改同一文件
- 如果多个人修改同一文件, 最好的办法, 找一个专人负责修改公共文件.
- 每次写代码之前, 先更新到最新 版本.
上班第一件事, 先pull
上传值代码之前
, 也要先pull. 先把产生的冲突先解决, 再上传.
6. 邀请成员

7. 总结

四、github与idea
1. 上传到github
-
在idea中找到setting , 搜索git, 找到路径, 并关联github账号
-
vcs ---> import into version control ---> share project on github
-
勾掉.idea
-
vcs ---> git ---> add ---> push
2. clone 到idea
- checkout from vresion control
- 输入clone地址
- 点更新/pull
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】