`

hbase rowkey设计之hash的使用和md5的使用

 
阅读更多

 

 

在组拼hbase rowkey时,为了防止热点,rowkey可以使用 md5方式或者hash方式,

这里介绍下  hash方式:

 

0 work_regionmax_student=10000

1 hashfun (stu.class_id, ${work_regionmax_student}) 

2 hashfun : hashfun(string, int) 获取string的hashcode,根据int取余并补全位数

3 自定义函数中的写法:



import org.apache.hadoop.hive.ql.exec.UDF;

/**

 * Created by zm on 16/6/30.

 */

public class CreateHashId extends UDF {

    public String evaluate(String value, long number){



        if (value == null || value.toString().equals("") || number < 1 ){

            return null;

        } else {

            long result = Math.abs(value.hashCode()%number);

            System.out.println("result: " + result );

            int formatLength = String.valueOf(number-1).length();

            System.out.println("formatLength: " + formatLength );

            String newString = String.format("%0" + formatLength + "d", result); // 用十进制0来填补

            return newString;

        }

    }



    //test

    public static void main(String [] args) {

        CreateHashId testid = new CreateHashId();

        //System.out.println(testid.evaluate("010f5ae14d604b729456009a4c806bc0", 10000)); 

         /**

          *  结果:

        result: 3754

        formatLength: 4

        3754

          */



        System.out.println(testid.evaluate("01110158d9f041f6a9c75520f3e91b53", 10000)); 

        /**  结果

        result: 27

        formatLength: 4     如果result的值是4位,那么 String.format("%0" + formatLength + "d", result);的操作没用 ,否则 result前面不够4位就用0填充

        0027

         */



    	/*String test = "tmp_dm_dm_evaluation_school_grade_teacher_kp_rank_distribution_teacher_kp_mastered_count_incountyrank_allsubjectlist_20170416_semester";

    	System.out.println(test.length());*/

    }

}

 

 

这里介绍下md5的使用:

 

import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
import org.apache.hadoop.hive.ql.exec.UDF;

/**
 * 转换md5
 * Created by pc on 2016/12/23.
 */
public class MD5 extends  UDF{

        public String evaluate (String userId){
            return Hashing.md5().hashString(userId, Charsets.UTF_16LE).toString();
        }

    public static void main(String[] args) {
        String str1="{\"actId\":\"1600005\",\"classId\":\"e291a2698c0a4c60a1af41d7dc40fe50\",\"className\":\"四年级(1)班\",\"countyId\":\"370725\",\"countyName\":\"昌乐县\",\"gradeId\":\"4\",\"originCode\":\"2\",\"role\":\"STUDENT\",\"schoolId\":\"460958\",\"schoolName\":\"昌乐行知双语实验学校\",\"time\":1511059347806,\"userIcon\":\"de28f0bde3800375c3cf23fc7d03d0bc\",\"userId\":\"38085844\",\"userIp\":\"111.37.45.234\",\"userName\":\"孙豪章\",\"data\":{\"workMode\":2,\"publishClassType\":1,\"subjectName\":\"昌乐行知双语实验学校\",\"questionId\":\"tch_a285a3cb93bb4695b018b4e58e6a4ee2_v1_WT_3\",\"subjectId\":\"110\",\"workId\":\"172630abe0a949018b00fad7d80673cc\",\"publishClassId\":\"e291a2698c0a4c60a1af41d7dc40fe50\",\"unitId\":\"110002001065100001001\"}}";

        String str2="{\"actId\":\"1600005\",\"classId\":\"e291a2698c0a4c60a1af41d7dc40fe50\",\"className\":\"四年级(1)班\",\"countyId\":\"370725\",\"countyName\":\"昌乐县\",\"gradeId\":\"4\",\"originCode\":\"2\",\"role\":\"STUDENT\",\"schoolId\":\"460958\",\"schoolName\":\"昌乐行知双语实验学校\",\"time\":1511059347806,\"userIcon\":\"de28f0bde3800375c3cf23fc7d03d0bc\",\"userId\":\"38085844\",\"userIp\":\"111.37.45.234\",\"userName\":\"孙豪章\",\"data\":{\"workMode\":2,\"publishClassType\":1,\"subjectName\":\"昌乐行知双语实验学校\",\"questionId\":\"tch_a285a3cb93bb4695b018b4e58e6a4ee2_v1_WT_3\",\"subjectId\":\"110\",\"workId\":\"172630abe0a949018b00fad7d80673cc\",\"publishClassId\":\"e291a2698c0a4c60a1af41d7dc40fe50\",\"unitId\":\"110002001065100001001\"}}";


        Hashing.md5().hashString(str1, Charsets.UTF_16LE).toString();
        System.out.println( Hashing.md5().hashString(str1, Charsets.UTF_16LE).toString()+":"+ Hashing.md5().hashString(str2, Charsets.UTF_16LE).toString());
    }
}

 

 

分享到:
评论

相关推荐

    网易视频云技术分享_HBase优化实战.pdf

    解决方法是尽量以 hash 或者 md5 等开头来组织 rowkey,使每段时间的 rowkey 访问都是均匀的。 3. 数据分布不均问题:HBase 的数据分布不均匀,导致某些 RegionServer 的请求数量非常高,而其他的请求数量非常低。...

    Hbase性能优化百科全书(csdn)————程序.pdf

    在HBase性能优化的过程中,表设计和RowKey的设计是至关重要的。预分区是表设计的一个重要环节,目的是避免因表的自动split导致的资源消耗和性能影响。预分区可以根据业务需求预先设定rowkey的范围,比如在例子中,...

    HBase专场:AliHBase的SQL实践与改进(天穆 ).pdf

    二是采用分桶策略(Bucketing),通过计算rowkey的MD5值对bucket数量取模,将数据分布到不同的桶中。这种方式保证了数据在桶内的有序性,但在桶间无序,同样在进行范围查询时需要并发扫描多个桶并进行客户端的merge ...

    基于HBase和SimHash的大数据K-近邻算法简

    针对大数据K-近邻(K-nearest neighbors,K-NN)计算复杂度高的问题,提出一种基于HBase和Sim Hash的大数据K-近邻分类算法。利用Sim Hash算法将大数据集从原空间映射到Hamming空间,得到哈希签名值集合;将样例的行键与值...

    HBase专场:HBase在大搜车金融业务中的应用实践(客户-申玉宝).pdf

    此外,还设计了GPS.GATHERPOINTS表,用于存储聚集点数据,其ROWKEY由时间戳和GeoHash的前6位字符的反转组成,方便对聚集点进行索引和查询。 ### 总结 HBase在大搜车金融业务中的应用表明,该数据库系统非常适合处理...

    HBase在大搜车金融业务中的应用实践

    HBase在存储结构设计上支持行键(rowkey)的设计,这对于提高查询效率非常关键。例如,在GPS数据表中,可以通过设备ID和时间戳来设计行键,实现数据的有序存储,这对于查询特定时间或特定设备的数据十分有用。 最后,...

    HBase在打车出行的应用实践.pdf

    - 模型训练时,先在5分钟内从HBase读取所有城市数据,然后在25分钟内完成模型训练,RowKey设计为盐分+城市ID+类型+时间戳,方便高效访问和更新。 - 训练结果每隔一段时间持久化到HDFS,以便新模型的验证和测试。 总...

    HBase在打车出行的应用实践.pptx

    - 实时查询订单状态,使用逆序的订单ID和时间戳作为Rowkey,保证写入效率。 - 客服系统的历史订单查询,Redis缓存最近的订单,Redis不可用时,直接查询HBase。 - 离线分析订单状态,满足大量事件的读取和5s内的...

    阿里面试问题总结.pdf

    41. **HBase RowKey设计**:设计合理的RowKey可实现数据均匀分布,减少热点。 42. **TCP三次握手与四次挥手**:描述ACK、FIN、序号的作用及状态转换。 43. **垃圾收集**:理解不同GC算法,如Minor GC、Major GC、...

    深圳校区大数据技术之企业真题V1.1.0.doc

    解决方法包括合理设计RowKey,使用Zone Replication,或者动态调整Region大小。 12. **Flink 恢复机制**:当Flink任务挂掉时,基于检查点的恢复流程会从最近的检查点重新启动任务,确保状态一致性。 13. **SQL ...

    海量非结构化数据管理方案.docx

    在技术架构的使用和场景分析中,NAS适合快速部署的业务,DFS提供了接口方便读写,特别是支持POSIX接口的DFS。对象存储通常不支持POSIX,而是通过HTTP等7层接口进行操作,适合跨IDC或全球的数据存储,提供高可靠性但...

    海量非结构化数据的高效管理.docx

    - Hbase的优化涉及预分配region、rowkey设计和底层配置参数调整。 对于分布式文件系统,例如HDFS,要注意元数据管理、存储节点性能、存储网络性能和客户端支持。这包括元数据服务器的复制结构、硬件配置、处理线程...

    阿里面试问题总结.docx

    - **主要内容**:为了使数据均匀分布,需合理设计rowkey,考虑数据访问模式和分布策略。 - **考察点**:NoSQL数据库基础知识、HBase使用经验。 #### 分布式知识 - **主要内容**:包括但不限于分布式事务处理、一致...

Global site tag (gtag.js) - Google Analytics