hadoop api提供了一些遍历文件的api,通过该api可以实现遍历文件目录:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path; public class BatchSubmitMain {
public static void main(String[] args) throws Exception {
String mrTableName = args[0];
String fglibTableName = args[1]; Configuration conf = new Configuration();
/*
* <property> <name>fs.defaultFS</name> <value>hdfs://hcluster</value>
* </property>
*/
conf.set("fs.defaultFS", "hdfs://hcluster");
FileSystem fileSystem = FileSystem.get(conf); String mrFilePath = "/myuser/hivedb/" + mrTableName;
String fglibFilePath = "/myuser/hivedb/" + fglibTableName; System.out.println(mrFilePath);
List<String> mrObjectIdItems = getObjectIdItems(fileSystem, mrFilePath); System.out.println(fglibFilePath);
List<String> fglibObjectIdItems = getObjectIdItems(fileSystem, fglibFilePath); List<String> objectIdItems = new ArrayList<>(); for (String mrObjectId : mrObjectIdItems) {
for (String fglibObjectId : fglibObjectIdItems) {
if (mrObjectId == fglibObjectId) {
objectIdItems.add(mrObjectId);
}
}
} String submitShPath = "/app/myaccount/service/submitsparkjob.sh"; CountDownLatch threadSignal = new CountDownLatch(objectIdItems.size()); for (int ii = 0; ii < objectIdItems.size(); ii++) {
String objectId = objectIdItems.get(ii);
Thread thread = new ImportThread(objectId, submitShPath, threadSignal);
thread.start();
} threadSignal.await(); System.out.println(Thread.currentThread().getName() + "complete");
} private static List<String> getObjectIdItems(FileSystem fileSystem, String filePath) throws FileNotFoundException, IOException {
List<String> objectItems = new ArrayList<>(); Path path = new Path(filePath);
// 获取文件列表
FileStatus[] files = fileSystem.listStatus(path);
// 展示文件信息
for (int i = 0; i < files.length; i++) {
try {
if (files[i].isDirectory()) {
String[] fileItems = files[i].getPath().getName().split("/");
String objectId = fileItems[fileItems.length - 1].replace("objectid=", "");
objectItems.add(objectId);
System.out.println(objectId);
}
} catch (Exception e) {
e.printStackTrace();
}
} return objectItems;
} /**
* @param hdfs
* FileSystem 对象
* @param path
* 文件路径
*/
public static void iteratorShowFiles(FileSystem hdfs, Path path) {
try {
if (hdfs == null || path == null) {
return;
} // 获取文件列表
FileStatus[] files = hdfs.listStatus(path); // 展示文件信息
for (int i = 0; i < files.length; i++) {
try {
if (files[i].isDirectory()) {
System.out.print(">>>" + files[i].getPath() + ", dir owner:" + files[i].getOwner());
// 递归调用
iteratorShowFiles(hdfs, files[i].getPath());
} else if (files[i].isFile()) {
System.out.print(" " + files[i].getPath() + ",length:" + files[i].getLen() + ", owner:" + files[i].getOwner());
}
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
} }

并行执行sh的线程:

import java.util.concurrent.CountDownLatch;

public class ImportThread extends Thread {
private final JavaShellInvoker javaShellInvoker = new JavaShellInvoker(); private CountDownLatch countDownLatch;
private String objectId;
private String submitShPath; public ImportThread(String objectId, String submitShPath, CountDownLatch countDownLatch) {
this.objectId = objectId;
this.submitShPath = submitShPath;
this.countDownLatch = countDownLatch;
} @Override
public void run() {
System.out.println(Thread.currentThread().getName() + "start... " + this.submitShPath + " " + this.objectId.toString());// 打印开始标记 try {
int result = this.javaShellInvoker.executeShell("mrraster", this.submitShPath, this.objectId);
if (result != 0) {
System.out.println(Thread.currentThread().getName() + " result type is error");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println(Thread.currentThread().getName() + "-error:" + e.getMessage());
} this.countDownLatch.countDown();// 计时器减1
System.out.println(Thread.currentThread().getName() + " complete,last " + this.countDownLatch.getCount() + " threads");// 打印结束标记
}
}

执行sh的java代码:

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date; public class JavaShellInvoker {
private static final String executeShellLogFile = "./executeShell_%s_%s.log"; public int executeShell(String shellCommandType, String shellCommand, String args) throws Exception {
int success = 0; args = (args == null) ? "" : args; String now = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
File logFile = new File(String.format(executeShellLogFile, shellCommandType, now)); ProcessBuilder pb = new ProcessBuilder("sh", shellCommand, args);
pb.redirectOutput(ProcessBuilder.Redirect.appendTo(logFile));
pb.redirectError(ProcessBuilder.Redirect.appendTo(logFile)); Process pid = null; try {
pid = pb.start();
success = pid.waitFor();
} catch (Exception ex) {
success = 2;
System.out.println("executeShell-error:" + ex.getMessage());
throw ex;
} finally {
if (pid.isAlive()) {
success = pid.exitValue();
pid.destroy();
}
} return success;
}
}

submitsparkjob.sh

#!/bin/sh
source ../login.sh
spark-submit --master yarn-cluster --class MySparkJobMainClass --driver-class-path /app/myaccount/service/jars/ojdbc7.jar --jars /app/myaccount/service/jars/ojdbc7.jar --num-executors
20 --driver-memory 6g --executor-cores 1 --executor-memory 8g MySparkJobJar.jar $1

执行BatchSubmit.jar的命令:

hadoop jar BatchSubmit.jar

Hadoop API:遍历文件分区目录,并根据目录下的数据进行并行提交spark任务的更多相关文章

  1. 遍历文件夹及其子文件夹下的.pdf文件,并解压文件夹下所有的压缩包

    List<PDFPATH> pdfpath = new List<PDFPATH>(); List<string> ziplist = new List<st ...

  2. BAT 遍历文件夹和子文件夹下所有文件

    echo off & color 0A ::指定起始文件夹 set DIR="%cd%" echo DIR=%DIR% :: 参数 /R 表示需要遍历子文件夹,去掉表示不遍 ...

  3. windowsAPI遍历文件夹(速度高于递归)

    #region API 遍历文件夹及其子文件夹和子文件 #region 声明WIN32API函数以及结构 ************************************** [DllImpo ...

  4. C++下遍历文件夹

    编写程序遍历文件夹及其子文件夹下所有文件,并输出到标准输出流或者文件流. 1. 先考虑在单层目录下,遍历所有文件.以C:\WINDOWS为例: 用到数据结构_finddata_t,文件信息结构体的指针 ...

  5. 使用Hadoop API 压缩HDFS文件

    下篇解压缩:使用Hadoop API 解压缩 HDFS文件 起因: 集群磁盘剩余空间不足. 删除了存储在HDFS上的,一定时间之前的中间结果,发现并不能释放太多空间,查看计算业务,发现,每天的日志存在 ...

  6. MFC拖拽、选择目录、遍历文件

    1.选择目录 void CDecryptFileDlg::OnBnClickedSel() { std::wstring selectedDir; WCHAR szDir[MAX_PATH]; Zer ...

  7. 使用Hadoop API 解压缩 HDFS文件

    接上篇:使用Hadoop API 压缩HDFS文件 压缩完了,当然需要解压缩了. 直接上代码: private static void getFile(String filePath) throws ...

  8. 基于 java 【Web安全】文件上传漏洞及目录遍历攻击

    前言:web安全之文件上传漏洞,顺带讲一下目录遍历攻击.本文基于 java 写了一个示例. 原理 在上网的过程中,我们经常会将一些如图片.压缩包之类的文件上传到远端服务器进行保存.文件上传攻击指的是恶 ...

  9. MFC_选择目录对话框_选择文件对话框_指定目录遍历文件

    选择目录对话框 void C资源共享吧视频广告清理工具Dlg::OnBnClickedCls() { // 清空编辑框内容 m_Edit.SetWindowTextW(L""); ...

随机推荐

  1. c++趣味之为变参模板的每个参数执行单独函数

    对于c++11以后出现的可变参数模板,一般我们都统一处理所有的参数.而当需要为每个参数执行不同的操作或调用不同的函数时,语法上是没有直接支持的. 可变参数的模板语法: template<type ...

  2. docker进阶-利用dcoker Swarm搭建简单集群

    什么是Swarm   在介绍Swarm之前我们要说一下什么Docker三剑客? Docker-Machine:负责在多种平台上快速安装 Docker 环境. Docker-Compose:Docker ...

  3. Day3--------------目录文件的浏览、管理及维护

    1.pwd命令功能 2.cd命令功能 cd..      返回上一级 cd~ cd- 返回上一次的目录 cd 3.ls命令功能 ls -a ls -all ls -l 4.cp命令功能 cp -i 覆 ...

  4. Redis查询,设置超时时间

    1.定义 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...

  5. 测试驱动开发实践2————从testList开始

    内容指引 1.测试之前 2.改造dto层代码 3.改造dao层代码 4.改造service.impl层的list方法 5.通过testList驱动domain领域类的修改 一.测试之前 在" ...

  6. 关于SELECT LAST_INSERT_ID()的使用规则

    尊重个人劳动成果,转载请注明出处: http://blog.csdn.net/czd3355/article/details/71302441 首先我先解释以下在在映射文件中的代码是什么意思. < ...

  7. Transaction 事务简单详解

    Transaction 也就是所谓的事务了,通俗理解就是一件事情.从小,父母就教育我们,做事情要有始有终,不能半途而废. 事务也是这样,不能做一半就不做了,要么做完,要么就不做.也就是说,事务必须是一 ...

  8. 听翁恺老师mooc笔记(16)--程序设计与C语言

    问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...

  9. beta冲刺总结附(分工)-咸鱼

    冲刺链接 分工细则: 分配比例:前端:后台数据库+代码:服务器配置:测试=3:3:2:2 工作量权重比:   前端 后台 服务器 测试 翁陈华 0.9 0.1 0 0 黄紫仪 0.1 0.8 0 0 ...

  10. 201621123043 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 泛型的定义: 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此 ...