Hadoop硬实战--技术点1--Slurper的使用

已经存在的文件传输机制,如Flume、Scribe和ChuKwa,可以支持日志文件,那么如何传输其他格式的文件,如半结构化和二进制的文件?--使用HDFS File Slurper。

使用HDFS File Slurper(HFS)工具进行数据自动化导入导出HDFS中。Slurper可以读取存在于源目录中的任何文件,并选择性的通过一个脚本文件确定文件在目标目录中的位置,然后将文件写入目的地,之后经过一个验证,最后完成复制。原理图如下:

Hadoop硬实战--技术点1--Slurper的使用

Slurper的特点

1、  不能并行的写入部分文件,文件必须原子的导入。

2、  可以写入点号开头的文件名,点号会被Slurper忽略。

3、  Slurper可以保证被复制的文件的全局唯一性,如果被复制的文件不存在全局唯一性,那么Slurper会在HDFS中覆盖这个文件。


一、安装及设置

Hadoop硬实战--技术点1--Slurper的使用

也可以使用下载我上传的release 1.7版。直接tar即可。

https://download.****.net/download/mp412c/10465935

设置1:进入解压后的hdfs-slurper/conf目录下,编辑slurper-env.sh,设置JAVA_HOMEHADOOP_BIN目录,注意:这里的HADOOP_BIN需要定位到bin下的hadoop脚本文件。

#!/bin/bash

# The location of the main hadoop script

exportHADOOP_BIN=/home/apps/hadoop-2.6.4/bin/hadoop

export JAVA_HOME=/home/apps/jdk1.7.0_45

设置2:打开hdfs-slurper/conf目录下的slurper.conf这个文件包含源目录的目标目录的详细信息及其他选项

DATESOURCE_NAME = test  

被传输的数据日志名,通过linuxinit守护进程时被用作日志文件名

SRC_DIR = file:/tmp/slurper/in

数据源目录。输入到这里的任何文件都被自动的复制到目标目录(中间先被复制到临时目录)

WORK_DIR = file:/tmp/slurper/work

工作目录。来自数据源的文件在复制到目标目录前先复制到这里

COMPLETE_DIR = file:/tmp/slurper/complete

在复制完成后把文件从工作目录移到这里(file上)可通过REMOVE_AFTER_COPY设置可以被用于删除源文件,这时COMPLETE_DIR不可用。

ERROR_DIR = file:/tmp/slurper/error

复制中出现错误,源文件被移入这里

DEST_DIR = hdfs:/tmp/slurper/dest

源文件的目标目录,最终存放目录

DEST_STAGING_DIR = hdfs:/tmp/slurper/stage

临时目录。文件第一次被复制到hdfs时先复制到这里,等复制完后再移入DEST_DIR

运行:依据slurper.conf的配置好相应的文件夹

#touch /tmp/slurper/in/test.txt

#cd /home/apps/hdfs-slurper-0.1.8

# bin/slurper.sh --config-fileconf/slurper.conf

有以下提示,表示复制完成。

Hadoop硬实战--技术点1--Slurper的使用

查看可以文件成功复制。

# hadoop fs -ls /tmp/slurper/dest

Found 1 items

-rw-r--r--  3 root supergroup          02018-06-07 22:51 /tmp/slurper/dest/test.txt


二、动态目标路径设置

Slurper中配置文件slurper.conf中有个SCRIPT选项(与DEST_DIR互斥,只能使用一个),可以通过配置这个脚本实现动态的将源文件映射到目标文件。假设需要处理的文件名包含一个时间戳,且希望HDFS通过时间组织文件,先写一个python脚本

#!/usr/bin/python

import sys, os, re

# read the local file from standard input

input_file=sys.stdin.readline()

 

# extract the filename from the file

filename = os.path.basename(input_file)

 

# extract the date from the filename

match=re.search(r'([0-9]{4})([0-9]{2})([0-9]{2})',filename)

 

year=match.group(1)

mon=match.group(2)

day=match.group(3)

 

# construct our destination HDFS file

hdfs_dest="hdfs:/data/%s/%s/%s/%s"% (year, mon, day, filename)

 

# write it to standard output

print hdfs_dest,

然后配置slurper.conf

#DEST_DIR = hdfs:/tmp/slurper/dest

SCRIPT = /home/apps/hdfs-slurper-0.1.8/bin/sample-python.py

再次运行Slurper,有以下结果,可见文件被依照时间戳分类存放。

Hadoop硬实战--技术点1--Slurper的使用

Hadoop硬实战--技术点1--Slurper的使用


三、压缩验证选项

如果需要压缩HDFS中的文件,并验证文件的正确性,需要配置COMPRESSION_CODEC选项,它的值CompressionCodec类名也需要配置。Slurper也支持验证,在文件复制完成以后,Slurper会重读目标文件,并确保目标文件与源文件相互匹配。

配置slurper.conf,加入以下语句:

COMPRESSION_CODEC = org.apache.hadoop.io.compress.SnappyCodec

VERIFY = true

注意:这里需要提前配置Snappy

重新运行Slurper,即可发现复制后的文件是压缩后的带有.snappy的文件。


四、连续操作

为了让Slurper可以以守护进程的方式工作,不停的搜索需要传输的文件,可以使用bin/slurper-inittab.sh这个脚本(它被设计成使用inittab复位)。


小结

Slurper是将本地数据导入到HDFS的好工具,还支持将数据从HDFS中导出到本地,在MapReduce不能直接访问文件系统的情况下,且被传输的文件不能被Flume这样的工具处理时,Slurper将很有用~。