weixin_64474141 2023-08-25 16:48 采纳率: 100%
浏览 14
已结题

关于使用Java实现注册功能以及将数据存到Hadoop的HDFS中遇到的问题(相关搜索:大数据|用户注册)

在自学Hadoop的HDFS时,我学会了如何将整合好的数据传入HDFS中。(即将大数据文本上传到HDFS中)

img

但是HDFS目前不支持并发多用户对同一文件进行写操作。如果注册账号的话,我的想法是,每一名用户对应一个目录,比如说用户A对应HDFS中的目录/A,用户B对应/B,用户A是不能操作用户B的文件目录的,这样就实现了用户之间的隔离性,确保每位用户访问到的是自己的资源,避免了并发多用户对同一文件进行写操作。
那么问题来了,如果我要统计用户注册数据量时,如何进行统计呢?我的假设是使用Hive进行Select统计,有个关系表用于记录用户个人信息,在注册的同时将该信息上传到HDFS的这个关系用户表。如果用户A与用户B同时注册不就违反了“HDFS目前不支持并发多用户对同一文件进行写操作”这一原则吗?
请问该如何解决上述问题,或者有其他更好的思路解决上述问题?

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-25 19:37
    关注

    【以下回答由 GPT 生成】

    首先,对于HDFS不支持并发多用户对同一文件进行写操作的问题,可以考虑使用HBase来存储用户注册数据。HBase是一个适合随机读写的NoSQL数据库,可以支持高并发访问,解决了HDFS的限制。

    为了实现用户注册功能,可以按照以下步骤进行:

    1. 创建一个HBase表来存储用户注册数据,包括用户的个人信息。可以使用HBase的Java API来操作表。
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Admin;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.client.Table;
    import org.apache.hadoop.hbase.util.Bytes;
    
    public class UserRegistration {
        private static final String TABLE_NAME = "user_registration"; // 表名
        private static final String CF_INFO = "info"; // 列族名
        private static final String QUALIFIER_USERNAME = "username"; // 用户名列
    
        public static void main(String[] args) {
            // 创建HBase配置
            Configuration configuration = HBaseConfiguration.create();
            configuration.set("hbase.zookeeper.quorum", "localhost"); // 设置ZooKeeper地址
    
            try {
                // 创建HBase连接
                Connection connection = ConnectionFactory.createConnection(configuration);
                Admin admin = connection.getAdmin();
    
                // 检查表是否存在,如果不存在则创建表
                if (!admin.tableExists(TableName.valueOf(TABLE_NAME))) {
                    admin.createTable(createTableDescriptor());
                }
    
                // 获取表
                Table table = connection.getTable(TableName.valueOf(TABLE_NAME));
    
                // 注册用户
                registerUser(table, "userA");
                registerUser(table, "userB");
    
                // 关闭连接
                table.close();
                connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        // 创建表的描述符
        private static TableDescriptor createTableDescriptor() {
            ColumnFamilyDescriptor cfd = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(CF_INFO)).build();
            return TableDescriptorBuilder.newBuilder(TableName.valueOf(TABLE_NAME)).setColumnFamily(cfd).build();
        }
    
        // 注册用户
        private static void registerUser(Table table, String username) throws IOException {
            // 构建Put对象,并指定行键
            Put put = new Put(Bytes.toBytes(username));
    
            // 添加列值
            put.addColumn(Bytes.toBytes(CF_INFO), Bytes.toBytes(QUALIFIER_USERNAME), Bytes.toBytes(username));
    
            // 插入数据
            table.put(put);
        }
    }
    
    1. 使用Hive进行统计,可以通过Hive的SQL语句来查询HBase中的数据并进行统计,不需要直接操作HDFS。
    CREATE EXTERNAL TABLE user_registration
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES (
        "hbase.columns.mapping" = ":key,info:username"
    )
    TBLPROPERTIES ("hbase.table.name" = "user_registration");
    
    SELECT COUNT(*) FROM user_registration;
    

    其中,创建了一个与HBase表关联的外部表,并设置了表名及列族和列的映射关系。通过执行上述SQL语句可以统计用户注册数据量。

    1. 由于HBase支持高并发访问,所以同时注册用户A和用户B并不会违反"HDFS目前不支持并发多用户对同一文件进行写操作"的原则。

    通过如上方式,可以实现用户注册功能,并使用HBase存储数据,并使用Hive进行统计查询。这样每个用户都有自己的资源目录,避免了并发多用户对同一文件进行写操作的问题,并且可以方便地统计注册数据量。



    【相关推荐】


    • 这篇博客: HDFS编程实战中出现的问题中的 总结:这是我学习大数据技术的第一个编程实践,很曲折,明明是按照视频教学里的步骤来的,结果还是各种错,虽然最后以空间(导入所有的jar包)换取了正解,但中间对异常的分析思路是自己在找bug技术上的一次突破。回去看看,其实这个实践的重点在第8个问题中,至于为什么视频教学里老师只导入一个jar包就可以正常执行程序,而我需要导入所有的jar包才行,这个问题我也没有找到答案,可能是视频中的某些细节我没有注意到吧,有时间再回去看看!也希望有机会看到这篇博文的朋友能提点一下。 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月2日
  • 已采纳回答 8月25日
  • 修改了问题 8月25日
  • 创建了问题 8月25日

悬赏问题

  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥100 解决数据不连续出现问题
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误