总体概况
项目名称: 《Hadoop云盘系统》
Ø 项目开发环境:Linux下Hadoop分布式系统
Ø 项目开发环境:Ubuntu11.04+Hadoop0.20.2+JDK1.6+Eclipse3.3.2。
Ø 使用技术:Hadoop + Java
Ø 作品展示地址:
Ø 作品描述:1、个人独立完成,课余兴趣作品。包含全部设计、分析、编码、优化。
2、功能实现,文件上传、下载、删除、维护、文件夹的新建、文件路径跟踪、以及个人文件搜索功能实现和文件分类展现等。
3、基于Hadoop开发的分布式云平台的文件管理系统。
一、 概况:
1、这是个人的业余爱好项目,自己进行了全部的设计、分析、编码、和优化。
2、 根据现场需求进行流程分析与编写。
3、 根据所需求的业务进行开发,代码编写,实现功能。
4、 对程序业务逻辑进行优化,使其达到更高的性能。
项目难点:1、搜索的实现利用了回溯法进行所有文件的搜索,利用字符是否包含来判断是否进入结果容器中
2、目录跟踪显示的实现
二、这是本人仿照《百度网盘》,利用Hadoop技术进行开发的《Hadoop云盘系统》
如下图所示,《百度网盘》和自己做的《Hadoop云盘系统》进行了对比。
再看个人的《云盘》
总结:界面设计简洁,整齐,操作方面,用户体验良好。
三、Hadoop集群主要配置和启动操作操作过程
1、查看集群的主节点配置。先在Linux中启动Hadoop,如下:查看现在JPS运行的进程,检查系统是否正常启动
2、查看 core-site.xml文件查看主节点的配置。
3、并在web中 查看 http://192.168.236.132:50030/ 和http://192.168.236.132:50070/ web界面集群启动情况,确定
无误后,可以利用Eclipse 启动程序运行程序了。
四、系统部分测试和主要代码解析
1、上传文件,是从本地文件系统中上传到HDFS中,上传到当前进入的目录当中
主要代码分析:
[java] view plain copy print ?
1. JFileChooser chooser = new
2. chooser.setVisible(true);
3. int returnVal = chooser.showOpenDialog(null);
4. if (returnVal == JFileChooser.APPROVE_OPTION) {// 为确定或OK是
5. String localPath = chooser.getSelectedFile()
6. .getPath();
7. String filename = chooser.getSelectedFile()
8. .getName();
9. InputStream in = null;
10. try
11. in = new
12. new FileInputStream(localPath));//本地文件输入流
13. } catch
14. e3.printStackTrace();
15. }
16. OutputStream out = null;
17. try
18. out = hdfs.create(new
19. + "/"
20. new
21. public void
22. System.out.print(".");
23. }
24. });//HDFS路径的输出流抽象
25. } catch
26. e2.printStackTrace();
27. }
28. try
29. IOUtils.copyBytes(in, out, 4096, true);//利用IOUtils工具类实现上传
30. } catch
31. e1.printStackTrace();
32. }
33. try
34. showTable(currentPath);//上传完毕就刷新当前路径的文件表格
35. } catch
36. e1.printStackTrace();
37. }
38. }
JFileChooser chooser = new JFileChooser();
chooser.setVisible(true);
int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {// 为确定或OK是
String localPath = chooser.getSelectedFile()
.getPath();
String filename = chooser.getSelectedFile()
.getName();
InputStream in = null;
try {
in = new BufferedInputStream(
new FileInputStream(localPath));//本地文件输入流
} catch (FileNotFoundException e3) {
e3.printStackTrace();
}
OutputStream out = null;
try {
out = hdfs.create(new Path(currentPath
+ "/" + filename),
new Progressable() {
public void progress() {
System.out.print(".");
}
});//HDFS路径的输出流抽象
} catch (IOException e2) {
e2.printStackTrace();
}
try {
IOUtils.copyBytes(in, out, 4096, true);//利用IOUtils工具类实现上传
} catch (IOException e1) {
e1.printStackTrace();
}
try {
showTable(currentPath);//上传完毕就刷新当前路径的文件表格
} catch (IOException e1) {
e1.printStackTrace();
}
}
2、文件下载分析:从在HDFS中下载到本地文件系统中,
主要代码分析:
[java] view plain copy print ?
1. if
2. int ensuce = JOptionPane.showConfirmDialog(new
3. "确定删除所选文件吗", "确认对话框", JOptionPane.YES_NO_OPTION);
4. if
5. return;
6. }
7. if
8. if (fileList.getSelectedRow() >= 0) {
9. String temp = currentPath
10. + "/"
11. + fileList.getValueAt(
12. fileList.getSelectedRow(), 0);//获取要删掉文件的路径
13. try
14. hdfs.delete(new Path(temp), true);
15. } catch
16. e1.printStackTrace();
17. }
18. try
19. showTable(currentPath);
20. } catch
21. e1.printStackTrace();
22. }
23. }
24. }
if (e.getSource() == deleItem) {
int ensuce = JOptionPane.showConfirmDialog(new MainWindow(),
"确定删除所选文件吗", "确认对话框", JOptionPane.YES_NO_OPTION);
if (ensuce == JOptionPane.NO_OPTION) {
return;
}
if (ensuce == JOptionPane.YES_OPTION) {
if (fileList.getSelectedRow() >= 0) {
String temp = currentPath
+ "/"
+ fileList.getValueAt(
fileList.getSelectedRow(), 0);//获取要删掉文件的路径
try {
hdfs.delete(new Path(temp), true);
} catch (IOException e1) {
e1.printStackTrace();
}
try {
showTable(currentPath);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
3、文件表格展现
主要代码:
[java] view plain copy print ?
1. /*-------------------------------------把currentPath路径下的文件和文件夹属性全都显示表格中----------------------------------------------------------*/
2. private void showTable(String currentPath) throws
3. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
4. Path inputDir = new Path(currentPath);/* 获取文件的路径*/
5. /* FileStatue类*/
6. FileStatus[] status = hdfs.listStatus(inputDir);/* 得到文件路径目录下文件列表*/
7. DefaultTableModel model = (DefaultTableModel) fileList.getModel(); // 获取表格模型
8. if (fileList.getRowCount() != 0) { // 当表格中有数据
9. ((DefaultTableModel) fileList.getModel()).setRowCount(0);// 将表格置空
10. }
11. for (int i = 0; i < status.length; i++) {
12. String filename = null;
13. String lenStr = null;
14. String modifDate = null;
15. filename = status[i].getPath().getName();
16. String length = null; // 获取文件大小信息
17. DecimalFormat df = new DecimalFormat("#.00");
18. if
19. lenStr = "-";
20. } else
21. if (status[i].getLen() > (1024 * 1024 * 1024)) {
22. length = df.format(status[i].getLen()
23. / (1024.0 * 1024 * 1024));
24. lenStr = " " + length + "G";
25. } else if (status[i].getLen() > (1024 * 1024)) {
26. length = df.format(status[i].getLen() / (1024.0 * 1024));
27. lenStr = " " + length + "M";
28. } else if (status[i].getLen() > 1024) {
29. length = df.format(status[i].getLen() / 1024.0);
30. lenStr = " " + length + "KB";
31. } else
32. length = df.format(status[i].getLen());
33. lenStr = " " + length + "B";
34. }
35. }
36. modifDate = sdf.format(status[i].getModificationTime());
37. model.addRow(new Object[] { filename, lenStr, modifDate }); // 将文件名、文件大小、文件创建日期添加到表格
38. }
39. }
/*-------------------------------------把currentPath路径下的文件和文件夹属性全都显示表格中----------------------------------------------------------*/
private void showTable(String currentPath) throws IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Path inputDir = new Path(currentPath);/* 获取文件的路径*/
/* FileStatue类*/
FileStatus[] status = hdfs.listStatus(inputDir);/* 得到文件路径目录下文件列表*/
DefaultTableModel model = (DefaultTableModel) fileList.getModel(); // 获取表格模型
if (fileList.getRowCount() != 0) { // 当表格中有数据
((DefaultTableModel) fileList.getModel()).setRowCount(0);// 将表格置空
}
for (int i = 0; i < status.length; i++) {
String filename = null;
String lenStr = null;
String modifDate = null;
filename = status[i].getPath().getName();
String length = null; // 获取文件大小信息
DecimalFormat df = new DecimalFormat("#.00");
if (status[i].isDir()) {
lenStr = "-";
} else {
if (status[i].getLen() > (1024 * 1024 * 1024)) {
length = df.format(status[i].getLen()
/ (1024.0 * 1024 * 1024));
lenStr = " " + length + "G";
} else if (status[i].getLen() > (1024 * 1024)) {
length = df.format(status[i].getLen() / (1024.0 * 1024));
lenStr = " " + length + "M";
} else if (status[i].getLen() > 1024) {
length = df.format(status[i].getLen() / 1024.0);
lenStr = " " + length + "KB";
} else {
length = df.format(status[i].getLen());
lenStr = " " + length + "B";
}
}
modifDate = sdf.format(status[i].getModificationTime());
model.addRow(new Object[] { filename, lenStr, modifDate }); // 将文件名、文件大小、文件创建日期添加到表格
}
}
4、文件搜索功能实现(利用回溯算法+字符匹配来实现)
先测试一下功能吧!我们输入“Hadoop”关键字搜索比配的文件
再入:输入“数学”搜索一下结果
主要实现代码
[java] view plain copy print ?
1. showAllResult(target);//具体实现
2. /*--------------------获取所有要搜索到的文件路径---------------------------------*/
3. private
4. List<String> result = new
5. char[] tar = target.toCharArray();
6. int count = 0;
7. String findPath = currentPath;//默认搜索的路径是目前打开目录下为根的目录树
8. getAllFile(tar, result, findPath, count);
9. return
10. }
11. /*-----------------------------回溯检测树形下的文件---------------------------------------------------------*/
12. private void getAllFile(char[] tar, List<String> result, String findPath,
13. int
14. conf = new
15. try
16. hdfs = FileSystem.get(URI.create(findPath), conf);
17. } catch
18. e.printStackTrace();
19. }
20. try
21. if (hdfs.isFile(new
22. String name = hdfs.getFileStatus(new
23. .getName();
24. if (isFind(tar, name.toCharArray())) {//检测是否字符匹配,匹配为找到
25. result.add(findPath);// 搜索到加入数组
26. }
27. return;
28. }
29. } catch
30. e.printStackTrace();
31. }
32. FileStatus[] sta = null;
33. try
34. sta = hdfs.listStatus(new
35. } catch
36. e.printStackTrace();
37. }
38. for (int i = 0; i < sta.length; i++) {//回溯法实现循环递归遍历
39. getAllFile(tar, result, sta[i].getPath().toString(), count++);
40. }
41. }
42. /*-----------------------查看字符串是否包含--------------------------------------------*/
43. private boolean isFind(char[] tar, char[] sour) {
44. int all=0.0;for (int i = 0; i < tar.length; i++) {
45. int j = 0;
46. for
47. if
48. all++;break;
49. }
50. }
51. if (j == sour.length&&all/sour.length<0.75) {//概率匹配
52. return false;
53. }
54. }
55. return true;
56. }
showAllResult(target);//具体实现
/*--------------------获取所有要搜索到的文件路径---------------------------------*/
private List<String> findAllFile(String target) {
List<String> result = new ArrayList<String>();
char[] tar = target.toCharArray();
int count = 0;
String findPath = currentPath;//默认搜索的路径是目前打开目录下为根的目录树
getAllFile(tar, result, findPath, count);
return result;
}
/*-----------------------------回溯检测树形下的文件---------------------------------------------------------*/
private void getAllFile(char[] tar, List<String> result, String findPath,
int count) {
conf = new Configuration();
try {
hdfs = FileSystem.get(URI.create(findPath), conf);
} catch (IOException e) {
e.printStackTrace();
}
try {
if (hdfs.isFile(new Path(findPath))) {
String name = hdfs.getFileStatus(new Path(findPath)).getPath()
.getName();
if (isFind(tar, name.toCharArray())) {//检测是否字符匹配,匹配为找到
result.add(findPath);// 搜索到加入数组
}
return;
}
} catch (IOException e) {
e.printStackTrace();
}
FileStatus[] sta = null;
try {
sta = hdfs.listStatus(new Path(findPath));
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < sta.length; i++) {//回溯法实现循环递归遍历
getAllFile(tar, result, sta[i].getPath().toString(), count++);
}
}
/*-----------------------查看字符串是否包含--------------------------------------------*/
private boolean isFind(char[] tar, char[] sour) {
int all=0.0;for (int i = 0; i < tar.length; i++) {
int j = 0;
for (; j < sour.length; ++j) {
if (tar[i] == sour[j]) {
all++;break;
}
}
if (j == sour.length&&all/sour.length<0.75) {//概率匹配
return false;
}
}
return true;
}
5、文件分类实现查询
a、文件分类管理查看,查看“文档”列出系统中所有的文档
b、“图片”
c、“音乐”
等等 。。。 。。。
6、其他的实现,目录文件跟踪、文件维护等:
最后说说本系统的信息处理的实现---MapReduce解决
首先说下其实登陆不只是利用数据库来实现的,解决方法有如下几种:
方案一:用另外一台机器专门用于对数据库操作的。要是在一个Hadoop中集群中安装一个数据库,我们不应该把数据库放在namenode中,而是放到另外的一台机,因
为namenode的任务已经够多了,安装在namenode上,多用户登陆时对数据库操作会消耗namenode的内存,会影响namenode对datanode的管理和调度等。
所以我们应该放到指定的一台机器上。
方案二:利用利用Hadoop中分布式数据库HBase解决。这个毫无疑问是最好的解决方案,是针对云技术分布式的数据库。不过本人对HBase还是处于了解阶段,所以没
有用上它。
最终方案:HBase用不上,不过没关系,因为现在只是对一个用户信息处理实现,业务量很少,我可以仿照Hive那样,在数据进行的时候转化为MapReduce进行,利用MapReduce来进行表与表的关联。
例如如下表: 信息表:
登陆表:
有待扩展的功能模块: 我的分享---- 可以做成分享一个文件提供所有人下载,也可以做成分享给具体的某个用户。
实现方式:做一个分享表,记录了 分享人,被分享人,文件获取的路径(或者获取文件所需的参数参数)
如下:
总结:本人学习Hadoop至今快半年,熟悉HDFS、MapReduce开发,有对过Hadoop HDFS部分、MapReduce源代码深入分析过,特别是MapReduce、做过不少的MapReduce计算实现。对Hadoop云技术很感兴趣,渴望从事于相关的开发工作。
总体概况
项目名称: 《Hadoop云盘系统》
Ø 项目开发环境:Linux下Hadoop分布式系统
Ø 项目开发环境:Ubuntu11.04+Hadoop0.20.2+JDK1.6+Eclipse3.3.2。
Ø 使用技术:Hadoop + Java
Ø 作品展示地址:
Ø 作品描述:1、个人独立完成,课余兴趣作品。包含全部设计、分析、编码、优化。
2、功能实现,文件上传、下载、删除、维护、文件夹的新建、文件路径跟踪、以及个人文件搜索功能实现和文件分类展现等。
3、基于Hadoop开发的分布式云平台的文件管理系统。
一、 概况:
1、这是个人的业余爱好项目,自己进行了全部的设计、分析、编码、和优化。
2、 根据现场需求进行流程分析与编写。
3、 根据所需求的业务进行开发,代码编写,实现功能。
4、 对程序业务逻辑进行优化,使其达到更高的性能。
项目难点:1、搜索的实现利用了回溯法进行所有文件的搜索,利用字符是否包含来判断是否进入结果容器中
2、目录跟踪显示的实现
二、这是本人仿照《百度网盘》,利用Hadoop技术进行开发的《Hadoop云盘系统》
如下图所示,《百度网盘》和自己做的《Hadoop云盘系统》进行了对比。
再看个人的《云盘》
总结:界面设计简洁,整齐,操作方面,用户体验良好。
三、Hadoop集群主要配置和启动操作操作过程
1、查看集群的主节点配置。先在Linux中启动Hadoop,如下:查看现在JPS运行的进程,检查系统是否正常启动
2、查看 core-site.xml文件查看主节点的配置。
3、并在web中 查看 http://192.168.236.132:50030/ 和http://192.168.236.132:50070/ web界面集群启动情况,确定
无误后,可以利用Eclipse 启动程序运行程序了。
四、系统部分测试和主要代码解析
1、上传文件,是从本地文件系统中上传到HDFS中,上传到当前进入的目录当中
主要代码分析:
[java] view plain copy print ?
1. JFileChooser chooser = new
2. chooser.setVisible(true);
3. int returnVal = chooser.showOpenDialog(null);
4. if (returnVal == JFileChooser.APPROVE_OPTION) {// 为确定或OK是
5. String localPath = chooser.getSelectedFile()
6. .getPath();
7. String filename = chooser.getSelectedFile()
8. .getName();
9. InputStream in = null;
10. try
11. in = new
12. new FileInputStream(localPath));//本地文件输入流
13. } catch
14. e3.printStackTrace();
15. }
16. OutputStream out = null;
17. try
18. out = hdfs.create(new
19. + "/"
20. new
21. public void
22. System.out.print(".");
23. }
24. });//HDFS路径的输出流抽象
25. } catch
26. e2.printStackTrace();
27. }
28. try
29. IOUtils.copyBytes(in, out, 4096, true);//利用IOUtils工具类实现上传
30. } catch
31. e1.printStackTrace();
32. }
33. try
34. showTable(currentPath);//上传完毕就刷新当前路径的文件表格
35. } catch
36. e1.printStackTrace();
37. }
38. }
JFileChooser chooser = new JFileChooser();
chooser.setVisible(true);
int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {// 为确定或OK是
String localPath = chooser.getSelectedFile()
.getPath();
String filename = chooser.getSelectedFile()
.getName();
InputStream in = null;
try {
in = new BufferedInputStream(
new FileInputStream(localPath));//本地文件输入流
} catch (FileNotFoundException e3) {
e3.printStackTrace();
}
OutputStream out = null;
try {
out = hdfs.create(new Path(currentPath
+ "/" + filename),
new Progressable() {
public void progress() {
System.out.print(".");
}
});//HDFS路径的输出流抽象
} catch (IOException e2) {
e2.printStackTrace();
}
try {
IOUtils.copyBytes(in, out, 4096, true);//利用IOUtils工具类实现上传
} catch (IOException e1) {
e1.printStackTrace();
}
try {
showTable(currentPath);//上传完毕就刷新当前路径的文件表格
} catch (IOException e1) {
e1.printStackTrace();
}
}
2、文件下载分析:从在HDFS中下载到本地文件系统中,
主要代码分析:
[java] view plain copy print ?
1. if
2. int ensuce = JOptionPane.showConfirmDialog(new
3. "确定删除所选文件吗", "确认对话框", JOptionPane.YES_NO_OPTION);
4. if
5. return;
6. }
7. if
8. if (fileList.getSelectedRow() >= 0) {
9. String temp = currentPath
10. + "/"
11. + fileList.getValueAt(
12. fileList.getSelectedRow(), 0);//获取要删掉文件的路径
13. try
14. hdfs.delete(new Path(temp), true);
15. } catch
16. e1.printStackTrace();
17. }
18. try
19. showTable(currentPath);
20. } catch
21. e1.printStackTrace();
22. }
23. }
24. }
if (e.getSource() == deleItem) {
int ensuce = JOptionPane.showConfirmDialog(new MainWindow(),
"确定删除所选文件吗", "确认对话框", JOptionPane.YES_NO_OPTION);
if (ensuce == JOptionPane.NO_OPTION) {
return;
}
if (ensuce == JOptionPane.YES_OPTION) {
if (fileList.getSelectedRow() >= 0) {
String temp = currentPath
+ "/"
+ fileList.getValueAt(
fileList.getSelectedRow(), 0);//获取要删掉文件的路径
try {
hdfs.delete(new Path(temp), true);
} catch (IOException e1) {
e1.printStackTrace();
}
try {
showTable(currentPath);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
3、文件表格展现
主要代码:
[java] view plain copy print ?
1. /*-------------------------------------把currentPath路径下的文件和文件夹属性全都显示表格中----------------------------------------------------------*/
2. private void showTable(String currentPath) throws
3. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
4. Path inputDir = new Path(currentPath);/* 获取文件的路径*/
5. /* FileStatue类*/
6. FileStatus[] status = hdfs.listStatus(inputDir);/* 得到文件路径目录下文件列表*/
7. DefaultTableModel model = (DefaultTableModel) fileList.getModel(); // 获取表格模型
8. if (fileList.getRowCount() != 0) { // 当表格中有数据
9. ((DefaultTableModel) fileList.getModel()).setRowCount(0);// 将表格置空
10. }
11. for (int i = 0; i < status.length; i++) {
12. String filename = null;
13. String lenStr = null;
14. String modifDate = null;
15. filename = status[i].getPath().getName();
16. String length = null; // 获取文件大小信息
17. DecimalFormat df = new DecimalFormat("#.00");
18. if
19. lenStr = "-";
20. } else
21. if (status[i].getLen() > (1024 * 1024 * 1024)) {
22. length = df.format(status[i].getLen()
23. / (1024.0 * 1024 * 1024));
24. lenStr = " " + length + "G";
25. } else if (status[i].getLen() > (1024 * 1024)) {
26. length = df.format(status[i].getLen() / (1024.0 * 1024));
27. lenStr = " " + length + "M";
28. } else if (status[i].getLen() > 1024) {
29. length = df.format(status[i].getLen() / 1024.0);
30. lenStr = " " + length + "KB";
31. } else
32. length = df.format(status[i].getLen());
33. lenStr = " " + length + "B";
34. }
35. }
36. modifDate = sdf.format(status[i].getModificationTime());
37. model.addRow(new Object[] { filename, lenStr, modifDate }); // 将文件名、文件大小、文件创建日期添加到表格
38. }
39. }
/*-------------------------------------把currentPath路径下的文件和文件夹属性全都显示表格中----------------------------------------------------------*/
private void showTable(String currentPath) throws IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Path inputDir = new Path(currentPath);/* 获取文件的路径*/
/* FileStatue类*/
FileStatus[] status = hdfs.listStatus(inputDir);/* 得到文件路径目录下文件列表*/
DefaultTableModel model = (DefaultTableModel) fileList.getModel(); // 获取表格模型
if (fileList.getRowCount() != 0) { // 当表格中有数据
((DefaultTableModel) fileList.getModel()).setRowCount(0);// 将表格置空
}
for (int i = 0; i < status.length; i++) {
String filename = null;
String lenStr = null;
String modifDate = null;
filename = status[i].getPath().getName();
String length = null; // 获取文件大小信息
DecimalFormat df = new DecimalFormat("#.00");
if (status[i].isDir()) {
lenStr = "-";
} else {
if (status[i].getLen() > (1024 * 1024 * 1024)) {
length = df.format(status[i].getLen()
/ (1024.0 * 1024 * 1024));
lenStr = " " + length + "G";
} else if (status[i].getLen() > (1024 * 1024)) {
length = df.format(status[i].getLen() / (1024.0 * 1024));
lenStr = " " + length + "M";
} else if (status[i].getLen() > 1024) {
length = df.format(status[i].getLen() / 1024.0);
lenStr = " " + length + "KB";
} else {
length = df.format(status[i].getLen());
lenStr = " " + length + "B";
}
}
modifDate = sdf.format(status[i].getModificationTime());
model.addRow(new Object[] { filename, lenStr, modifDate }); // 将文件名、文件大小、文件创建日期添加到表格
}
}
4、文件搜索功能实现(利用回溯算法+字符匹配来实现)
先测试一下功能吧!我们输入“Hadoop”关键字搜索比配的文件
再入:输入“数学”搜索一下结果
主要实现代码
[java] view plain copy print ?
1. showAllResult(target);//具体实现
2. /*--------------------获取所有要搜索到的文件路径---------------------------------*/
3. private
4. List<String> result = new
5. char[] tar = target.toCharArray();
6. int count = 0;
7. String findPath = currentPath;//默认搜索的路径是目前打开目录下为根的目录树
8. getAllFile(tar, result, findPath, count);
9. return
10. }
11. /*-----------------------------回溯检测树形下的文件---------------------------------------------------------*/
12. private void getAllFile(char[] tar, List<String> result, String findPath,
13. int
14. conf = new
15. try
16. hdfs = FileSystem.get(URI.create(findPath), conf);
17. } catch
18. e.printStackTrace();
19. }
20. try
21. if (hdfs.isFile(new
22. String name = hdfs.getFileStatus(new
23. .getName();
24. if (isFind(tar, name.toCharArray())) {//检测是否字符匹配,匹配为找到
25. result.add(findPath);// 搜索到加入数组
26. }
27. return;
28. }
29. } catch
30. e.printStackTrace();
31. }
32. FileStatus[] sta = null;
33. try
34. sta = hdfs.listStatus(new
35. } catch
36. e.printStackTrace();
37. }
38. for (int i = 0; i < sta.length; i++) {//回溯法实现循环递归遍历
39. getAllFile(tar, result, sta[i].getPath().toString(), count++);
40. }
41. }
42. /*-----------------------查看字符串是否包含--------------------------------------------*/
43. private boolean isFind(char[] tar, char[] sour) {
44. int all=0.0;for (int i = 0; i < tar.length; i++) {
45. int j = 0;
46. for
47. if
48. all++;break;
49. }
50. }
51. if (j == sour.length&&all/sour.length<0.75) {//概率匹配
52. return false;
53. }
54. }
55. return true;
56. }
showAllResult(target);//具体实现
/*--------------------获取所有要搜索到的文件路径---------------------------------*/
private List<String> findAllFile(String target) {
List<String> result = new ArrayList<String>();
char[] tar = target.toCharArray();
int count = 0;
String findPath = currentPath;//默认搜索的路径是目前打开目录下为根的目录树
getAllFile(tar, result, findPath, count);
return result;
}
/*-----------------------------回溯检测树形下的文件---------------------------------------------------------*/
private void getAllFile(char[] tar, List<String> result, String findPath,
int count) {
conf = new Configuration();
try {
hdfs = FileSystem.get(URI.create(findPath), conf);
} catch (IOException e) {
e.printStackTrace();
}
try {
if (hdfs.isFile(new Path(findPath))) {
String name = hdfs.getFileStatus(new Path(findPath)).getPath()
.getName();
if (isFind(tar, name.toCharArray())) {//检测是否字符匹配,匹配为找到
result.add(findPath);// 搜索到加入数组
}
return;
}
} catch (IOException e) {
e.printStackTrace();
}
FileStatus[] sta = null;
try {
sta = hdfs.listStatus(new Path(findPath));
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < sta.length; i++) {//回溯法实现循环递归遍历
getAllFile(tar, result, sta[i].getPath().toString(), count++);
}
}
/*-----------------------查看字符串是否包含--------------------------------------------*/
private boolean isFind(char[] tar, char[] sour) {
int all=0.0;for (int i = 0; i < tar.length; i++) {
int j = 0;
for (; j < sour.length; ++j) {
if (tar[i] == sour[j]) {
all++;break;
}
}
if (j == sour.length&&all/sour.length<0.75) {//概率匹配
return false;
}
}
return true;
}
5、文件分类实现查询
a、文件分类管理查看,查看“文档”列出系统中所有的文档
b、“图片”
c、“音乐”
等等 。。。 。。。
6、其他的实现,目录文件跟踪、文件维护等:
最后说说本系统的信息处理的实现---MapReduce解决
首先说下其实登陆不只是利用数据库来实现的,解决方法有如下几种:
方案一:用另外一台机器专门用于对数据库操作的。要是在一个Hadoop中集群中安装一个数据库,我们不应该把数据库放在namenode中,而是放到另外的一台机,因
为namenode的任务已经够多了,安装在namenode上,多用户登陆时对数据库操作会消耗namenode的内存,会影响namenode对datanode的管理和调度等。
所以我们应该放到指定的一台机器上。
方案二:利用利用Hadoop中分布式数据库HBase解决。这个毫无疑问是最好的解决方案,是针对云技术分布式的数据库。不过本人对HBase还是处于了解阶段,所以没
有用上它。
最终方案:HBase用不上,不过没关系,因为现在只是对一个用户信息处理实现,业务量很少,我可以仿照Hive那样,在数据进行的时候转化为MapReduce进行,利用MapReduce来进行表与表的关联。
例如如下表: 信息表:
登陆表:
有待扩展的功能模块: 我的分享---- 可以做成分享一个文件提供所有人下载,也可以做成分享给具体的某个用户。
实现方式:做一个分享表,记录了 分享人,被分享人,文件获取的路径(或者获取文件所需的参数参数)
如下: