[toc]


1. 项目说明1

这是一个基于Hadoop的云盘系统,实现的界面是用javaweb完成的,使用的是Spring Struts2 hibernate集合框架,配有sql文件。

其实同类型的项目有很多,有的也写的很详细,只是都太久远了(17年以前…).

2. 部署环境

2.1. Linux安装mysql

ubuntu使用APT仓库;centos使用YUM仓库。

  1. 在MySQL官网ART仓库中找到下载链接: sudo wget https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb
  2. 安装MySQL并配置 注意结尾为deb,为Debian系发行版,可使用Debian Package,即dpkg来安装这个主面板,-i应该是--install的短命令版本: sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb
  • Enter之后可以选择5.7版本,这里才开始下载服务器端mysql-server(默认就是5.7),可以指定版本:sudo apt-get install mysql==version
  1. 开始更新安装
  • sudo apt-get update
  • sudo apt-get install mysql-server 密码:mysql
  1. 验证安装
  • MySQL安装完成后默认是启动的,以下命令分别是查看mysql状态|启动mysql|停止mysql|重启mysql sudo service mysql status|start|stop|restart
  • mysql -u root -p ,然后show databases
  • sudo netstat -tap | grep mysql

2.1.1. 导入数据库

  1. 建空数据库 create database netcloud;
  2. 导入数据库
  • use netcloud;
  • set names utf8;
  • source /home/netcloud/netcloud.sql;

2.2. Linux安装Tomcat

下载解压与安装mysql类似,然后2:

  • 赋权限,755—可读可写可使用:sudo chmod 755 -R apache-tomcat-7.0.104
  • 修改bin目录下的启动脚本: vim startup.sh,在最底下加入路径设置,路径设置为个人的实际路径
