个人博客:
一, 背景
小哈公司最近准备开发一套新的平台, 具体什么平台, 因为涉密, 这里就不透露了. 平台在最终的的技术选型中, 其中主要依赖的技术栈是 Apache Flink, 一款 Apache 基金会开源的流处理框架, 平台的核心业务都会交给 Flink 去处理, 其中包括离线批量任务计算, 以及实时任务计算.
PS: 后面小哈也会分享一些 Flink 相关的文章, 正在考虑要不要立个 Flag, 出一套 Flink 的入门教程系列文章, 主要怕自己太懒了, 泼出去的水, 收不回来, 那就尴尬了~
然后呢? 和这篇文章的主题啥关系?
哎, 别急, 听我娓娓道来! 主要是我们部门也是第一次接触 Flink, 虽然久闻大名, 知道其计算性能极为出众, 但是耳听为虚, 一番性能测试是是避免不的.
于是, 小哈以离线场景为例, 模拟实际业务数据, 输入源为 CSV 编码文件针对不同量级的数据, 100w, 1000w, 一亿的数据量做测试, 分别看看不同维度的性能指标, 如执行耗时, CPU, 内存, 吞吐量等.
PS: 因为小哈毕竟不是专业的测试人员, 这里只是做了一些简单的测试, 对 Flink 的性能有个大致的认知即可. 小伙伴们如果有需要, 可以使用专门的大数据测试工具, 如 HiBench.
这里贴一篇美团技术团队出品的文章《流计算框架 Flink 与 Storm 的性能对比》, 有兴趣的小伙伴可以看下:
好了, 铺垫了这么多, 其实是想水文一篇, 没啥技术含量, 就是给大家推荐第三方工具库 JavaCSV , 用来造一些 CSV 测试数据文件, 个人觉得它非常地优雅方便 (比较偷懒~ 代码量少~).
JavaCSV 官网地址: https://sourceforge.net/projects/javacsv/
JavaCSV API 说明文档: http://javacsv.sourceforge.net/
二, 开始
2.1 添加 Maven 依赖
- <dependency>
- <groupId.NET.sourceforge.javacsv</groupId>
- <artifactId>javacsv</artifactId>
- <version>2.0</version>
- </dependency>
2.2 写文件
要如何通过 javacsv 生成 CSV 文件呢? 参考下面的示例代码:
- /**
- * @author 犬小哈 (公众号: 小哈学 Java)
- * @date 2019/4/12
- * @time 下午 3:05
- * @discription 读写 CSV 文件
- **/
- public class ReadAndWriterCsvFlie {
- // 需要写入的 CSV 文件路径
- public static final String WRITE_CSV_FILE_PATH = "/Users/a123123/Work/flink-study/write_test.csv";
- /**
- * 生成 CSV 文件
- */
- public static void writeCsvFile(String writeCsvFilePath) {
- // 创建 CSV Writer 对象, 参数说明 (写入的文件路径, 分隔符, 编码格式)
- CsvWriter csvWriter = new CsvWriter(writeCsvFilePath,',', Charset.forName("GBK"));
- try {
- // 定义 header 头
- String[] headers = {"订单号", "用户名", "支付金额"};
- // 写入 header 头
- csvWriter.writeRecord(headers);
- // 写入一千条记录
- for (int i = 0; i <1000; i++) {
- String orderNum = UUID.randomUUID().toString();
- String userName = "用户" + i;
- String payMoney = String.valueOf(i);
- // 写入行
- csvWriter.writeRecord((String[]) Arrays.asList(orderNum, userName, payMoney).toArray());
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- csvWriter.close();
- }
- }
- public static void main(String[] args) {
- writeCsvFile(WRITE_CSV_FILE_PATH);
- }
- }
通过上面的示例代码, 我们就可以很轻松地造一批测试数据, 只需要改下需要生成的行数即可. 相比较其他的库, 代码量还是非常少的.
运行代码, 看下最终的效果图:
2.1 读文件
说完了如何通过 javacsv 来写 CSV 文件, 再来说说如何读取 CSV 文件, 就以上面生成的 CSV 文件作为读取源, 示例代码如下:
/** * @author 犬小哈 (公众号: 小哈学 Java) * @date 2019/4/12 * @time 下午 3:05 * @discription 读写 CSV 文件 **/ public class ReadAndWriterCsvFlie { // 需要写入的 CSV 文件路径 public static final String WRITE_CSV_FILE_PATH = "/Users/a123123/Work/flink-study/write_test.csv"; /** * 读取 CSV 文件 */ public static void readCsvFile(String readCsvFilePath) { // 缓存读取的数据 List<String[]> content = new ArrayList<>(); try { // 创建 CSV Reader 对象, 参数说明 (读取的文件路径, 分隔符, 编码格式) CsvReader csvReader = new CsvReader(readCsvFilePath, ',', Charset.forName("GBK")); // 跳过表头 csvReader.readHeaders(); // 读取除表头外的内容 while (csvReader.readRecord()) { // 读取一整行 String line = csvReader.getRawRecord(); System.out.println(line); content.add(csvReader.getValues()); } csvReader.close(); for (int row = 0; row <content.size(); row++) { // 读取第 row 行, 第 0 列的数据 String orderNum = content.get(row)[0]; System.out.println("==> orderNum:" + orderNum); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { readCsvFile(WRITE_CSV_FILE_PATH); } }
运行代码, 看下控制台打印效果:
打完收工~
总结
本文小哈主要带着大家了解了一下, 如何通过第三方库 JavaCSV 来对 CSV 文件进行读写操作, 实际场景中可能应用并不广泛, 更多还是使用统一的文件库, 如阿里的 EasyExcel,EasyPOI 等, 小哈这里使用, 也仅仅是为了造测试数据而已.
PS: 关于 EasyExcel 使用教程, 小伙伴可以看下小哈之前写的一篇文章: 《7 行代码优雅地实现 Excel 文件生成 & 下载功能》
好了, 水文结束, 小伙伴们觉得有帮助记得点个再看哈~ 感谢感谢~ 下期见~
Ref https://sourceforge.net/projects/javacsv/ http://javacsv.sourceforge.net/ https://segmentfault.com/a/1190000020351726
来源: http://www.tuicool.com/articles/qMZFVvQ