**123网盘技术文档**

1,背景:
刚刚学习了hdfs,以及HBase等框架,为了加深理解,特以此网盘小项目作为试炼。
2,简介
123网盘项目主要模仿市面上的网盘的一些基本功能,舍弃了页面,交互等高级的应用功能,以练习基础为出发点,自我开发设计,主要实现了的功能有:

  1. 登陆、注册
  2. 显示文件信息
  3. 内存空间计算
  4. 上传
  5. 下载
  6. 创建目录
  7. 删除文件

3,技术选型
主要依托:

  • 大数据与云计算基本框架(hdfs,HBase)
  • python36
    主要区别与一般的输入\输出流程序,在此用分布式的技术和思想解决网盘的问题
    4,架构
    123网盘技术文档
    5,数据库设计方案
    (1)用户信息表
    –表名:user
    –列簇:c
    –行键:rowkey = userName
    –列名设计策略如下表:
    123网盘技术文档
    标题

(2)文件信息表
–表名:files_info
–列簇:c
–行键:rowkey = userName

  • 行键为该用户的用户名,该用户的所有文件信息均存储在该行键

–列名设计策略如下表:

列名 value(string)
filename(各个文件的文件名) path(该文件存储路径)

–行键:rowkey = userName.size

  • 行键为该用户的用户名.size,该用户的所有文件的大小均存储在该行键

–列名设计策略如下表:

列名 value(string)
filename(各个文件的文件名) size(该文件存储路径)

6,详细代码以及描述:

  1. 连接hbase,hdfs
from hbase import Hbase
from thrift.protocol import TBinaryProtocol
from thrift.transport import TSocket, TTransport
# 连接hbase
def hbase_con():
    # hbase服务器地址
    socket = TSocket.TSocket("192.168.153.201", "9090")

    # socket.setTimeout(500)
    # 永字节流的数据进行请求
    transport = TTransport.TBufferedTransport(socket)
    # 通信协议
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    # 客户端连接
    client = Hbase.Client(protocol)
    socket.open()
    return client
from hdfs.client import Client
hdfs_client = Client("http://192.168.153.201:50070",root="/")
  1. 登陆、注册
def zhuce():
    user = input("用户名:")
    pwd = input("密码:")
    write_hbase("user",user,user)
    write_hbase("pwd", pwd, user)
    hdfs_client.makedirs("/user_data/%s"%(user),permission=777)
    print("注册成功")

def login():
    user = input("请输入用户名:")
    pwd = input("请输入密码:")
    if len(hbase_client.getRow("users",user)) != 0 :
        pwd1 = hbase_client.getRowWithColumns("users", user, ["c:pwd"])[0].columns.get("c:pwd").value
        if pwd == pwd1:
          print("登陆成功!")
          return user
        else:
            print("密码错误,请重新输入")
            login()
    else:
        print("用户名错误")
        login()

  1. 显示文件信息

  2. 内存空间计算

def count_size_all(user):
    size_sum = 0
    size_list = login.hbase_client.getRow("files_info","%s.size"%user)
    values = list(size_list[0].columns.values())
    for rrow in values:
        size = rrow.value
        size_sum += int(size)
    return int(size_sum/1024/1024)
  1. 上传
def upload(user):
    path_local = input("请输入上传文件的路径(绝对路径):")
    file_name = input("请输入文件名:")
    path_hdfs = "/user_data/%s/%s" % (user, file_name)
    login.hdfs_client.upload(path_hdfs, path_local, overwrite=True)
    login.write_hbase_files(file_name, path_hdfs, user)
    value = str(os.path.getsize(path_local))
    login.write_hbase_files(file_name, value, "%s.size" % user)
    print("上传成功!")
  1. 下载
def download_file(user):
    path_local = input("请输入下载文件到本地的路径(绝对路径):")
    file_name = input("请输入需要下载的文件名:")
    path_hdfs = "/user_data/%s/%s" % (user, file_name)
    login.hdfs_client.download(path_hdfs, path_local, overwrite=True)

    print("下载成功!")
  1. 创建目录
def hdfs_mkdir(user,mkdir_name):
    # mkdir = input("请输入你需要创建的文件夹(英文):")
    login.hdfs_client.makedirs("/user_data/%s/%s"%(user,mkdir_name))
    print("文件夹创建成功!")
  1. 删除文件
def delete_file(user):
    file_name = input("请输入需要删除的文件:")
    path_hdfs = "/user_data/%s/%s" % (user, file_name)
    login.hdfs_client.delete(path_hdfs, recursive=False)

    print("删除成功!")

相关文章:

  • 2021-10-04
  • 2021-07-09
  • 2022-03-01
  • 2021-11-03
  • 2022-12-23
  • 2022-02-09
  • 2022-01-11
猜你喜欢
  • 2021-12-18
  • 2022-01-02
  • 2022-12-23
  • 2022-01-05
  • 2021-04-14
  • 2021-10-16
  • 2021-10-05
相关资源
相似解决方案