背景 :
利用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