## java线程池、线程并发实例 ##

背景
利用Java程序实现hive到elasticsearch的数据迁移,采取多线程 提高数据迁移速率
知识点
hive创建连接及API使用es创建客户端及连接使用、线程分批设置
代码示例

/**
 * 创建多线程任务,提高运行速率
 * @throws Exception
 */
public static void run(int totalDataRowCount) throws Exception {

     String indexname = "cpd_t_cust_label4";
     String typename = "hbase_es_test4";
     int dataCount = totalDataRowCount;
     int threadNum = 64;
     int pageNum = dataCount/threadNum;
     // 1.1创建线程池
     ExecutorService service = Executors.newFixedThreadPool( threadNum );

     for (int i = 1; i <= threadNum; i++){
         List<Map<String, Object>> maps = CF_Tool.lable_RowList_hive( "select * from cpd_t_cust_label_intermediate_test limit  " + pageNum * (i - 1) + "," + pageNum );
         // 任务数顺序
         int num = i;
         // 1.2创建线程
         Runnable r = () -> {
             long startTime = System.currentTimeMillis();
            // System.out.println("------------ "+"线程"+ num +"的开始时间"+sdf.format(startTime)+"------------");
             logger.info( "------------ "+"线程"+ num +"的开始时间"+sdf.format(startTime)+"------------" );
             for (Map<String,Object> map:maps) {
                 String row_key = String.valueOf( map.get( "row_key" ) );
                 try {
                     //添加数据前做是否存在判断,如果存在就删除再添加,不存在则添加
                     boolean documentIdExist = esu.isExist(restHighLevelClient,indexname ,typename, row_key);
                     if (documentIdExist){
                         //删除操作
                         esu.deleteDocument(restHighLevelClient,indexname ,typename,row_key);
                     }
                     // 添加
                     esu.add(restHighLevelClient,indexname ,typename, (String) row_key,(Map<String, Object>)map);
                     // 批量添加
                     //esu.bulkadd(restHighLevelClient,indexname ,typename, (String) row_key,(Map<String, Object>)map);
                 } catch (IOException e) {
                     e.printStackTrace();
                     logger.error( "HiveCoonectEs erro" );
                 }
             }
             long usetime = (System.currentTimeMillis() - startTime) / 1000;
             logger.info( "--------------- "+"线程"+ num +"运行所用时间  "+usetime+"秒 -----------------");
            // System.out.println("--------------- "+"线程"+ num +"运行所用时间  "+usetime+"秒 -----------------");
         };
         // 1.3执行线程任务
         service.execute(r);
     }
}

参考文档: https://www.twle.cn/c/yufei/java8/java8-basic-lambda-callable-argument.html

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读