[toc]
1. 项目说明1
这是一个基于Hadoop的云盘系统,实现的界面是用javaweb完成的,使用的是Spring Struts2 hibernate
集合框架,配有sql文件。
其实同类型的项目有很多,有的也写的很详细,只是都太久远了(17年以前…).
2. 部署环境
2.1. Linux安装mysql
ubuntu使用
APT
仓库;centos使用YUM
仓库。
- 在MySQL官网
ART
仓库中找到下载链接:sudo wget https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb
- 安装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
- 开始更新安装
sudo apt-get update
sudo apt-get install mysql-server
密码:mysql
- 验证安装
- 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. 导入数据库
- 建空数据库
create database netcloud;
- 导入数据库
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
,在最底下加入路径设置,路径设置为个人的实际路径
- 启动:
./startup.sh
,可在8080
端口验证
多出来的几步应该与
- 启动所需的依赖
- 开发者有没有自动化自身环境配置
有关系
注意
Eclipse默认对于6/7/8只提供整数版本的Server Adapter
,所以最好还是下整数版本的tomcat.导入的项目是v7.0的.
2.3. Linux安装IDEA
- 学生账户名
istarwyh
,登陆后可以下载linux版放到虚拟机share
目录.如果在ubuntu内下载,文件夹在/home/[用户名]/Downloads
或/home/[用户名]/下载
- 解压文件并进入
bin
目录
sudo tar -zxvf 文件名 -C /opt
cd /opt/文件名/bin
- 启动安装向导并允许创建启动脚本
./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
为例的核心运行步骤:
- 编译:
hadoop com.sun.tools.javac.Main WordCount.java
- 打成
wc
jar包:jar cf wc.jar WordCount*.class
- 上传文件:
hadoop fs -copyFromLocal ja.txt /user/用户名/wordcount/input
- 运行jar包:
hadoop jar wc.jar WordCount /user/用户名/wordcount/input/ja.txt /user/用户 名/wordcount/output
- 查看输出文件
hadoop fs -cat /user/用户名/wordcount/output/part-r-00000|more
2.5.2. 第一种3
-
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包。
-
eclipse下
bin
目录,idea下src
目录放置core-site.xml
和hdfs-site.xml
(默认/hadoop/etc/hadoop
) 看一下core-site.xml
提供了什么信息:
- core-site.xml:
2.5.3. IDEA整合之后
背景信息
- NameNode :
IP:192.168.56.100
NetMask: 255.255.255.0 - MasterNode port:9000
- jobtracker port:54311(是
yarn
吗?因为其实没有计算任务,云盘用不到这个)
- 引入依赖
修改
pom.xml
,添加Hadoop依赖4
- 打成jar包
通过构建
Artifacts
的方式装载项目资产,maven可主动找到主类.开发者将项目依赖的jar包导入,最后合成一个jar包.以下为具体步骤: 对项目名称右击,选择Open Module Settings
→Artifacts
→Jar
→include in project build
→Build 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
代码示例:
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
-
确定Linux内可以通过IP访问集群,如:
-
确定Windows host主机可以与Linux中的master通信,可在
C:\Windows\System32\drivers\etc
的hosts
添加IP与节点名映射9:
之后访问master:57900
.必须注意,交换机与主机之间的连接有三种模式10,为了集群之间的统一往往用Host-only
模式,这时候在开始配置虚拟机网卡时,需要让主机的虚拟网卡通过虚拟交换机与master
的虚拟网卡连接.
-
通过master机上命令行,可正常上传、删除文件/文件夹;
-
检查hadoop集群master/slaver的日志(默认位置
$HADOOP_HOME/logs
),看是否有报错信息.
2.6.3. 类比
也可以在Windows
搭建Hadoop开发平台11.回顾Hadoop的三种运行模式:
- 独立(或本地)模式:无需运行任何守护进程,所有程序都在同一个JVM上执行。在独立模式下测试和调试MapReduce程序很方便,因此该模式在开发/作业阶段比较适合。
- 伪分布式(yarn)模式: Hadoop守护进程运行在本地机器上,模拟一个小规模的集群
- 全分布式(yarn)模式: Hadoop守护进程运行在一个集群上
3. 编译云盘程序
3.1. 源代码上传
- 源代码NetCloud.rar解压缩为一个文件夹NetCloud并上传至master主机
/root
3.2. 配置依赖
注意Linux的一般目录结构:
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.
- 环境变量(
/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
这些引用的指向,这个指向可以使用下面的命令改变
- 必须参考使用这篇的命令.
update-alternatives --install gen link alt pri [--slave sgen slink salt]
update-alternatives --remove name path
update-alternatives –-config java
从Sun被收购,Java分为
Oracle JDK
与OpenJDK
,2020使用较多是OpenJDK 8
,最新版是OpenJDK 14
.
- 对于一般的应用来说,他们还是去找系统的
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
注意
- Eclipse放置好之后还需要指定运行的jre,在
eclipse.ini
的顶部插入:
-vm
/usr/lib/jvm/jdk1.7.0_67/jre/bin
-
高版本的如
Mars
亲试不支持hadoop2x-eclipse-plugin-master
的New hadoop Location
;而低版本的可能不支持你的高版本java语法.最后只能选择Eclipse Luna -
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).
Map/Reduce(V2) Master:Address of the Map/Reduce master node (The Job Tracker). 原本的是
本机实际的是:
注意
- DFS Locations在
project explorer
中而不是package explorer
中,而且Eclipse对于窗口的隐藏做得”太好”,以至于可能需要多点几个按钮 - 这是一个好案例,但是个人依然可能因为某些原因Eclipse无法连接上Hadoop集群
注意
- 如果是在windows底下编译插件,还需要
hadoop.dll
和winutils.exe
17
- 如果遇到了
New Hadoop Location
失败,还需要加载woodstox-core-5.0.3.jar
和stax2-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 type
19
-
jar包冲突或缺失。查看项目中是否存在“XXX”所在的jar包,如果不存在,则导入对应jar包.导入jar包除了手动添加,可能某个
lib
文件夹下自带了. 如果存在,查看jar包是否冲突,如果冲突,删除其中一个。如果一切正常,则执行2方法。 -
jdk不存在或不匹配。项目环境要求jdk7,而eclipse中使用的却是jdk6;重新配置eclipse的jdk环境,使之与项目要求环境一致。
-
Eclipse查找项目类型策略所致。如果1和2没问题,但还是报错;这时,需要执行
“Project” | "Clean…"
,完成后,报错消失!
3.4. Rebulid~
为了提高validation的速度,可以通过
Preferences->Validation->Suspend all validators
直接禁止validation20.
- 导出
.war
文件
注意
- 推荐使用
Eclipse-jee
,自带导出war
功能
3.5. 修改配置
3.5.1. 修改数据库和集群IP
3.5.1.1. 修改连接数据库的IP
左侧视图,双击工程名NetCloud,可以打开工程结构,找到Java Resources 下的 src文件夹下的jdbc.properties
文件,打开,修改你的IP,同时记得添加编码信息(否则,可能会出现注册成功用户名后不能成功登陆的问题)
jdbc.properties
中的信息将会被applicationContext.xml
中的dataSource
Bean 所引用.
注意
本机地址一定是localhost
或127.0.0.1
,网卡所代表的本机地址可能无法使得数据库被连接上.进而报类似
这样的error,意即(mysql)服务器不响应.为了确保服务器可被正常连接并响应,可以用另一台客户机访问它21,如
(但是也有mysql22默认是拒绝127.0.0.1
之外的其他IP的,可以戳我看怎么远程连接mysql)
如果连不上可能是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,具体位置在:
3.6. 在tomcat 7 上运行23
4. 其他
如果的确未知原因连接不上hadoop集群,也可以shell或网页使用hdfs基本操作