#set java environment
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_67
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:%{JAVA_HOME}/lib:%{JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
 
#tomcat
export TOMCAT_HOME=/usr/local/bin/apache-tomcat-8.5.54
  • 启动: ./startup.sh,可在8080端口验证

多出来的几步应该与

  • 启动所需的依赖
  • 开发者有没有自动化自身环境配置

有关系

注意 Eclipse默认对于6/7/8只提供整数版本的Server Adapter,所以最好还是下整数版本的tomcat.导入的项目是v7.0的.

2.3. Linux安装IDEA

  1. 学生账户名istarwyh,登陆后可以下载linux版放到虚拟机share目录.如果在ubuntu内下载,文件夹在/home/[用户名]/Downloads/home/[用户名]/下载
  2. 解压文件并进入bin目录
  • sudo tar -zxvf 文件名 -C /opt
  • cd /opt/文件名/bin
  1. 启动安装向导并允许创建启动脚本
  • ./idea.sh
  • 勾选Create Launcher Script,记下脚本所在目录,如 /usr/local/bin/idea

不是学生版破解可见 注意 如果内存不够,务必牺牲一些idea的功能换取流畅运行:

  • 卸载/关闭不需要用的插件
  • 根据自己的项目依赖只导入自己相关的Modules(Project Structure中)
  • 修改bin中的配置文件中内存堆大小:
    • idea.exe.vmoptions
    • idea64.exe.vmoptions
  • 调低Inspection级别—右下角的人头标志

2.4. 搭建HDFS存储平台

注意其实只要有hdfs就够了

2.5. IDEA整合hadoop开发环境

2.5.1. 没有整合之前

Java类被编译成一个或多个字节码.class文件,打包到.jar文件中,Java虚拟机从相应的.class文件和.jar文件中获取相应的字节码,故以WordCount.java为例的核心运行步骤:

  1. 编译:hadoop com.sun.tools.javac.Main WordCount.java
  2. 打成wcjar包:jar cf wc.jar WordCount*.class
  3. 上传文件:hadoop fs -copyFromLocal ja.txt /user/用户名/wordcount/input
  4. 运行jar包:hadoop jar wc.jar WordCount /user/用户名/wordcount/input/ja.txt /user/用户 名/wordcount/output
  5. 查看输出文件hadoop fs -cat /user/用户名/wordcount/output/part-r-00000|more

2.5.2. 第一种3

  1. project structure--modules--dependencies中引入Jar包;也即Eclipse中的build path:

    • ”/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar;
    • usr/local/hadoop/share/hadoop/common/lib目录下的所有JAR包;
    • /usr/local/hadoop/share/hadoop/hdfs目录下的haoop-hdfs-2.7.1.jar和haoop-hdfs-nfs-2.7.1.jar;
    • /usr/local/hadoop/share/hadoop/hdfs/lib目录下的所有JAR包。
  2. eclipse下bin目录,idea下src目录放置core-site.xmlhdfs-site.xml(默认/hadoop/etc/hadoop) 看一下core-site.xml提供了什么信息:

  • core-site.xml:
<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master:9000</value>
    </property>
</configuration>

2.5.3. IDEA整合之后

背景信息

  • NameNode :IP:192.168.56.100 NetMask: 255.255.255.0
  • MasterNode port:9000
  • jobtracker port:54311(是yarn吗?因为其实没有计算任务,云盘用不到这个)
  1. 引入依赖 修改pom.xml,添加Hadoop依赖4
<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>${cdh.hadoop.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>${cdh.hadoop.version}</version>
    </dependency>
</dependencies>
 
  1. 打成jar包 通过构建Artifacts的方式装载项目资产,maven可主动找到主类.开发者将项目依赖的jar包导入,最后合成一个jar包.以下为具体步骤: 对项目名称右击,选择Open Module SettingsArtifactsJarinclude in project buildBuild Artifacts

注意

如果按传统方式(即1.4.1中所述)运行jar包,打jar时一定不要选择主类5

2.5.4. IDEA连接Hadoop

//TODO:问题是真的是连接而不是导入包吗?我也不知道…

2.5.5. 客户端其他用途

HDFS文件的操作用到类有以下3个:

  • org.apache.hadoop.conf.Configuration4;
  • org.apache.hadoop.fs.FileSystem;
  • org.apache.hadoop.fs.Path;

Configuration类为例,客户端可以配置文件的切块大小和存储的副本数量6:

  • 切块大小的参数:dfs.blocksize
  • 副本数量的参数:dfs.replication

代码示例:

 Configuration conf = new Configuration();
    conf.set("dfs.replication", "2");
    conf.set("dfs.blocksize","64m");
     fs= FileSystem.get(new URI("hdfs://hdp-01:9000"),conf,"root");

2.6. (window客户端访问HDFS)

2.6.1. 说明

HDFS的客户端有多种形式:

  • 网页形式
  • 命令行形式
  • APP客户端

客户端在哪里运行没有约束,只要运行客户端的机器能够跟Linux中的HDFS集群通信即可6.在本地windows上开发一个Java客户端,利用HDFS提供的Java API6可实现访问HDFS.

但是windows下远程连接linux下的hadoop集群不像在linux下直接配置IDE一样方便,处处是坑,并且似乎不是简单的通信,运行MapReduce还需要Windows本地环境 7

2.6.2. 具体操作

很可惜,并没有找到具体通信的资料,不过有步骤的参考文章

2.6.2.1. 确保hadoop已正确发布 8

启动start-dfs.sh

  1. 确定Linux内可以通过IP访问集群,如:

  2. 确定Windows host主机可以与Linux中的master通信,可在 C:\Windows\System32\drivers\etchosts添加IP与节点名映射9:

之后访问master:57900.必须注意,交换机与主机之间的连接有三种模式10,为了集群之间的统一往往用Host-only模式,这时候在开始配置虚拟机网卡时,需要让主机的虚拟网卡通过虚拟交换机与master的虚拟网卡连接.

  1. 通过master机上命令行,可正常上传、删除文件/文件夹;

  2. 检查hadoop集群master/slaver的日志(默认位置$HADOOP_HOME/logs),看是否有报错信息.

2.6.3. 类比

也可以在Windows搭建Hadoop开发平台11.回顾Hadoop的三种运行模式:

  • 独立(或本地)模式:无需运行任何守护进程,所有程序都在同一个JVM上执行。在独立模式下测试和调试MapReduce程序很方便,因此该模式在开发/作业阶段比较适合。
  • 伪分布式(yarn)模式: Hadoop守护进程运行在本地机器上,模拟一个小规模的集群
  • 全分布式(yarn)模式: Hadoop守护进程运行在一个集群上

3. 编译云盘程序

3.1. 源代码上传

  1. 源代码NetCloud.rar解压缩为一个文件夹NetCloud并上传至master主机/root

3.2. 配置依赖

注意Linux的一般目录结构:

/bin 用来贮存用户命令。/usr/bin 也被用来贮存用户命令。  
   
/sbin 许多系统命令(例如 shutdown)的贮存位置。/usr/sbin 中也包括了许多系统命令。  
   
/root 根用户(超级用户)的主目录。  
   
/mnt 该目录中通常包括系统引导后被挂载的文件系统的挂载点。比如,默认的光盘挂载点是 /mnt/cdrom/。可以为U盘建一个挂载点:mkdir /mnt/usb。  
   
/boot 包括内核和其它系统启动期间使用的文件,最大不超过200M。通常我为 /boot 建一个primary分区是1G。  
   
/lost+found 被 fsck 用来放置零散文件(没有名称的文件)。  
   
/lib 包含许多被 /bin 和 /sbin 中的程序使用的库文件。目录 /usr/lib 中含有更多用于用户程序的库文件。/lib 目录下放置的是 /bin 和 /sbin 目录下程序所需的库文件。简单说,/lib 是内核级的;/usr/lib 是系统级的;/usr/local/lib 是用户级的。仅仅被 /usr 目录下的程序所使用的共享库不必放到 /lib 目录下。只有 /bin 和 /sbin 下的程序所需要的库有必要放到 /lib 目录下。  
   
/dev 贮存设备文件。  
   
/etc 包含许多配置文件和目录。  
   
/var 用于贮存variable(或不断改变的)文件,例如日志文件和打印机假脱机文件,虚拟机镜像文件等。  
   
/usr 包括与系统用户直接有关的文件和目录,例如应用程序及支持它们的库文件。  
   
/proc 一个虚拟的文件系统(不是实际贮存在磁盘上的),它包括被某些程序使用的系统信息。  
   
/initrd 用来在计算机启动时挂载 initrd.img 映像文件的目录以及载入所需设备模块的目录。不要删除 /initrd 目录。如果你删除了该目录后再重新引导 Red Hat Linux 时,你将无法引导你的计算机。  
   
/tmp 用户和程序的临时目录。 /tmp 给予所有系统用户读写权。  
   
/home 用户主目录的默认位置。  
   
/opt 可选文件和程序的贮存目录。该目录主要被第三方开发者用来简易地安装和卸装他们的软件包。

3.2.1. JDK

  • java-11-openjdk-amd64目录:
bin  conf  docs  include  jmods  legal  lib  man  release

  • jdk1.7.0_71目录:
bin        jre          src
COPYRIGHT  lib          THIRDPARTYLICENSEREADME-JAVAFX.txt
db         LICENSE      THIRDPARTYLICENSEREADME.txt
debug.log  README.html
include    release

3.2.1.1. terminal的颜色

/usr/lib/jvm/目录下有不同颜色jdk包:

  • 复制:即复制了一个副本,独立于原文件,类似于深拷贝
  • 硬链接: 在复制的基础上还指向同一个内存地址
  • 软链接:只是一个引用,类似于浅拷贝或者=

白色: 普通文件 蓝色: 目录文件/文件夹 红色:压缩文件
绿色:可执行文件
红色闪烁:错误的符号链接 淡蓝色:符号链接 黄色:设备文件 紫色:图片文件 灰色:其它文件

所以终于发现了jdk1.7.0_71颜色的不对劲,应该是因为擅自解压了src.zip:

  • 正确的jdk1.7.0_71目录:
bin        lib          src.zip
COPYRIGHT  LICENSE      THIRDPARTYLICENSEREADME-JAVAFX.txt
db         man          THIRDPARTYLICENSEREADME.txt
include    README.html
jre        release

而实际上最后使用的是jdk1.7.0_67…我真的不知道自己当初怎么看的

3.2.1.2. 切换JDK

本项目使用的是jdk1.7.0_71,等价JDK7 /J2SE7 /JAVA7.

  1. 环境变量(/etc/profile(所有用户的变量)或~/.bashrc(当前用户的变量))如下:
  • export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
  • export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_71

不确定是否需要改动,但是真正起作用的其实是/usr/bin/底下的java/javac这些引用的指向,这个指向可以使用下面的命令改变

  1. 必须参考使用这篇的命令.
  • update-alternatives --install gen link alt pri [--slave sgen slink salt]
  • update-alternatives --remove name path
  • update-alternatives –-config java

从Sun被收购,Java分为Oracle JDKOpenJDK,2020使用较多是OpenJDK 8,最新版是OpenJDK 14.

  1. 对于一般的应用来说,他们还是去找系统的JAVA_HOME

3.2.2. Lib下的jar包

  • Eclipse jar 包是放在webinfo --lib目录下,IDEA没法自动加载,需要手动选择加载12

放弃从Eclipse迁移到IDEA,因为

  • 动摇: 始终报找不到jdk的错误
  • 这个项目有个bug是要在MapReduce里加目录那种…

直接用Eclipse它不香吗?


3.3. 运行环境说明13

3.3.1. 安装Eclipse

apt-get安装eclipse和直接下载安装eclipse有什么区别?

  • 软件库安装目录一般就是usr/lib/
  • 自行安装安装版本可以自定义

此外,最起码2020年5月22日从apt库安装的Eclipse是缺少某个启动类而无法直接启动的…

  • start eclipse with debug parameter(事先配置好环境变量):
/opt/eclipse/eclipse -clean -consolelog -debug

注意

  1. Eclipse放置好之后还需要指定运行的jre,在eclipse.ini的顶部插入:
-vm
/usr/lib/jvm/jdk1.7.0_67/jre/bin
  1. Neon/4.5版本开始的Eclipse只支持jdk1.8以上14,4.5版本下载
  1. 高版本的如Mars亲试不支持hadoop2x-eclipse-plugin-masterNew hadoop Location;而低版本的可能不支持你的高版本java语法.最后只能选择Eclipse Luna

  2. Eclipse-jee版本的对于开发者是友好的,其他版本(如Eclipse-java版本)有许多的插件(如tomcat)需要自己配,如从官网引入,而对于久远的版本,官方可能已经停止了对插件仓库的维护…

3.3.2. Hadoop2x-eclipse插件15

使用ant对hadoop的jar包进行打包并适应Eclipse加载,所以参数里有hadoop和eclipse的目录. 必须注意对于不同的hadoop版本, HADDOP_INSTALL_PATH/share/hadoop/common/lib下的jar包版本都不同,需要一个个调整

  • hadoop2x-eclipse-plugin-master/ivy/library.properties
  • hadoop2x-eclipse-plugin-master/src/contrib/eclipse-plugin/build.xml

以使ant可以按照hadoop2x-eclipse-plugin-master/src/contrib/eclipse-plugin下的build.xml进行bulid生成插件的jar包.

本次试验遇到了htrace-core4-4.1.0-incubating.jar 这个只能被hadoop2x-eclipse-plugin-master识别为htrace-core-4.1.0-incubating.jar 的包,多了一个4,这需要在build.xml中进行修改

最后在build/contrib/eclipse-plugin底下生成插件.

  • To know the ‘Port’ numbers, start Hadoop and open http://localhost:8088/cluster in a browser. Click Tools --> Configuration and search for the following properties.16

DFS Master:Address of the Distributed FileSystem Master node (The Name Node).

<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
<final>false</final>
<source>core-site.xml</source>
</property>

Map/Reduce(V2) Master:Address of the Map/Reduce master node (The Job Tracker). 原本的是

<property>
    <name>mapreduce.jobtracker.http.address</name>
   <value>0.0.0.0:50030</value>
    <source>mapred-default.xml</source>
</property>

本机实际的是:

<name>mapreduce.jobtracker.address</name>
<value>master:54311</value>
<final>false</final>
<source>mapred-site.xml</source>
</property>

注意

  1. DFS Locations在project explorer中而不是package explorer中,而且Eclipse对于窗口的隐藏做得”太好”,以至于可能需要多点几个按钮
  2. 这是一个好案例,但是个人依然可能因为某些原因Eclipse无法连接上Hadoop集群

注意

  1. 如果是在windows底下编译插件,还需要hadoop.dllwinutils.exe17
  1. 如果遇到了New Hadoop Location失败,还需要加载woodstox-core-5.0.3.jarstax2-api-3.1.4.jar

3.3.3. 导入jdk相关和servlet相关的jar

在Eclipse中一个完整的JavaWeb项目,必须有以下类库(jar依赖库):

  • 指定Server Runtime—运行项目的服务器,比如tomcat
    • jsp
    • tomcat-api
    • 必须注意如果项目版本不一致,而旧版IDE又不提供修改,自己找出现错误的路径或类型如Faceted Project Problem然后去org.eclipse.wst.common.project.facet.core配置文件里改,比如直接删掉18 <runtime name="apache-tomcat-8.5.54"/>
  • 指定jdk—负责Java的编译和运行;
  • 项目jar包—ib文件夹下的jar包会由Web App Libraries统一管理。

在编译之前,目录可能不完全按照上述组成呈现,但是编译之后会像这样:

3.3.4. Eclipse导入Web项目的常见问题

Eclipse导入新项目,常见问题就是XXX cannot be resolved to a type19

  1. jar包冲突或缺失。查看项目中是否存在“XXX”所在的jar包,如果不存在,则导入对应jar包.导入jar包除了手动添加,可能某个lib文件夹下自带了. 如果存在,查看jar包是否冲突,如果冲突,删除其中一个。如果一切正常,则执行2方法。

  2. jdk不存在或不匹配。项目环境要求jdk7,而eclipse中使用的却是jdk6;重新配置eclipse的jdk环境,使之与项目要求环境一致。

  3. Eclipse查找项目类型策略所致。如果1和2没问题,但还是报错;这时,需要执行“Project” | "Clean…",完成后,报错消失!

3.4. Rebulid~

为了提高validation的速度,可以通过Preferences->Validation->Suspend all validators直接禁止validation20.

  • 导出.war文件

注意

  1. 推荐使用Eclipse-jee,自带导出war功能

3.5. 修改配置

3.5.1. 修改数据库和集群IP

3.5.1.1. 修改连接数据库的IP

左侧视图,双击工程名NetCloud,可以打开工程结构,找到Java Resources 下的 src文件夹下的jdbc.properties文件,打开,修改你的IP,同时记得添加编码信息(否则,可能会出现注册成功用户名后不能成功登陆的问题)

jdbc.url=jdbc\:mysql\://124.124.132.224\:3306/netcloud?characterEncoding=utf-8

jdbc.properties中的信息将会被applicationContext.xml中的dataSourceBean 所引用.

注意 本机地址一定是localhost127.0.0.1,网卡所代表的本机地址可能无法使得数据库被连接上.进而报类似

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

这样的error,意即(mysql)服务器不响应.为了确保服务器可被正常连接并响应,可以用另一台客户机访问它21,如 (但是也有mysql22默认是拒绝127.0.0.1之外的其他IP的,可以戳我看怎么远程连接mysql)

mysql -h 192.168.192.134 -P3306 -uroot -p

如果连不上可能是OS防火墙的缘故.Linux原始的防火墙工具iptables,Ubuntu基于iptables提供了ufw(uncomplicated firewall),其允许客户端访问所有端口的命令: sudo ufw allow from 192.168.0.1 其实防火墙默认是关闭的,即一般端口都是打开的.

3.5.1.2. 修改hadoop集群的IP

打开Java Resources 下的 src文件夹下的applicationcontext.xml文件,修改你的集群IP,具体位置在:

	<bean id="dealFile" class="com.nitcloud.netdisk.utils.DealFile">
		<property name="address" value="hdfs://124.124.132.220"/>
		<property name="hdfs" ref="hdfs"/>
	</bean>

3.6. 在tomcat 7 上运行23

4. 其他

如果的确未知原因连接不上hadoop集群,也可以shell或网页使用hdfs基本操作

5. References

Footnotes

  1. 基于hadoop (hdfs)+ javaweb (ssh)实现的网盘

  2. tomcat安装

  3. 第一种把所有jar包都引入

  4. 远程HDFS文件的操作 2

  5. IDEA 开发hadoop项目配置及打包

  6. hdfs客户端的理解,多种方式操作hdfs 2 3

  7. windows下eclipse远程连接linux下的hadoop集群并测试wordcount例子

  8. hadoop正确发布

  9. 在Windows下使用浏览器访问HDFS的小问题

  10. Vmware虚拟机三种网络模式详解

  11. Windows 7 64位系统上搭建Hadoop伪分布式环境

  12. eclipse转idea

  13. JavaAPI操纵Hadoop

  14. Eclipse版本和JDK版本对应关系

  15. Hadoop2.9.1 + Eclipse配置(解决New Location无反应)

  16. Apache Hadoop Development Tools

  17. windows下编译hadoop-eclipse-plugin-2.10.0.jar

  18. Target runtime Apache Tomcat v7.0 is not defined.

  19. Eclipse如何导入MyEclipse的项目

  20. eclipse 的validating长时间卡住不动

  21. 如何在本地远程连接linux虚拟机上面的mysql

  22. mysql的my.cnf默认bind-address = 127.0.0.1

  23. Linux部署Tomcat并发布web项目