作者:余枫
1
文档编写目的
Fayson在前面的文章《0598-6.2.0-如何基于FTP的方式访问CDH中HDFS文件系统》介绍了使用Maven编译hdfs-over-ftp并部署实现通过FTP的方式访问CDH集群。前面文章需要在有网络和Maven的环境下启动服务,为了满足离线环境下使用FTP服务访问CDH,本篇文章主要介绍如何将hdfs-over-ftp工程打包为一个可离线部署的服务。
- 测试环境
1.CM和CDH版本为6.2.0
2.集群未启用Kerberos
2
工程依赖包准备
在前面已经准备好了Maven和Java环境,这里就不在重复说明了。
1.在自己本地的编译环境下,进入到hdfs-over-ftp工程的根目录下,使用maven命令导出工程依赖的Jar包至指定的目录下
代码语言:javascript复制mvn dependency:copy-dependencies -DoutputDirectory=C:Users80996Desktoplib
2.前面也执行过maven clean package命令编译过hdfs-over-ftp工程,在工程的target目录下找到编译好的hdfs-over-ftp-1.0.jar包,将编译好的hdfs-over-ftp-1.0.jar包拷贝至上一步导出工程依赖包的lib目录下。
3
打包服务运行脚本
在这一步Fayson主要使用shell脚本封装一个可以运行hdfs-over-ftp Java服务的的应用,目录结构如下:
目录结构说明:
bin: 目录主要用于存放hdfs-over-ftp服务启动的shell脚本。
conf:目录主要用于存放hdfs-over-ftp服务需要的配置文件。
lib:目录主要用于存放hdfs-over-ftp服务需要的依赖包及hdfs-over-ftp编译的包。
logs:目录主要用于存放服务运行的日志及pid文件。
如下具体说明下几个关键目录下的文件:
1.bin目录下就只有hdfs-over-ftp-run.sh脚本,脚本内容如下:
代码语言:javascript复制#! /bin/bash
DIR=`dirname $0`
cd $DIR/..
DIR=`pwd`
CLASSPATH=$CLASSPATH:$DIR/conf:$DIR$DIR/data
for i in $DIR/lib/*.jar; do
CLASSPATH=$CLASSPATH:$i;
done
MAINCLASS=org.apache.hadoop.contrib.ftp.HdfsOverFtpServer
XMX=8g
XMS=8g
LOGDIR=$DIR/logs
mkdir -p $LOGDIR
PIDFILE=$LOGDIR/hdfs-over-ftp.pid
OUTFILE=$LOGDIR/hdfs-over-ftp.out
#OPT="-Dport=19998 -Dservers=h1:9092,h2:9092,h3:9092 -Dtopic=oneTopic"
start(){
echo "start hdfs-over-ftp server..."
if [ -e $PIDFILE ]; then
pid=`cat $PIDFILE`
find=`ps -ef | grep $pid | grep -v grep | awk '{ print $2 }'`
if [ -n "$find" ]; then
echo "hdfs-over-ftp server has already been start."
exit
fi
fi
nohup $JAVA_HOME/bin/java -cp $CLASSPATH -Xmx${XMX} -Xms${XMS} $MAINCLASS </dev/null 2>&1 >> $OUTFILE &
echo $! > $PIDFILE
if [ -e $PIDFILE ]; then
pid=`cat $PIDFILE`
find=`ps -ef | grep $pid | grep -v grep | awk '{ print $2 }'`
if [ -n "$find" ]; then
echo "hdfs-over-ftp is stared"
exit
fi
fi
echo "start hdfs-over-ftp fail"
}
stop() {
echo "stop hdfs-over-ftp server..."
if [ -e $PIDFILE ]; then
pid=`cat $PIDFILE`
find=`ps -ef | grep $pid | grep -v grep | awk '{ print $2 }'`
if [ -n "$find" ]; then
kill -9 $find
while [ -n "`ps -ef | grep $pid | grep -v grep | awk '{ print $2 }'`" ]; do
sleep 1;
done
echo "ok"
exit
fi
fi
echo "no hdfs-over-ftp server found"
}
case "$1" in
start)
start
;;
stop)
stop
;;
*)
echo "Usage: hdfs-over-ftp-run.sh {start|stop}"
esac
2.conf目录主要涉及到三个配置文件users.properties、hdfs-over-ftp.properties和log4j.properties
hdfs-over-ftp.properties配置文件内容如下,根据需要修改为自己集群的信息
代码语言:javascript复制#uncomment this to run ftp server
port = 2222
data-ports = 2223-2225
#uncomment this to run ssl ftp server
#ssl-port = 2226
#ssl-data-ports = 2227-2229
# hdfs uri
hdfs-uri = hdfs://cdh01.fayson.net:8020
# have to be a user which runs HDFS
# this allows you to start ftp server as a root to use 21 port
# and use hdfs as a superuser
superuser = agladyshev
log4j.properties内容如下:
代码语言:javascript复制log4j.rootLogger=DEBUG, R
log4j.appender.R=org.apache.log4j.ConsoleAppender
#log4j.appender.R=org.apache.log4j.RollingFileAppender
#log4j.appender.R.File=log/ftpd.log
#log4j.appender.R.MaxFileSize=100MB
#log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern= %d : %p : %c{1} : %m%n
users.properties配置文件内容如下,根据需要自己修改
代码语言:javascript复制ftpserver.user.firstuser.userpassword=310dcbbf4cce62f762a2aaa148d556bd
ftpserver.user.firstuser.homedirectory=/
ftpserver.user.firstuser.enableflag=true
ftpserver.user.firstuser.writepermission=true
ftpserver.user.firstuser.maxloginnumber=0
ftpserver.user.firstuser.maxloginperip=0
ftpserver.user.firstuser.idletime=0
ftpserver.user.firstuser.uploadrate=0
ftpserver.user.firstuser.downloadrate=0
ftpserver.user.firstuser.groups=firstuser,users
ftpserver.user.agladyshev.userpassword=310dcbbf4cce62f762a2aaa148d556bd
ftpserver.user.agladyshev.homedirectory=/
ftpserver.user.agladyshev.enableflag=true
ftpserver.user.agladyshev.writepermission=true
ftpserver.user.agladyshev.maxloginnumber=0
ftpserver.user.agladyshev.maxloginperip=0
ftpserver.user.agladyshev.idletime=0
ftpserver.user.agladyshev.uploadrate=0
ftpserver.user.agladyshev.downloadrate=0
ftpserver.user.agladyshev.groups=agladyshev,users
4
部署测试
将上面打包好的脚本上传至服务器上,确保运行hdfs-over-ftp服务的服务器是可以访问CDH集群。
1.进入bin目录中,启动脚本,启动命令:sh hdfs-over-ftp-run.sh start,下图显示启动成功。
查看日志,显示启动成功
查看对应的进程,进程正常
2.通过FTP工具进行访问,访问成功
5
总结
1.在无网络环境下运行,需要提前准备好依赖的jar包,以免运行时出现找不到包的异常。
2.在脚本完成后,不需要Maven工具,脚本中会通过Java命令行的方式运行工具。
Git地址如下:
https://github.com/fayson/cdhproject/tree/master/hdfs-over-ftp-run