0616-6.2.0-如何基于FTP的方式访问CDH中HDFS文件系统(续)

2019-05-14 14:27:41 浏览数 (1)

作者:余枫

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

0 人点赞