2020年8月7日
下載的docker鏡像默認存儲路徑是/var/lib/docker .具體的鏡像文件就在containers文件夾中
docker save -o d:/docker/zen.tar easysoft/zentao:15.5
docker run -d -p 80:80 \
-e ADMINER_USER="admin" -e ADMINER_PASSWD="qqzj126" -e MYSQL_ROOT_PASSWORD=qqzj126 \
-e BIND_ADDRESS="false" \
-v /opt/data/zbox/:/opt/zbox/ \
-v /opt/mysqldata:/var/lib/mysql \
--name zentao-server \
easysoft/zentao:15.5
docker logs -f
運行命令(注意路徑)
java -jar /web/share-book.jar > /web/log.txt &
該命令的意思是:執行share-book.jar這個文件,并且輸出到log.txt文件,&表示后臺運行
解決更新項目帶來的頻繁重啟操作,創建2個腳本
start.sh
#! /bin/bash
#注意:必須有&讓其后臺執行,否則沒有pid生成 jar包路徑為絕對路徑
java -jar /web/share-book.jar > /web/log.txt &
# 將jar包啟動對應的pid寫入文件中,為停止時提供pid
echo $! > /web/pid.txt
stop.sh
#! /bin/bash
PID=$(cat /web/pid.txt)
kill -9 $PID
啟動項目:./start.sh
停止項目:./stop.sh
一.問題描述:windows本地調試Hadoop程序時報錯錯誤信息:
其原因是需要在windows本地搭建Hadoop環境,下載winutils文件,并將hadoop-2.8.4包內的bin文件替換,將下載文件中hadoop.dll放到C:\Windows\System32下
二.解決過程如下:
1.下載hadoop,去官網下載對應的hadoop版本,我在linux集群搭建的是hadoop-2.8.4,因此將hadoop-2.8.4下載到windows本地
https://www.jianshu.com/p/a65a95108620
如果不配置.gitignore的文件,帶push代碼的時候就會把一寫不必要的文件push到遠程倉庫,如.idea文件。如果不小心出現此文件在遠程倉庫可以通過一下步驟delete此文件:
1.配置.gitignore文件(新建/編輯)
echo '.idea' >> .gitignore
2.將.gitignore文件上傳到遠程倉庫
git pull git add .gitignore git commit -m 'edit .gitignore' git push origin master
3.刪除git的.idea文件
git rm --cached -r .idea
4.同步到遠程倉庫
git commit -m 'delete .idea' git push origin master
完成之后就可以發現git倉庫中的.idea文件已經被刪除,而且之后push代碼也不會再把.idea文件上傳。
PS:我在使用PyCharm編寫python代碼,一般是通過new -> .ignore file -> .gitignore file
自動生成.gitignore文件。
下面是我自己比較常用的.gitignore文件簡短配置:
.project .settings/ .prefs .pydevproject .idea/ .idea .DS_Store .cache *.pyc *.html *.xlm
1、java heap space 一次申請太大的內存空間
2、GC overhead limit exceeded 創建太多的對象,gc收集不完
1、 vim /etc/rc.d/rc.local
2、添加內容
export JAVA_HOME=/usr/java/jdk1.8.0_111
/app/tomcat/bin/startup.sh start
3、
chmod 777 /etc/rc.d/rc.local
/**
* synchronized 放在普通方法上,內置鎖就是當前類的實例
* @return
*/
public synchronized int getNext() {
return value ++;
}
/**
* 修飾靜態方法,內置鎖是當前的Class字節碼對象
* Sequence.class
* @return
*/
public static synchronized int getPrevious() {
// return value --;
return 0;
}
1、數據庫配置
首先使用canal需要修改數據庫配置
[mysqld]
log-bin=mysql-bin # 開啟
binlog binlog-format=ROW # 選擇 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定義,不要和 canal 的 slaveId 重復
創建canal數據庫用戶
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
2、安裝canal
下載:https://github.com/alibaba/canal/releases
解壓(修改版本號):tar zxvf canal.deployer-1.1.4.tar.gz -C ./canal
配置開放服務器端口:11110、11111、11112
修改canal配置文件(這里設置了兩個instance,即兩個數據庫):
vi canal/conf/canal.properties
canal.destinations = example1,example2
配置instance:
cp -R canal/conf/example conf/example1
mv conf/example conf/example2
第一個數據庫配置
vi canal/conf/example1/instance.properties
canal.instance.master.address=32.1.2.140:3306
第二個數據庫配置
vi canal/conf/example2/instance.properties
canal.instance.master.address=32.1.2.140:3307
#如果需要新增一個instance,只需要修改canal.properties文件,并新增一個instance配置即可,無需重啟canal。
運行:
sh canal/bin/startup.sh # 查看日志
cat canal/logs/canal/canal
3、Java使用樣例
引入pom依賴,需要與安裝的canal版本一致
<dependencies> <dependency> <groupId>com.alibaba.otter</groupId> <artifactId>canal.client</artifactId> <version>1.1.4</version> </dependency> </dependencies>
示例代碼(異步打印兩個數據庫的修改內容):

package cn.spicybar.dblog; import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import com.alibaba.otter.canal.protocol.CanalEntry.Entry; import com.alibaba.otter.canal.protocol.CanalEntry.EntryType; import com.alibaba.otter.canal.protocol.CanalEntry.RowChange; import com.alibaba.otter.canal.protocol.Message; import java.net.InetSocketAddress; import java.util.List; public class CanalClient { public static void main(String[] args) { new Thread(() -> initConnector("example1")).start(); new Thread(() -> initConnector("example2")).start(); } private static void initConnector(String destination) { CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("32.1.0.237", 11111), destination, "", ""); try { connector.connect(); connector.subscribe(".*\\..*"); connector.rollback(); while (true) { Message message = connector.getWithoutAck(1000); if (message.getId() != -1 && message.getEntries().size() > 0) { printEntry(message.getEntries()); } connector.ack(message.getId()); } } finally { connector.disconnect(); } } private static void printEntry(List<Entry> entries) { for (Entry entry : entries) { if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN || entry.getEntryType() == EntryType.TRANSACTIONEND) { continue; } try { RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); System.out.println(rowChange.getSql()); } catch (Exception e) { throw new RuntimeException("ERROR ## parser error, data:" + entry.toString(), e); } } }
public int binarySearch(long value) {
int middle = 0;
int low = 0;
int pow = arr.length;
while(true) {
middle = (pow + low) / 2;
if(arr[middle] == value) {
return middle;
} else if(low > pow) {
return -1;
} else {
if(arr[middle] > value) {
pow = middle - 1;
} else {
low = middle + 1;
}
}
}
}