1、首先建Azure虚拟机,几个关键点
- public ip是外面访问用到的,所有都是他,或者找对应域名也ok
- 我这里选的是用ssh登录,建立过程中有私钥,记得保存好
- 用putty来连虚拟机的时候,要用puttygen来把私钥转换要,在连接的地方输好ip以后,在下面载入私钥(截图待补充)
- azure自带防火墙,在networking里面白名单ip或者端口,这里面influxdb要白名单8086端口
2、安装influxdb
- 我建的ubuntu虚拟机,命令行直接安装就行
- 安装好以后使用influx即可进入对应终端
- influxdb有表和数据库两个概念,不同数据库可以有相同名字的表
3、一些influxdb基本操作
- create database name就是新建以name为名的数据库
- 每次新打开要选好使用哪个database,比如use name,这个是使用名叫name的表
- show databases 显示目前的各种database
- drop database name 删除名叫name的数据库
- precision rfc3339可以将时间戳转化成正常的年月日 时分秒显示,但是只是显示变了,本身数据没变,在其他里面调用数据还是原始格式
- 如果使用查询语句,查的判断条件是tag,那么 select * from infra where "type"='mysql',如果查值就是 select * from infra where value=80 等号写一个。
- insert数据的时候要首先选择数据库名,这里面以数据库名是test,表名infra为例
- 注意influxdb的表不是显示独立建立的,要靠在插入的时候提到了,如果没有就独立建立
- 如果插入的两条数据,他的表名,tag,时间戳完全相同,那么新的field值会修改原有的(注意时间戳叫time,如果有timestamp那是你自己命名的,和时间戳无关)
- 人为规定时间戳,只可以使用时间戳方式,不能用年月日的! 参考链接:https://help.aliyun.com/knowledge_detail/114739.html
3、chronograf
- chronograf代替的是传统的influxdb自带的web管理界面
- 要看chronograf是在开启chronograf.exe以后,访问http://localhost:8888
- 注意,chronograf不是要求在虚拟机打开的哦,你在任何一台机器上都能打开,访问的是本地的8888
- 在开启以后,需要输入你要链接的url,这时候是azure虚拟机对应ip的8086端口
- 在chronograf中插入一条数据: infra,type=mysql,otherstring=aaa value=100 1599384988000000000
- 插入的时候对应的值不带引号的!包括tag的也不带!和查询分开!注意!另外时间戳要19位的,自动转化工具需要补0
- 上面那条,第一个是表明,后面逗号隔开的都是tag value,也就是值,是field(当然不一定叫value) 最后是时间戳
- 官网下载地址:https://portal.influxdata.com/downloads/
4、其他操作
- 给的数据是excel格式的,显然不可能手动用于insert,那么就有两种选择
- 使用vscode调整格式
- 使用java POI相关的包来完成
- 如果选择vscode,那么直接把excel表复制过来,然后进入vscode列编辑模式,快捷键应该是shift+alt+鼠标左键,把整行都选上,然后整行改,最后一个时间戳不是对齐的,使用替换功能把tab换成空格之类的,完成转化
- 或者使用java poi对应的包
- 这个cell类型在高版本的包中发生了变化,代码是修改过的,网上原始的代码新版本jar包不能用
- 如果数字位数很多,尽管在excel中设置了文本类型,但是出来的还是科学技术法,不能单纯用string.valueOf,要用DecimalFormat,具体见代码
- 要下载导入对应jar包
- 参考链接如下
- 如何避免数字变成科学计数法:https://blog.csdn.net/xingxiupaioxue/article/details/54411824
- 关于高版本中jar包变动:https://www.cnblogs.com/sengzhao666/p/11144902.html
- 原始转换参考代码 :https://blog.csdn.net/usuallyuser/article/details/81217122
import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @SuppressWarnings("resource") public class ExcelToTxt { public static void main(String[] args) throws IOException { Workbook wb = null; Sheet sheet = null; Row row = null; List<Map<String, String>> list = null; String cellData = null; String excelPath = "D:/data/sensors-ounce.xlsx"; String textPath = "D:/data/sensors-ounce.txt"; String columns[] = { "type", "timestamp", "value", "time"}; wb = readExcel(excelPath); if (wb != null) { // 用来存放表中数据 list = new ArrayList<Map<String, String>>(); // 获取第一个sheet sheet = wb.getSheetAt(0); // 获取最大行数 int rownum = sheet.getPhysicalNumberOfRows(); // 获取第二行 row = sheet.getRow(1); // 获取最大列数 int colnum = row.getPhysicalNumberOfCells(); for (int i = 0; i < rownum; i++) { Map<String, String> map = new LinkedHashMap<String, String>(); row = sheet.getRow(i); if (row != null) { for (int j = 0; j < colnum; j++) { cellData = (String) getCellFormatValue(row.getCell(j)); map.put(columns[j], cellData); } } else { break; } list.add(map); } } // 遍历解析出来的list StringBuffer sb = new StringBuffer(); for (int i = 1; i < list.size(); i++) { sb.append("infra,"); int count=0; for (Entry<String, String> entry : list.get(i).entrySet()) { String value = entry.getValue(); //System.out.println(i); if(count==0) sb.append("type=" + value + ","); else if(count==1) sb.append("timestamp="+value+" "); else if(count==2) sb.append("value="+value+" "); else sb.append(value); count++; //sb.append(value + ","); } sb.append(" "); } WriteToFile(sb.toString(), textPath); System.out.println("*************EXCEL转成TXT格式成功*************"); } // 读取excel public static Workbook readExcel(String filePath) { Workbook wb = null; if (filePath == null) { return null; } String extString = filePath.substring(filePath.lastIndexOf(".")); InputStream is = null; try { is = new FileInputStream(filePath); if (".xls".equals(extString)) { return wb = new HSSFWorkbook(is); } else if (".xlsx".equals(extString)) { return wb = new XSSFWorkbook(is); } else { return wb = null; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return wb; } public static Object getCellFormatValue(Cell cell) { Object cellValue = null; if (cell != null) { // 判断cell类型 switch (cell.getCellType()) { case NUMERIC: { //cellValue = String.valueOf(cell.getNumericCellValue()); DecimalFormat df = new DecimalFormat("0"); cellValue = df.format(cell.getNumericCellValue()); break; } case FORMULA: { // 判断cell是否为日期格式 if (DateUtil.isCellDateFormatted(cell)) { // 转换为日期格式YYYY-mm-dd cellValue = cell.getDateCellValue(); } else { // 数字 cellValue = String.valueOf(cell.getNumericCellValue()); } break; } case STRING: { cellValue = cell.getRichStringCellValue().getString(); break; } default: cellValue = ""; } } else { cellValue = ""; } return cellValue; } /** * 生成文件 * @param str * @param filePath * @throws IOException */ public static void WriteToFile(String str, String filePath) throws IOException { BufferedWriter bw = null; try { FileOutputStream out = new FileOutputStream(filePath, true);// true,表示:文件追加内容,不重新生成,默认为false bw = new BufferedWriter(new OutputStreamWriter(out, "GBK")); bw.write(str += " ");// 换行 bw.flush(); } catch (Exception e) { e.printStackTrace(); } finally { bw.close(); } }