本来初期打算用Hadoop 2,可是后来有限的服务器部署了Solr Cloud,各种站点,发现资源不够了,近10T的文件,已经几乎把服务器的磁盘全部用光。想来想去,由于目前架构基于Scala的,所以还是用Scala Akka实现了一个简单版本的分布式文件系统。

Scala版本是2.10.3:http://www.scala-lang.org,Akka版本是2.2.3:http://akka.io。

所有文件随机放在不同的服务器上,在数据库中记录了文件存放的服务器IP地址、文件路径。在服务端部署基于Akka的简单文件服务,接收文件路径,读取并返回文件内容。调用者根据文件地址,去数据库中查找文件的服务IP地址和文件路径,根据得到的服务器IP地址,传入文件路径,调用该服务器的文件服务。

以下是部分实现代码。

1.文件服务参数

 case class PatentFulltextArgs(
val url: String,
val start: Int,
val size: Int) { }

2.文件服务Trait(有点像WCF中的服务契约)

 trait PatentFulltextService {
def find(args: PatentFulltextArgs): Array[Byte]
}

3.文件服务实现

 class PatentFulltextServiceImpl extends PatentFulltextService with Disposable {
def find(args: PatentFulltextArgs): Array[Byte] = {
val list = ListBuffer[Byte]()
val file = FileSystems.getDefault().getPath(args.url) using(Files.newInputStream(file)) { in =>
{
val bytes = new Array[Byte](args.size + 1)
in.skip(args.start)
in.read(bytes, 0, bytes.length) list ++= bytes
}
} list.toArray
}
}

4.用户Akka Deploy发布的类

class ServiceApplication extends Bootable {
val system = ActorSystem("serivce", ConfigFactory.load.getConfig("service"))
def startup() {
TypedActor(system).typedActorOf(TypedProps[PatentFulltextServiceImpl], "patentfulltext")
} def shutdown() {
system.shutdown
}
}

在这里,我使用的Akka的TypeActor,请参考:http://doc.akka.io/docs/akka/2.2.3/scala/typed-actors.html。

以下是部署过程。

把生成的jar包,发布在Akka的deploy目录下,根据需要修改Akka的配置文件目录config下的application.conf。以下是我配置的内容,仅供参考:

actor {

provider = "akka.remote.RemoteActorRefProvider"

typed {

# Default timeout for typed actor methods with non-void return type

timeout = 6000s

}

}

remote {

transport = "akka.remote.netty.NettyRemoteTransport"

netty.tcp {

hostname = "服务端IP"

port = 2552

}

客户端使用时只需要服务契约Trait和相关实体类,以下是我写的一个客户端调用的类,仅供参考:

 object RemoteService {
val logger = LoggerFactory.getLogger(this.getClass())
private var system: ActorSystem = null def apply(configFile: String) = {
system = ActorSystem("RemoteService", ConfigFactory.parseFile(new File(configFile)))
} def findPatentFulltext(serverIp: String, patentFulltextArgs: PatentFulltextArgs) = {
TypedActor(system).typedActorOf(TypedProps[com.cloud.akka.service.model.PatentFulltextService], system.actorFor("akka.tcp://serivce@" + serverIp + ":2552/user/patentfulltext")).find(patentFulltextArgs) } def shutdown = {
if (null != system) system.shutdown()
}
}}

以下问题是我还没找到合适的解决办法:

1.Akka无法传输大文件,即使修改配置,服务器可以返回,但是接收的客户端还会报错。我的解决方案是在客户端分块读取,然后合并。

2.在客户端使用时,TypedActor没有找到使用ActorSelection构建,因为ActorFor是标记为Deprecated。

