## 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值