华能 + Alluxio | 数字化浪潮下跨地域数据联邦访问与分析

0
0
{"value":"![image.png](https://dev-media.amazoncloud.cn/72debf5c5a0c4f9da7119d1a43818db6_image.png)![image.png](https://dev-media.amazoncloud.cn/69f109182c60442980ac8b4b417eca2d_image.png)\n# 1. 数字化转型与国产化进程推进\n为了响应国家“十四五”数字经济发展规划的号召,中国企业推动创新资源共建共享,促进创新模式开放化演进,在信息化、数字化、智能化的强烈需求下,中国龙头企业统筹全渠道的技术能力,逐渐形成了一套覆盖集团业务发展、经营管理等核心发展战略需要的战略方向。\n\n数字化转型初见成效,数据能力不断挖掘与创新;大数据技术推陈出新,国产化步伐日益加快。无论是互联网企业还是传统行业下的领导企业,有什么数据,如何使用数据,如何更加智能地利用数据这些议题被不断挖掘与迭代。\n\n在东数西算的理念下,数据跨平台、跨机房、跨地域的技术问题与挑战逐渐浮现出来。这篇文章我们主要从技术的角度,对跨地域的数据联邦,或者说总公司和分公司不同数据域的互联互通进行讨论,研究相关技术可行性与分享整个研究过程。为了加快国产化软硬件的推进,本次实践采用国产化硬件ARM服务器(鲲鹏920)以及国产化操作系统统信进行相关的技术验证。\n\n# 2. 原型目标与设计\n通过对跨地域数据联邦的调研,我们发现中国很多企业面临的业务挑战虽然不同,但是技术难点是相似的,主要有:\n\n**挑战一**:总公司通过传统的ETL作业采集分公司数据(比如通过Informatica、Kettle、DataX等),这些作业往往是按需定制,并且定期执行的;当有新的数据合规要求或者总公司数据分析要求时,都需要进行定制开发、测试、部署,这对数据汇总的时效性带来了很大的负面影响。另外通过ETL作业采集的分公司数据,在遇到分公司数据更新时,非常容易造成总公司与分公司之间的数据不一致,导致分析结果有所纰漏。\n\n**挑战二**:子公司的自助式查询,一方面是对总公司的数据申请,很多时候整个数据访问链路是断裂的,往往需要通过流程筛查、繁琐的数据同步手段进行(比如通过FTP传输,甚至是物理介质的长途运输)。考虑到数据安全以及国家审计合规的要求,总公司数据是否可以在子公司持久化存储、数据访问脱敏、权限管控等等也都是当前中国企业面临的具体技术挑战。\n\n**因此我们本次的研究主要会关注在数据流的双向流动方面。**\n\n## 2.1 研究原型技术选型\n当前大数据技术已经成为企业内部典型的数据分析手段,因此在原型实现的过程中,我们主要使用开源的大数据技术,从存储、计算(分析)、编排3个维度进行选型。其中每个维度我们选择时下最主流的组件,以确保该原型的通用性。\n\n数据存储:\n\n√ HDFS:Hadoop分布式文件系统(Distributed File System)\n\n数据分析(以SQL分析为主):\n\n√ Hive:构建于Hadoop之上的数据仓库,通过一种类SQL语言HiveQL为用户提供数据的归纳、查询和分析等功能。\n\n数据编排:\n\n√ lluxio:Alluxio是一个开源的虚拟分布式文件系统( Virtual Distributed File System, VDFS),位于大数据栈中的计算和存储之间。它为计算框架提供了数据抽象层,使得应用能够通过一个共同的接口连接底层不同的存储系统。\n\n环境模拟:总公司/分公司-1/分公司-2\n\n√ 每个公司有自建的HDFS集群;\n\n√ 每个公司有自建的Alluxio集群:用于实现与本公司HDFS集群和其他公司HDFS集群的数据联邦;\n\n√ 每个公司有自建的Hive集群。![image.png](https://dev-media.amazoncloud.cn/7e8cc26d84c94124b58567a62fe712ca_image.png)\n备注:\nCPU型号: 鲲鹏920\nHDFS 3.1.1\nHive 3.1.0\nAlluxio 2.8\n## 2.2 数据流定义\n使用HDFS、Hive、Alluxio定义数据持久化与数据访问链路。在总公司和分公司构建统一的技术栈(技术标准),实现数据共享闭环:\n1 在总公司数据域,实现分公司数据联邦,允许总公司实现全域数据访问与分析;\n\n2 在分公司数据域,合规访问总公司数据湖,并结合子公司私有数据进行自助化分析;\n![image.png](https://dev-media.amazoncloud.cn/090fa078d1d942bf826da122fd6a6bab_image.png)\n# 3. Alluxio在ARM环境下的基本测试\n## 3.1 Alluxio基于ARM编译\n```\\n## 编译\\nmvn -T2C -DskipTests -Dmaven.javadoc.skip -Dlicense.skip -\\nDcheckstyle.skip -Dfindbugs.skip clean install\\n```\n## 3.2 Alluxio基于ARM服务器的部署与基本测试\n```\\n## 基本测试\\n [root@node1 ~]# alluxio runTests\\n```\n![image.png](https://dev-media.amazoncloud.cn/47aee7c804824711ab209cba4823f175_image.png)\n## 3.3 Alluxio分布式高可用性验证(自动切换+手动切换)\n```\\n## 管理命令获取元数据高可用信息\\n[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER\\nJournal domain : MASTER\\nQuorum size : 3\\nQuorum leader : node1:19200\\n\\nSTATE | PRIORITY | SERVER ADDRESS\\nAVAILABLE | 0 | node1:19200\\nAVAILABLE | 0 | node2:19200\\nAVAILABLE | 0 | node3:19200\\n\\n## 关闭主管理节点\\n[root@node1 ~]# alluxio-stop.sh master\\nSuccessfully Killed 1 process(es) successfully on node1\\n\\n## 管理命令获取元数据高可用信息,检查管理节点自动切换状态\\n[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER\\nJournal domain : MASTER\\nQuorum size : 3\\nQuorum leader : node2:19200\\n\\nSTATE | PRIORITY | SERVER ADDRESS\\nUNAVAILABLE | 0 | node1:19200\\nAVAILABLE | 0 | node2:19200\\nAVAILABLE | 0 | node3:19200\\n[root@node1 ~]#\\n```\n\n\n\n```\\n## 管理命令获取元数据高可用信息\\n[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER\\nJournal domain : MASTER\\nQuorum size : 3\\nQuorum leader : node2:19200\\n\\nSTATE | PRIORITY | SERVER ADDRESS\\nAVAILABLE | 0 | node1:19200\\nAVAILABLE | 0 | node2:19200\\nAVAILABLE | 0 | node3:19200\\n\\n## 手动切换主节点\\n[root@node1 ~]# alluxio fsadmin journal quorum elect -address node3:19200\\nInitiating transfer of leadership to node3:19200\\nSuccessfully elected node3:19200 as the new leader\\nResetting priorities of masters after successful transfer of leadership\\nQuorum priorities were reset to 1\\n\\n## 管理命令获取元数据高可用信息,检查管理节点切换状态\\n[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER\\n\\nJournal domain : MASTER\\nQuorum size : 3\\nQuorum leader : node3:19200\\n\\nSTATE | PRIORITY | SERVER ADDRESS\\nAVAILABLE | 1 | node1:19200\\nAVAILABLE | 1 | node2:19200\\nAVAILABLE | 1 | node3:19200\\n[root@node1 ~]#\\n```\n\n## 3.4 Alluxio与HDFS集成\n```\\n## HDFS数据查询\\n[root@node1 alluxio]# hdfs dfs -ls /test/\\nFound 1 items\\n-rw-r--r-- 1 root hdfsadmingroup 53136 2022-07-22 16:57 /test/pom.xml\\n\\n## Alluxio数据挂载映射\\n[root@node1 alluxio]# alluxio fs mount /test/ hdfs://node1:9000/test\\nMounted hdfs://node1:9000/test at /test\\n\\n## Alluxio数据查询\\n[root@node1 alluxio]# alluxio fs ls -R /test\\n-rw-r--r-- root hdfsadmingroup 53136 PERSISTED 07-22-2022 16:57:23:651 0% /test/pom.xml\\n[root@node1 alluxio]#\\n```\n\n## 3.5 Alluxio与Hive集成\n```\\n## 创建Hive表\\nhive> create table test.test(id int) location 'alluxio://node1:19998/test/test';\\nOK\\nTime taken: 0.116 seconds\\nhive>\\n```\n\n## 3.6 Alluxio基于ACL的权限控制\n```\\n## 默认其他用户可以访问,禁止其他用户可以访问\\n[root@node1 ~]# alluxio fs setfacl -m user::--- /test\\n[root@node1 ~]# alluxio fs setfacl -m other::--- /test\\n\\n## user1 用户访问失败\\nuser1@node1 ~]\$ alluxio fs ls /test\\nPermission denied: user=user1, access=r--, path=/test: failed at test, inode owner=root, inode group=root, inode mode=---r-x—\\n[user1@node1 ~]\$\\n\\n## user1 用户授权,访问成功\\nroot@node1 ~]# alluxio fs setfacl -m user:user1:rwx /test\\n[user1@node1 ~]\$ alluxio fs ls /test\\n-rw-r--r-- root root 1726 PERSISTED 07-25-2022 14:50:51:180 100% /test/run-presto.pl\\n[user1@node1 ~]\$\\n\\n## user2 用户未授权访问失败\\n[user2@node1 ~]\$ alluxio fs ls /test\\nPermission denied: user=user2, access=r--, path=/test: failed at test, inode owner=root, inode group=root, inode mode=---r-x---\\n[user2@node1 ~]\$\\n\\n## 取消授权user1,访问失败\\nroot@node1 ~]# alluxio fs setfacl -b /test\\n[user1@node1 ~]\$ alluxio fs ls /test\\nPermission denied: user=user1, access=r--, path=/test: failed at test, inode owner=root, inode group=root, inode mode=---r-x---\\n[user1@node1 ~]\$\\n\\n## 查看目录权限\\n[root@node1 ~]# alluxio fs getfacl /test\\n# file: /test\\n# owner: root\\n# group: root\\nuser::---\\ngroup::r-x\\nother::---\\nmask::rwx\\n[root@node1 ~]#\\n```\n\n# 4. 数据域联邦场景研究\n## 4.1 分公司数据汇总与总公司集中式分析\n数据流验证:在总公司数据域,实现分公司数据联邦,允许总公司实现全域数据访问与分析:\n\n√ 构建总公司分公司模拟环境;\n\n√ 总公司基于Alluxio创建数据表T3,建立分区x, y, z;\n\n√ 分公司-1将HDFS目录X映射到总公司Alluxio分区x,准备模拟数据;\n\n√ 分公司-2将HDFS目录Y映射到总公司Alluxio分区y,准备模拟数据;\n\n√ 总公司使用Hive读取T3数据,验证:访问分公司-1与分公司-2的所有数据正常;\n\n√ 分公司-2将目录Y的数据进行更新;\n\n√ 通知总公司数据表T3 y分区数据变更(元数据失效);\n\n√ 总公司使用Hive读取T3数据,验证:访问分公司-1与分公司-2(更新后)的所有数据正常。\n![image.png](https://dev-media.amazoncloud.cn/72fce552309046559489c447a90fc6fc_image.png)\n\n```\\n## 总公司创建t3 表\\nhive> create external table group_company.t3(value string)\\n > partitioned by (part string)\\n > location 'alluxio://node1:19998/group_company/t3';\\nOK\\nTime taken: 0.069 seconds\\nhive>\\n\\n## 分公司1 分区x挂载到总公司 alluxio\\n[root@node1 ~]# hdfs dfs -put part\\\\=x/ hdfs://node3:9000/regional_company_1/t3\\n[root@node1 ~]# hdfs dfs -put part\\\\=y/ hdfs://node5:9000/regional_company_2/t3\\n[root@node1 ~]#\\n\\n[root@node1 ~]# alluxio fs mount \\\\\\n> /group_company/t3/part=x \\\\\\n> hdfs://node3:9000/regional_company_1/t3/part=x\\nMounted hdfs://node3:9000/regional_company_1/t3/part=x at /group_company/t3/part=x\\n[root@node1 ~]#\\n\\n## 查询数据\\nhive> MSCK REPAIR TABLE group_company.t3;\\nOK\\nPartitions not in metastore: t3:part=x\\nRepair: Added partition to metastore t3:part=x\\nTime taken: 0.169 seconds, Fetched: 2 row(s)\\nhive> select * from group_company.t3;\\nOK\\n1abc x\\nTime taken: 0.108 seconds, Fetched: 1 row(s)\\nhive>\\n\\n## 分公司2 分区y挂载到总公司 alluxio\\n[root@node1 ~]# alluxio fs mount \\\\\\n> /group_company/t3/part=y \\\\\\n> hdfs://node5:9000/regional_company_2/t3/part=y\\nMounted hdfs://node5:9000/regional_company_2/t3/part=y at /group_company/t3/part=y\\n[root@node1 ~]#\\n\\n## 查询数据\\nhive> MSCK REPAIR TABLE group_company.t3;\\nOK\\nPartitions not in metastore: t3:part=y\\nRepair: Added partition to metastore t3:part=y\\nTime taken: 0.153 seconds, Fetched: 2 row(s)\\nhive> select * from group_company.t3;\\nOK\\n1abc x\\n2def y\\nTime taken: 0.137 seconds, Fetched: 2 row(s)\\nhive>\\n\\n## 更新分区y 数据\\n[root@node1 ~]# hdfs dfs -cat hdfs://node5:9000/regional_company_2/t3/part=y/000000_0\\n2def\\n[root@node1 ~]# hdfs dfs -get hdfs://node5:9000/regional_company_2/t3/part=y/000000_0\\n[root@node1 ~]# echo '1111' > 000000_0\\n[root@node1 ~]# hdfs dfs -rm hdfs://node5:9000/regional_company_2/t3/part=y/000000_0\\nDeleted hdfs://node5:9000/regional_company_2/t3/part=y/000000_0\\n[root@node1 ~]# hdfs dfs -put 000000_0 hdfs://node5:9000/regional_company_2/t3/part=y/\\n[root@node1 ~]# hdfs dfs -cat hdfs://node5:9000/regional_company_2/t3/part=y/000000_0\\n1111\\n[root@node1 ~]#\\n\\n## 更新查询数据\\nhive> select * from group_company.t3;\\nOK\\n1abc x\\n2def y\\nTime taken: 0.112 seconds, Fetched: 2 row(s)\\nhive>\\n\\n## 通知总公司更新数据\\n[root@node1 ~]# alluxio fs loadMetadata -F /group_company/t3\\n[root@node1 ~]#\\n\\n## 总更新数据后查询\\nhive> select * from group_company.t3;\\nOK\\n1abc x\\n1111 y\\nTime taken: 0.1 seconds, Fetched: 2 row(s)\\nhive>\\n```\n\n## 4.2 总公司数据分发与分公司自助分析\n数据流验证:在分公司数据域,合规访问总公司数据湖,并结合私有数据进行自助化分析:\n\n√ 构建总公司分公司模拟环境;\n\n√ 总公司基于HDFS创建数据表T1,建立分区a, b, c;\n\n√ 分公司-1基于Alluxio使用数据表T1元数据创建相应表格T1’;\n\n√ 总公司挂载分区a到分公司-1的Alluxio相关目录;\n\n√ 分公司-1的Hive, 访问T1’,验证:访问分区a的数据正常;\n\n√ 总公司挂载分区c到分公司-1的Alluxio相关目录;\n\n√ 通过分公司-1的Hive, 访问T1’,验证:访问分区a/c的数据正常;\n\n√ 总公司将挂载的分区c从分公司1撤回;\n\n√ 通过分公司-1的Hive, 访问T1’,验证:仅能正常访问分区a的数据;\n\n√ 分公司创建数据表T2,完成数据表之间的join类型SQL,验证:总公司数据与分公司自有数据联邦访问正常。\n![image.png](https://dev-media.amazoncloud.cn/ce5787fc363c438e82109c77de0fc4e6_image.png)\n\n```\\n## 总公司创建 t1 表 三个分区 a b c\\nhive> create database group_company location '/user/hive/group_company.db';\\nOK\\nTime taken: 0.017 seconds\\nhive> create external table group_company.t1(value string) partitioned by (part string);\\nOK\\nTime taken: 0.144 seconds\\n\\nhive> insert into table group_company.t1 partition(part='a') values('1abc');\\nhive> insert into table group_company.t1 partition(part='b') values('2def');\\nhive> insert into table group_company.t1 partition(part='c') values('3ghi');\\n\\nhive> select * from group_company.t1;\\nOK\\n1abc a\\n2def b\\n3ghi c\\nTime taken: 0.142 seconds, Fetched: 3 row(s)\\n\\n## 分公司1 挂载总表分区 a\\n[root@node3 alluxio]# bin/alluxio fs mkdir /regional_company_1/t1/\\nSuccessfully created directory /regional_company_1/t1\\n[root@node3 alluxio]#\\n\\n[root@node3 alluxio]# bin/alluxio fs mount \\\\\\n> /regional_company_1/t1/part=a \\\\\\n> hdfs://node1:9000/user/hive/group_company.db/t1/part=a\\nMounted hdfs://node1:9000/user/hive/group_company.db/t1/part=a at /regional_company_1/t1/part=a\\n[root@node3 alluxio]#\\n\\n## 创建表查询数据\\nhive> create external table t1(value string)\\n > partitioned by (part string)\\n > location 'alluxio://node3:19998/regional_company_1/t1';\\nOK\\nTime taken: 0.972 seconds\\nhive> select * from t1;\\nOK\\nTime taken: 1.282 seconds\\nhive> MSCK REPAIR TABLE t1;\\nOK\\nPartitions not in metastore: t1:part=a\\nRepair: Added partition to metastore t1:part=a\\nTime taken: 0.235 seconds, Fetched: 2 row(s)\\nhive> select * from t1;\\nOK\\n1abc a\\nTime taken: 0.137 seconds, Fetched: 1 row(s)\\nhive>\\n\\n## 分公司1 挂载总表分区 c\\n[root@node3 alluxio]# bin/alluxio fs mount \\\\\\n> /regional_company_1/t1/part=c \\\\\\n> hdfs://node1:9000/user/hive/group_company.db/t1/part=c\\nMounted hdfs://node1:9000/user/hive/group_company.db/t1/part=c at /regional_company_1/t1/part=c\\n[root@node3 alluxio]#\\n\\n## 查询数据\\nhive> MSCK REPAIR TABLE t1;\\nOK\\nPartitions not in metastore: t1:part=c\\nRepair: Added partition to metastore t1:part=c\\nTime taken: 0.244 seconds, Fetched: 2 row(s)\\nhive> select * from t1;\\nOK\\n1abc a\\n3ghi c\\nTime taken: 0.145 seconds, Fetched: 2 row(s)\\nhive>\\n\\n## 撤回\\n[root@node3 alluxio]# bin/alluxio fs unmount /regional_company_1/t1/part=c\\nUnmounted /regional_company_1/t1/part=c\\n[root@node3 alluxio]#\\n\\nhive> select * from t1;\\nOK\\n1abc a\\nTime taken: 2.281 seconds, Fetched: 1 row(s)\\nhive>\\n\\n## join t2 表\\nhive> select * from t2;\\nOK\\n5678 a\\n1234 d\\nTime taken: 0.082 seconds, Fetched: 2 row(s)\\nhive>\\n\\nhive> select * from (\\n > select * from t1\\n > ) t1\\n > join (\\n > select * from t2\\n > ) t2\\n > on t1.part = t2.part;\\nQuery ID = root_20220720135305_c5730dc3-a46a-478a-a368-2e0343385700\\nTotal jobs = 1\\nHadoop job information for Stage-3: number of mappers: 1; number of reducers: 0\\n2022-07-20 13:53:26,621 Stage-3 map = 0%, reduce = 0%\\n2022-07-20 13:53:31,775 Stage-3 map = 100%, reduce = 0%, Cumulative CPU 2.42 sec\\nMapReduce Total cumulative CPU time: 2 seconds 420 msec\\nEnded Job = job_1658118353477_0009\\nMapReduce Jobs Launched:\\nStage-Stage-3: Map: 1 Cumulative CPU: 2.42 sec HDFS Read: 8876 HDFS Write: 113 SUCCESS\\nTotal MapReduce CPU Time Spent: 2 seconds 420 msec\\nOK\\n1abc a 5678 a\\nTime taken: 27.333 seconds, Fetched: 1 row(s)\\nhive>\\n```\n\n# 5. 总结\n## 通过本次研究发现:\n1 我们在国产化软硬件环境中(ARM+统信)对当前主流组件完成了适配和基本验证,Hive+Alluxio+HDFS的技术栈可以在国产化环境下正常运行;\n\n2 通过Alluxio数据编排实现跨地域的数据联邦,实现总公司与分公司之间不同物理数据域的互联互通,提供企业内部完整的数据链路;\n\n3 通过Alluxio自身的ACL控制,以及Alluxio与底层UFS(本次验证是HDFS)的挂载设定进行数据逻辑映射的控制;\n\n**在技术可行性方面的验证,也为我们日后的原型优化提供了更多的思路:**\n1 考虑新的数据合规要求,设定Alluxio中数据的TTL控制数据访问生命周期;\n\n2 数据更新的机制,无论是利用UFS自身的变更通知还是外围的消息机制,更好地保障企业内部跨数据域的数据访问一致性;\n\n3 更加细粒度的数据访问控制,通过更多的数据语义理解,提高对数据管理的灵活度;\n\n\n\n想要获取更多有趣有料的【活动信息】【技术文章】【大咖观点】,请关注**[Alluxio智库]**:\n![image.png](https://dev-media.amazoncloud.cn/709276c76f1e439ebe186b4c5b75b326_image.png)\n","render":"<p><img src=\\"https://dev-media.amazoncloud.cn/72debf5c5a0c4f9da7119d1a43818db6_image.png\\" alt=\\"image.png\\" /><img src=\\"https://dev-media.amazoncloud.cn/69f109182c60442980ac8b4b417eca2d_image.png\\" alt=\\"image.png\\" /></p>\n<h1><a id=\\"1__1\\"></a>1. 数字化转型与国产化进程推进</h1>\\n<p>为了响应国家“十四五”数字经济发展规划的号召,中国企业推动创新资源共建共享,促进创新模式开放化演进,在信息化、数字化、智能化的强烈需求下,中国龙头企业统筹全渠道的技术能力,逐渐形成了一套覆盖集团业务发展、经营管理等核心发展战略需要的战略方向。</p>\n<p>数字化转型初见成效,数据能力不断挖掘与创新;大数据技术推陈出新,国产化步伐日益加快。无论是互联网企业还是传统行业下的领导企业,有什么数据,如何使用数据,如何更加智能地利用数据这些议题被不断挖掘与迭代。</p>\n<p>在东数西算的理念下,数据跨平台、跨机房、跨地域的技术问题与挑战逐渐浮现出来。这篇文章我们主要从技术的角度,对跨地域的数据联邦,或者说总公司和分公司不同数据域的互联互通进行讨论,研究相关技术可行性与分享整个研究过程。为了加快国产化软硬件的推进,本次实践采用国产化硬件ARM服务器(鲲鹏920)以及国产化操作系统统信进行相关的技术验证。</p>\n<h1><a id=\\"2__8\\"></a>2. 原型目标与设计</h1>\\n<p>通过对跨地域数据联邦的调研,我们发现中国很多企业面临的业务挑战虽然不同,但是技术难点是相似的,主要有:</p>\n<p><strong>挑战一</strong>:总公司通过传统的ETL作业采集分公司数据(比如通过Informatica、Kettle、DataX等),这些作业往往是按需定制,并且定期执行的;当有新的数据合规要求或者总公司数据分析要求时,都需要进行定制开发、测试、部署,这对数据汇总的时效性带来了很大的负面影响。另外通过ETL作业采集的分公司数据,在遇到分公司数据更新时,非常容易造成总公司与分公司之间的数据不一致,导致分析结果有所纰漏。</p>\\n<p><strong>挑战二</strong>:子公司的自助式查询,一方面是对总公司的数据申请,很多时候整个数据访问链路是断裂的,往往需要通过流程筛查、繁琐的数据同步手段进行(比如通过FTP传输,甚至是物理介质的长途运输)。考虑到数据安全以及国家审计合规的要求,总公司数据是否可以在子公司持久化存储、数据访问脱敏、权限管控等等也都是当前中国企业面临的具体技术挑战。</p>\\n<p><strong>因此我们本次的研究主要会关注在数据流的双向流动方面。</strong></p>\\n<h2><a id=\\"21__17\\"></a>2.1 研究原型技术选型</h2>\\n<p>当前大数据技术已经成为企业内部典型的数据分析手段,因此在原型实现的过程中,我们主要使用开源的大数据技术,从存储、计算(分析)、编排3个维度进行选型。其中每个维度我们选择时下最主流的组件,以确保该原型的通用性。</p>\n<p>数据存储:</p>\n<p>√ HDFS:Hadoop分布式文件系统(Distributed File System)</p>\n<p>数据分析(以SQL分析为主):</p>\n<p>√ Hive:构建于Hadoop之上的数据仓库,通过一种类SQL语言HiveQL为用户提供数据的归纳、查询和分析等功能。</p>\n<p>数据编排:</p>\n<p>√ lluxio:Alluxio是一个开源的虚拟分布式文件系统( Virtual Distributed File System, VDFS),位于大数据栈中的计算和存储之间。它为计算框架提供了数据抽象层,使得应用能够通过一个共同的接口连接底层不同的存储系统。</p>\n<p>环境模拟:总公司/分公司-1/分公司-2</p>\n<p>√ 每个公司有自建的HDFS集群;</p>\n<p>√ 每个公司有自建的Alluxio集群:用于实现与本公司HDFS集群和其他公司HDFS集群的数据联邦;</p>\n<p>√ 每个公司有自建的Hive集群。<img src=\\"https://dev-media.amazoncloud.cn/7e8cc26d84c94124b58567a62fe712ca_image.png\\" alt=\\"image.png\\" /><br />\\n备注:<br />\\nCPU型号: 鲲鹏920<br />\\nHDFS 3.1.1<br />\\nHive 3.1.0<br />\\nAlluxio 2.8</p>\n<h2><a id=\\"22__44\\"></a>2.2 数据流定义</h2>\\n<p>使用HDFS、Hive、Alluxio定义数据持久化与数据访问链路。在总公司和分公司构建统一的技术栈(技术标准),实现数据共享闭环:<br />\\n1 在总公司数据域,实现分公司数据联邦,允许总公司实现全域数据访问与分析;</p>\n<p>2 在分公司数据域,合规访问总公司数据湖,并结合子公司私有数据进行自助化分析;<br />\\n<img src=\\"https://dev-media.amazoncloud.cn/090fa078d1d942bf826da122fd6a6bab_image.png\\" alt=\\"image.png\\" /></p>\n<h1><a id=\\"3_AlluxioARM_50\\"></a>3. Alluxio在ARM环境下的基本测试</h1>\\n<h2><a id=\\"31_AlluxioARM_51\\"></a>3.1 Alluxio基于ARM编译</h2>\\n<pre><code class=\\"lang-\\">## 编译\\nmvn -T2C -DskipTests -Dmaven.javadoc.skip -Dlicense.skip -\\nDcheckstyle.skip -Dfindbugs.skip clean install\\n</code></pre>\\n<h2><a id=\\"32_AlluxioARM_57\\"></a>3.2 Alluxio基于ARM服务器的部署与基本测试</h2>\\n<pre><code class=\\"lang-\\">## 基本测试\\n [root@node1 ~]# alluxio runTests\\n</code></pre>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/47aee7c804824711ab209cba4823f175_image.png\\" alt=\\"image.png\\" /></p>\n<h2><a id=\\"33_Alluxio_63\\"></a>3.3 Alluxio分布式高可用性验证(自动切换+手动切换)</h2>\\n<pre><code class=\\"lang-\\">## 管理命令获取元数据高可用信息\\n[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER\\nJournal domain : MASTER\\nQuorum size : 3\\nQuorum leader : node1:19200\\n\\nSTATE | PRIORITY | SERVER ADDRESS\\nAVAILABLE | 0 | node1:19200\\nAVAILABLE | 0 | node2:19200\\nAVAILABLE | 0 | node3:19200\\n\\n## 关闭主管理节点\\n[root@node1 ~]# alluxio-stop.sh master\\nSuccessfully Killed 1 process(es) successfully on node1\\n\\n## 管理命令获取元数据高可用信息,检查管理节点自动切换状态\\n[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER\\nJournal domain : MASTER\\nQuorum size : 3\\nQuorum leader : node2:19200\\n\\nSTATE | PRIORITY | SERVER ADDRESS\\nUNAVAILABLE | 0 | node1:19200\\nAVAILABLE | 0 | node2:19200\\nAVAILABLE | 0 | node3:19200\\n[root@node1 ~]#\\n</code></pre>\\n<pre><code class=\\"lang-\\">## 管理命令获取元数据高可用信息\\n[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER\\nJournal domain : MASTER\\nQuorum size : 3\\nQuorum leader : node2:19200\\n\\nSTATE | PRIORITY | SERVER ADDRESS\\nAVAILABLE | 0 | node1:19200\\nAVAILABLE | 0 | node2:19200\\nAVAILABLE | 0 | node3:19200\\n\\n## 手动切换主节点\\n[root@node1 ~]# alluxio fsadmin journal quorum elect -address node3:19200\\nInitiating transfer of leadership to node3:19200\\nSuccessfully elected node3:19200 as the new leader\\nResetting priorities of masters after successful transfer of leadership\\nQuorum priorities were reset to 1\\n\\n## 管理命令获取元数据高可用信息,检查管理节点切换状态\\n[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER\\n\\nJournal domain : MASTER\\nQuorum size : 3\\nQuorum leader : node3:19200\\n\\nSTATE | PRIORITY | SERVER ADDRESS\\nAVAILABLE | 1 | node1:19200\\nAVAILABLE | 1 | node2:19200\\nAVAILABLE | 1 | node3:19200\\n[root@node1 ~]#\\n</code></pre>\\n<h2><a id=\\"34_AlluxioHDFS_128\\"></a>3.4 Alluxio与HDFS集成</h2>\\n<pre><code class=\\"lang-\\">## HDFS数据查询\\n[root@node1 alluxio]# hdfs dfs -ls /test/\\nFound 1 items\\n-rw-r--r-- 1 root hdfsadmingroup 53136 2022-07-22 16:57 /test/pom.xml\\n\\n## Alluxio数据挂载映射\\n[root@node1 alluxio]# alluxio fs mount /test/ hdfs://node1:9000/test\\nMounted hdfs://node1:9000/test at /test\\n\\n## Alluxio数据查询\\n[root@node1 alluxio]# alluxio fs ls -R /test\\n-rw-r--r-- root hdfsadmingroup 53136 PERSISTED 07-22-2022 16:57:23:651 0% /test/pom.xml\\n[root@node1 alluxio]#\\n</code></pre>\\n<h2><a id=\\"35_AlluxioHive_145\\"></a>3.5 Alluxio与Hive集成</h2>\\n<pre><code class=\\"lang-\\">## 创建Hive表\\nhive&gt; create table test.test(id int) location 'alluxio://node1:19998/test/test';\\nOK\\nTime taken: 0.116 seconds\\nhive&gt;\\n</code></pre>\\n<h2><a id=\\"36_AlluxioACL_154\\"></a>3.6 Alluxio基于ACL的权限控制</h2>\\n<pre><code class=\\"lang-\\">## 默认其他用户可以访问,禁止其他用户可以访问\\n[root@node1 ~]# alluxio fs setfacl -m user::--- /test\\n[root@node1 ~]# alluxio fs setfacl -m other::--- /test\\n\\n## user1 用户访问失败\\nuser1@node1 ~]\$ alluxio fs ls /test\\nPermission denied: user=user1, access=r--, path=/test: failed at test, inode owner=root, inode group=root, inode mode=---r-x—\\n[user1@node1 ~]\$\\n\\n## user1 用户授权,访问成功\\nroot@node1 ~]# alluxio fs setfacl -m user:user1:rwx /test\\n[user1@node1 ~]\$ alluxio fs ls /test\\n-rw-r--r-- root root 1726 PERSISTED 07-25-2022 14:50:51:180 100% /test/run-presto.pl\\n[user1@node1 ~]\$\\n\\n## user2 用户未授权访问失败\\n[user2@node1 ~]\$ alluxio fs ls /test\\nPermission denied: user=user2, access=r--, path=/test: failed at test, inode owner=root, inode group=root, inode mode=---r-x---\\n[user2@node1 ~]\$\\n\\n## 取消授权user1,访问失败\\nroot@node1 ~]# alluxio fs setfacl -b /test\\n[user1@node1 ~]\$ alluxio fs ls /test\\nPermission denied: user=user1, access=r--, path=/test: failed at test, inode owner=root, inode group=root, inode mode=---r-x---\\n[user1@node1 ~]\$\\n\\n## 查看目录权限\\n[root@node1 ~]# alluxio fs getfacl /test\\n# file: /test\\n# owner: root\\n# group: root\\nuser::---\\ngroup::r-x\\nother::---\\nmask::rwx\\n[root@node1 ~]#\\n</code></pre>\\n<h1><a id=\\"4__194\\"></a>4. 数据域联邦场景研究</h1>\\n<h2><a id=\\"41__195\\"></a>4.1 分公司数据汇总与总公司集中式分析</h2>\\n<p>数据流验证:在总公司数据域,实现分公司数据联邦,允许总公司实现全域数据访问与分析:</p>\n<p>√ 构建总公司分公司模拟环境;</p>\n<p>√ 总公司基于Alluxio创建数据表T3,建立分区x, y, z;</p>\n<p>√ 分公司-1将HDFS目录X映射到总公司Alluxio分区x,准备模拟数据;</p>\n<p>√ 分公司-2将HDFS目录Y映射到总公司Alluxio分区y,准备模拟数据;</p>\n<p>√ 总公司使用Hive读取T3数据,验证:访问分公司-1与分公司-2的所有数据正常;</p>\n<p>√ 分公司-2将目录Y的数据进行更新;</p>\n<p>√ 通知总公司数据表T3 y分区数据变更(元数据失效);</p>\n<p>√ 总公司使用Hive读取T3数据,验证:访问分公司-1与分公司-2(更新后)的所有数据正常。<br />\\n<img src=\\"https://dev-media.amazoncloud.cn/72fce552309046559489c447a90fc6fc_image.png\\" alt=\\"image.png\\" /></p>\n<pre><code class=\\"lang-\\">## 总公司创建t3 表\\nhive&gt; create external table group_company.t3(value string)\\n &gt; partitioned by (part string)\\n &gt; location 'alluxio://node1:19998/group_company/t3';\\nOK\\nTime taken: 0.069 seconds\\nhive&gt;\\n\\n## 分公司1 分区x挂载到总公司 alluxio\\n[root@node1 ~]# hdfs dfs -put part\\\\=x/ hdfs://node3:9000/regional_company_1/t3\\n[root@node1 ~]# hdfs dfs -put part\\\\=y/ hdfs://node5:9000/regional_company_2/t3\\n[root@node1 ~]#\\n\\n[root@node1 ~]# alluxio fs mount \\\\\\n&gt; /group_company/t3/part=x \\\\\\n&gt; hdfs://node3:9000/regional_company_1/t3/part=x\\nMounted hdfs://node3:9000/regional_company_1/t3/part=x at /group_company/t3/part=x\\n[root@node1 ~]#\\n\\n## 查询数据\\nhive&gt; MSCK REPAIR TABLE group_company.t3;\\nOK\\nPartitions not in metastore: t3:part=x\\nRepair: Added partition to metastore t3:part=x\\nTime taken: 0.169 seconds, Fetched: 2 row(s)\\nhive&gt; select * from group_company.t3;\\nOK\\n1abc x\\nTime taken: 0.108 seconds, Fetched: 1 row(s)\\nhive&gt;\\n\\n## 分公司2 分区y挂载到总公司 alluxio\\n[root@node1 ~]# alluxio fs mount \\\\\\n&gt; /group_company/t3/part=y \\\\\\n&gt; hdfs://node5:9000/regional_company_2/t3/part=y\\nMounted hdfs://node5:9000/regional_company_2/t3/part=y at /group_company/t3/part=y\\n[root@node1 ~]#\\n\\n## 查询数据\\nhive&gt; MSCK REPAIR TABLE group_company.t3;\\nOK\\nPartitions not in metastore: t3:part=y\\nRepair: Added partition to metastore t3:part=y\\nTime taken: 0.153 seconds, Fetched: 2 row(s)\\nhive&gt; select * from group_company.t3;\\nOK\\n1abc x\\n2def y\\nTime taken: 0.137 seconds, Fetched: 2 row(s)\\nhive&gt;\\n\\n## 更新分区y 数据\\n[root@node1 ~]# hdfs dfs -cat hdfs://node5:9000/regional_company_2/t3/part=y/000000_0\\n2def\\n[root@node1 ~]# hdfs dfs -get hdfs://node5:9000/regional_company_2/t3/part=y/000000_0\\n[root@node1 ~]# echo '1111' &gt; 000000_0\\n[root@node1 ~]# hdfs dfs -rm hdfs://node5:9000/regional_company_2/t3/part=y/000000_0\\nDeleted hdfs://node5:9000/regional_company_2/t3/part=y/000000_0\\n[root@node1 ~]# hdfs dfs -put 000000_0 hdfs://node5:9000/regional_company_2/t3/part=y/\\n[root@node1 ~]# hdfs dfs -cat hdfs://node5:9000/regional_company_2/t3/part=y/000000_0\\n1111\\n[root@node1 ~]#\\n\\n## 更新查询数据\\nhive&gt; select * from group_company.t3;\\nOK\\n1abc x\\n2def y\\nTime taken: 0.112 seconds, Fetched: 2 row(s)\\nhive&gt;\\n\\n## 通知总公司更新数据\\n[root@node1 ~]# alluxio fs loadMetadata -F /group_company/t3\\n[root@node1 ~]#\\n\\n## 总更新数据后查询\\nhive&gt; select * from group_company.t3;\\nOK\\n1abc x\\n1111 y\\nTime taken: 0.1 seconds, Fetched: 2 row(s)\\nhive&gt;\\n</code></pre>\\n<h2><a id=\\"42__300\\"></a>4.2 总公司数据分发与分公司自助分析</h2>\\n<p>数据流验证:在分公司数据域,合规访问总公司数据湖,并结合私有数据进行自助化分析:</p>\n<p>√ 构建总公司分公司模拟环境;</p>\n<p>√ 总公司基于HDFS创建数据表T1,建立分区a, b, c;</p>\n<p>√ 分公司-1基于Alluxio使用数据表T1元数据创建相应表格T1’;</p>\n<p>√ 总公司挂载分区a到分公司-1的Alluxio相关目录;</p>\n<p>√ 分公司-1的Hive, 访问T1’,验证:访问分区a的数据正常;</p>\n<p>√ 总公司挂载分区c到分公司-1的Alluxio相关目录;</p>\n<p>√ 通过分公司-1的Hive, 访问T1’,验证:访问分区a/c的数据正常;</p>\n<p>√ 总公司将挂载的分区c从分公司1撤回;</p>\n<p>√ 通过分公司-1的Hive, 访问T1’,验证:仅能正常访问分区a的数据;</p>\n<p>√ 分公司创建数据表T2,完成数据表之间的join类型SQL,验证:总公司数据与分公司自有数据联邦访问正常。<br />\\n<img src=\\"https://dev-media.amazoncloud.cn/ce5787fc363c438e82109c77de0fc4e6_image.png\\" alt=\\"image.png\\" /></p>\n<pre><code class=\\"lang-\\">## 总公司创建 t1 表 三个分区 a b c\\nhive&gt; create database group_company location '/user/hive/group_company.db';\\nOK\\nTime taken: 0.017 seconds\\nhive&gt; create external table group_company.t1(value string) partitioned by (part string);\\nOK\\nTime taken: 0.144 seconds\\n\\nhive&gt; insert into table group_company.t1 partition(part='a') values('1abc');\\nhive&gt; insert into table group_company.t1 partition(part='b') values('2def');\\nhive&gt; insert into table group_company.t1 partition(part='c') values('3ghi');\\n\\nhive&gt; select * from group_company.t1;\\nOK\\n1abc a\\n2def b\\n3ghi c\\nTime taken: 0.142 seconds, Fetched: 3 row(s)\\n\\n## 分公司1 挂载总表分区 a\\n[root@node3 alluxio]# bin/alluxio fs mkdir /regional_company_1/t1/\\nSuccessfully created directory /regional_company_1/t1\\n[root@node3 alluxio]#\\n\\n[root@node3 alluxio]# bin/alluxio fs mount \\\\\\n&gt; /regional_company_1/t1/part=a \\\\\\n&gt; hdfs://node1:9000/user/hive/group_company.db/t1/part=a\\nMounted hdfs://node1:9000/user/hive/group_company.db/t1/part=a at /regional_company_1/t1/part=a\\n[root@node3 alluxio]#\\n\\n## 创建表查询数据\\nhive&gt; create external table t1(value string)\\n &gt; partitioned by (part string)\\n &gt; location 'alluxio://node3:19998/regional_company_1/t1';\\nOK\\nTime taken: 0.972 seconds\\nhive&gt; select * from t1;\\nOK\\nTime taken: 1.282 seconds\\nhive&gt; MSCK REPAIR TABLE t1;\\nOK\\nPartitions not in metastore: t1:part=a\\nRepair: Added partition to metastore t1:part=a\\nTime taken: 0.235 seconds, Fetched: 2 row(s)\\nhive&gt; select * from t1;\\nOK\\n1abc a\\nTime taken: 0.137 seconds, Fetched: 1 row(s)\\nhive&gt;\\n\\n## 分公司1 挂载总表分区 c\\n[root@node3 alluxio]# bin/alluxio fs mount \\\\\\n&gt; /regional_company_1/t1/part=c \\\\\\n&gt; hdfs://node1:9000/user/hive/group_company.db/t1/part=c\\nMounted hdfs://node1:9000/user/hive/group_company.db/t1/part=c at /regional_company_1/t1/part=c\\n[root@node3 alluxio]#\\n\\n## 查询数据\\nhive&gt; MSCK REPAIR TABLE t1;\\nOK\\nPartitions not in metastore: t1:part=c\\nRepair: Added partition to metastore t1:part=c\\nTime taken: 0.244 seconds, Fetched: 2 row(s)\\nhive&gt; select * from t1;\\nOK\\n1abc a\\n3ghi c\\nTime taken: 0.145 seconds, Fetched: 2 row(s)\\nhive&gt;\\n\\n## 撤回\\n[root@node3 alluxio]# bin/alluxio fs unmount /regional_company_1/t1/part=c\\nUnmounted /regional_company_1/t1/part=c\\n[root@node3 alluxio]#\\n\\nhive&gt; select * from t1;\\nOK\\n1abc a\\nTime taken: 2.281 seconds, Fetched: 1 row(s)\\nhive&gt;\\n\\n## join t2 表\\nhive&gt; select * from t2;\\nOK\\n5678 a\\n1234 d\\nTime taken: 0.082 seconds, Fetched: 2 row(s)\\nhive&gt;\\n\\nhive&gt; select * from (\\n &gt; select * from t1\\n &gt; ) t1\\n &gt; join (\\n &gt; select * from t2\\n &gt; ) t2\\n &gt; on t1.part = t2.part;\\nQuery ID = root_20220720135305_c5730dc3-a46a-478a-a368-2e0343385700\\nTotal jobs = 1\\nHadoop job information for Stage-3: number of mappers: 1; number of reducers: 0\\n2022-07-20 13:53:26,621 Stage-3 map = 0%, reduce = 0%\\n2022-07-20 13:53:31,775 Stage-3 map = 100%, reduce = 0%, Cumulative CPU 2.42 sec\\nMapReduce Total cumulative CPU time: 2 seconds 420 msec\\nEnded Job = job_1658118353477_0009\\nMapReduce Jobs Launched:\\nStage-Stage-3: Map: 1 Cumulative CPU: 2.42 sec HDFS Read: 8876 HDFS Write: 113 SUCCESS\\nTotal MapReduce CPU Time Spent: 2 seconds 420 msec\\nOK\\n1abc a 5678 a\\nTime taken: 27.333 seconds, Fetched: 1 row(s)\\nhive&gt;\\n</code></pre>\\n<h1><a id=\\"5__437\\"></a>5. 总结</h1>\\n<h2><a id=\\"_438\\"></a>通过本次研究发现:</h2>\\n<p>1 我们在国产化软硬件环境中(ARM+统信)对当前主流组件完成了适配和基本验证,Hive+Alluxio+HDFS的技术栈可以在国产化环境下正常运行;</p>\n<p>2 通过Alluxio数据编排实现跨地域的数据联邦,实现总公司与分公司之间不同物理数据域的互联互通,提供企业内部完整的数据链路;</p>\n<p>3 通过Alluxio自身的ACL控制,以及Alluxio与底层UFS(本次验证是HDFS)的挂载设定进行数据逻辑映射的控制;</p>\n<p><strong>在技术可行性方面的验证,也为我们日后的原型优化提供了更多的思路:</strong><br />\\n1 考虑新的数据合规要求,设定Alluxio中数据的TTL控制数据访问生命周期;</p>\n<p>2 数据更新的机制,无论是利用UFS自身的变更通知还是外围的消息机制,更好地保障企业内部跨数据域的数据访问一致性;</p>\n<p>3 更加细粒度的数据访问控制,通过更多的数据语义理解,提高对数据管理的灵活度;</p>\n<p>想要获取更多有趣有料的【活动信息】【技术文章】【大咖观点】,请关注**[Alluxio智库]**:<br />\\n<img src=\\"https://dev-media.amazoncloud.cn/709276c76f1e439ebe186b4c5b75b326_image.png\\" alt=\\"image.png\\" /></p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