用Akka构建一个简易的分布式文件系统的更多相关文章

  1. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  2. docker构建一个简易镜像

    一 下载centos镜像 docker pull centos 二 启动镜像 [root@Centos-node3 ~]# docker run -it --name my_ng centos bas ...

  3. 构建Mogilefs分布式文件系统(配置篇)

    构建Mogilefs分布式文件系统:  当下互联网飞速发展,海量并发所产生的数据量以几何方式增长,随着信息链接方式日益多样化,数据存储的结构也发生了变化,在这样的压力下我们不得不重新审视大量数据的存储 ...

  4. 【整理学习Hadoop】H D F S 一个分布式文件系统

    Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时,它和其他的分布式文件系统的区别 ...

  5. 分布式文件系统 ~MogileFS~

    一.分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连,也就是集群文件系统,可以支持 ...

  6. 分布式存储之MogileFS分布式文件系统简单应用

    一.分布式存储原理: 分布式存储系统,是将数据分散存储在多台独立的设备上.传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储 ...

  7. Docker来搭建分布式文件系统FastDfs

    对于文件存储来说,一般情况下简单的处理就是在Django配置文件中配置存储目录,按照规则对文件进行上传或者下载. 实际上,当文件较少的时候,Django是可以应付的过来的.但当文件以海量形式出现的时候 ...

  8. 云存储?不依赖三方服务自己也可以搞,利用Docker来搭建分布式文件系统FastDfs

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_78 对于文件存储来说,一般情况下简单的处理就是在Django配置文件中配置存储目录,按照规则对文件进行上传或者下载. 实际上,当文 ...

  9. MogileFS 的介绍(MogileFS 系列1)[分布式文件系统]

    MogileFS 是一个开源的分布式文件系统,用于组建分布式文件集群,由 LiveJournal 旗下 Danga Interactive 公司开发,Danga 团队开发了包括 Memcached.M ...

随机推荐

  1. 使用Git 管理heroku的项目(windows)

    此过程与管理github中的项目类似,即是普通的git配置 安装 Heroku Toolbelt, 里面包含了 msygit Foreman,以及heroku的命令行界面 1.首先在heroku上新建 ...

  2. 介绍 ASP.NET Identity - ASP.NET 应用程序的成员身份认证系统

    ASP.NET Identity 是构建 ASP.NET web 应用程序的一种新的身份认证系统.ASP.NET Identity 可以让您的应用程序拥有登录功能,并可以轻松地自定义登录用户的相关数据 ...

  3. scala 删除一个文件夹以及其子目录和文件

    /** * 删除一个文件夹,及其子目录 @param dir */ def deleteDir(dir: File): Unit = { val files = dir.listFiles() fil ...

  4. angular 响应式表单指令

    响应式表单都是以 form开头的指令 第一列指令(不以name结尾)在html模版中,用 [ ] 第二列指令(以name结尾)在html模版中,不用 [ ]

  5. WP8.1StoreApp(WP8.1RT)---发送邮件和短信

    在WP7/8中,发送短信是利用了EmailComposeTask和SmsComposeTask来实现的. 在WP8.1 Store App中,原来的方式已经失效,采用了新的方法:ChatMessage ...

  6. webshell在php方向的研究(精华篇)

    文章主旨:准备学习c语言,你喜欢的所有干货在文末附件里 作者宗旨:没有不想当将军的兵,没有不想提高技术的person,今天带你打开php的研究之路. 本文作者:Laimooc(原名xoanHn),个人 ...

  7. 爬虫实战2:爬头条网美图--Ajax图片加载处理

    完整代码经测试可成功运行,目的是抓取头条网输入街拍后的图片,涉及的知识点如下 1. md5加密使用方法 方法1:不创建实例对象,直接使用 >>> from hashlib impor ...

  8. 考试题 T1

    题意分析 就是让你求 \[\sum_{i=1}^{|S|}val[i][gcd(a[i],x)=y]\] 那么接下来就是化简式子 \[\sum_{i=1}^{|S|}val[i][gcd(\frac{ ...

  9. c语言求方阵的行列式、伴随矩阵算法

    #include<stdio.h> #include<math.h> #define N 100 //N比输入的阶数大即可 int main() {   int n,a[N][ ...

  10. 隔离python 运行环境和Pycharm 设置代码同步

    隔离python 运行环境 查看当前有哪些虚拟环境:workon 进入虚拟环境:workon django 退出虚拟环境:deactivate 创建虚拟环境: mkvirtualenv -p /usr ...