├── assets ├── .DS_Store ├── star.png └── image-20191018181746190.png ├── HDP ├── HDP部署明细.numbers ├── HDP安装 │ └── HDP安装.resources │ │ ├── 05ED9F87-3992-4766-87DF-DFFB0B618E9E.png │ │ ├── 0F9605B0-5C12-4ECC-8F98-D92D24D6BACA.png │ │ ├── 29990C57-A80D-431B-9317-FEEED7409048.png │ │ ├── 3D849ABB-2951-4577-81FD-77B8D102E43D.png │ │ ├── 46F38883-EE81-449B-9347-F468DB6C188E.png │ │ ├── 47D1B806-0DC6-426B-B223-F4B3B0462C35.png │ │ ├── 95B7BFE7-79BC-4DA9-B19D-D18C4156BAC9.png │ │ ├── 9C68FEDE-D953-445C-B358-D06FBC10D3D1.png │ │ ├── A4E15A30-0211-4857-B3C3-F132486266FA.png │ │ ├── ACE12C43-07EC-4F84-A384-1398426B3871.png │ │ ├── B63EBA92-52F3-408C-8502-75EB6356C93F.png │ │ ├── C044020C-68E4-43AE-8A8C-29F99E7E5E3D.png │ │ ├── D2657C77-D0EB-4CFB-A0B2-4A4BA8F6D642.png │ │ └── ED723A40-6057-4B78-AE15-B0881D05EBB2.png └── HDPS安装 │ └── HDP-Search安装.html ├── flink ├── assets │ ├── image-20190503174645592.png │ └── image-20201021190650449.png ├── flink_info.md ├── doc.md ├── flink实战(2).md └── flink实战(1).md ├── flume ├── assets │ ├── image-20190326181302756.png │ └── image-20200902090523439.png ├── flume-kafka.md └── flume02.md ├── hadoop ├── assets │ ├── image-20190327162651005.png │ ├── image-20190327195859581.png │ ├── image-20190327212956144.png │ ├── image-20190327220226661.png │ ├── image-20190328143246310.png │ ├── image-20190328154038826.png │ ├── image-20190328161121623.png │ ├── image-20190329205051688.png │ ├── image-20190329211841419.png │ ├── image-20190331053842060.png │ ├── image-20190331183257543.png │ ├── image-20190402144606097.png │ ├── image-20190402161528326.png │ ├── image-20190402181457807.png │ ├── image-20190403104732029.png │ ├── image-20190403111749269.png │ ├── image-20190403112423242.png │ ├── image-20190403112627840.png │ ├── image-20190403113951902.png │ ├── image-20190403144048405.png │ ├── image-20190403171153285.png │ ├── image-20190403171230570.png │ ├── image-20190404114211955.png │ ├── image-20190404161032740.png │ ├── image-20190404162714596.png │ ├── image-20190406140012345.png │ ├── image-20190406160453989.png │ ├── image-20190406160500034.png │ ├── image-20190409154317920.png │ ├── image-20190409200641442.png │ ├── image-20190418204037498.png │ ├── image-20190422153706588.png │ ├── image-20190422184503191.png │ └── image-20190516151757410.png ├── 企业级解决方案.md ├── 存储模式.md ├── 交互式计算引擎.md ├── 流式实时计算引擎.md ├── 数据分析篇.md ├── HDFS深入理解.md ├── Yarn深入理解.md └── 配置挖掘.md ├── hbase ├── assets │ ├── image-20190509192523734.png │ ├── image-20190515141849276.png │ └── image-20190515142113174.png ├── HBase-Spark.md ├── HBase-Rowkey-设计.md ├── info_go_phoenix_hbase.md ├── HBase使用场景.md ├── HBase优化.md └── Phoenix01.md ├── hive ├── assets │ ├── image-20190516112327768.png │ └── image-20190611193250747.png ├── Mongo_to_Es.md ├── 数据存储选型讨论.md ├── Hive函数.md ├── Hive权限.md ├── Hive_SQL优化经典案例_02.txt ├── Hive+ES.md ├── Hive+Solr.md ├── HDFS_Shell_Help.md ├── Hive_SQL优化经典案例_01.txt └── HELP.md ├── kafka ├── assets │ ├── image-20200818180124497.png │ ├── image-20200819002600829.png │ └── F1E3C6D3-2FAB-4CC4-9CF4-B7DDB455F236.png ├── Kafka的分区算法.md └── Kafka运维与调优.md ├── lucene ├── assets │ └── image-20190530161227604.png ├── IKAnalyzer.md ├── Solr基础语法.md ├── ES_Config.md ├── Solr.md ├── Lucene.md └── ES_CRUD.md ├── NLP推荐系统 ├── assets │ ├── image-20190524013340993.png │ ├── image-20190525141332843.png │ ├── image-20190525144106396.png │ ├── image-20190525144551453.png │ ├── image-20190606005328504.png │ └── image-20190606005535462.png ├── 指标.md └── 推荐系统设计.md ├── nifi └── Apache Nifi Info.md ├── CDH └── Cloudera6.0.0安装 │ └── Cloudera6.0.0安装.resources │ ├── 0561FA27-9671-4AB3-B7EA-1F9F061CDBA9.jpg │ ├── 2AB2F0E8-827F-49B8-8E45-CD2E7A68F416.jpg │ ├── 385D2158-4440-4E25-89C1-4E7DD52D36EB.jpg │ ├── 38968272-5D7B-47FF-82A7-C2552742BBA8.jpg │ ├── 6F2549C3-4036-4B2D-8ED7-607CA41A1A03.jpg │ ├── 85BC2E7A-55B0-4DAC-A974-CC0090A48284.jpg │ ├── 86EF6375-BDA8-4BF6-8C82-96BE3E2B9CE9.png │ ├── A604A035-5DDE-4748-A08C-AD86BA3491ED.jpg │ ├── B1E06C89-FF01-4660-B0E5-43FD88414CF2.png │ ├── CEF30277-BB3A-49E0-B5CF-6A179A37FC19.jpg │ └── D21BF47F-406C-4A23-ABBA-35ABFF22027A.jpg ├── spark ├── Spark_Stream02.md ├── Spark_Stream01.md ├── Spark-Hive-New.md └── spark_01.md ├── .gitignore ├── 架构设计.md ├── serialization └── Serialization Info.md ├── sqoop └── sqoop info.md ├── README.md └── Problems.md /assets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/assets/.DS_Store -------------------------------------------------------------------------------- /assets/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/assets/star.png -------------------------------------------------------------------------------- /HDP/HDP部署明细.numbers: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP部署明细.numbers -------------------------------------------------------------------------------- /assets/image-20191018181746190.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/assets/image-20191018181746190.png -------------------------------------------------------------------------------- /flink/assets/image-20190503174645592.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/flink/assets/image-20190503174645592.png -------------------------------------------------------------------------------- /flink/assets/image-20201021190650449.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/flink/assets/image-20201021190650449.png -------------------------------------------------------------------------------- /flume/assets/image-20190326181302756.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/flume/assets/image-20190326181302756.png -------------------------------------------------------------------------------- /flume/assets/image-20200902090523439.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/flume/assets/image-20200902090523439.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190327162651005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190327162651005.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190327195859581.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190327195859581.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190327212956144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190327212956144.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190327220226661.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190327220226661.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190328143246310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190328143246310.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190328154038826.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190328154038826.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190328161121623.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190328161121623.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190329205051688.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190329205051688.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190329211841419.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190329211841419.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190331053842060.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190331053842060.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190331183257543.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190331183257543.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190402144606097.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190402144606097.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190402161528326.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190402161528326.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190402181457807.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190402181457807.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190403104732029.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190403104732029.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190403111749269.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190403111749269.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190403112423242.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190403112423242.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190403112627840.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190403112627840.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190403113951902.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190403113951902.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190403144048405.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190403144048405.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190403171153285.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190403171153285.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190403171230570.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190403171230570.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190404114211955.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190404114211955.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190404161032740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190404161032740.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190404162714596.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190404162714596.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190406140012345.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190406140012345.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190406160453989.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190406160453989.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190406160500034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190406160500034.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190409154317920.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190409154317920.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190409200641442.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190409200641442.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190418204037498.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190418204037498.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190422153706588.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190422153706588.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190422184503191.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190422184503191.png -------------------------------------------------------------------------------- /hadoop/assets/image-20190516151757410.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hadoop/assets/image-20190516151757410.png -------------------------------------------------------------------------------- /hbase/assets/image-20190509192523734.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hbase/assets/image-20190509192523734.png -------------------------------------------------------------------------------- /hbase/assets/image-20190515141849276.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hbase/assets/image-20190515141849276.png -------------------------------------------------------------------------------- /hbase/assets/image-20190515142113174.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hbase/assets/image-20190515142113174.png -------------------------------------------------------------------------------- /hive/assets/image-20190516112327768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hive/assets/image-20190516112327768.png -------------------------------------------------------------------------------- /hive/assets/image-20190611193250747.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/hive/assets/image-20190611193250747.png -------------------------------------------------------------------------------- /kafka/assets/image-20200818180124497.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/kafka/assets/image-20200818180124497.png -------------------------------------------------------------------------------- /kafka/assets/image-20200819002600829.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/kafka/assets/image-20200819002600829.png -------------------------------------------------------------------------------- /lucene/assets/image-20190530161227604.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/lucene/assets/image-20190530161227604.png -------------------------------------------------------------------------------- /NLP推荐系统/assets/image-20190524013340993.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/NLP推荐系统/assets/image-20190524013340993.png -------------------------------------------------------------------------------- /NLP推荐系统/assets/image-20190525141332843.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/NLP推荐系统/assets/image-20190525141332843.png -------------------------------------------------------------------------------- /NLP推荐系统/assets/image-20190525144106396.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/NLP推荐系统/assets/image-20190525144106396.png -------------------------------------------------------------------------------- /NLP推荐系统/assets/image-20190525144551453.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/NLP推荐系统/assets/image-20190525144551453.png -------------------------------------------------------------------------------- /NLP推荐系统/assets/image-20190606005328504.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/NLP推荐系统/assets/image-20190606005328504.png -------------------------------------------------------------------------------- /NLP推荐系统/assets/image-20190606005535462.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/NLP推荐系统/assets/image-20190606005535462.png -------------------------------------------------------------------------------- /hive/Mongo_to_Es.md: -------------------------------------------------------------------------------- 1 | ## Mongo_to_Es 2 | 3 | 1. ##### 全量同步 4 | 2. ##### 增量同步 5 | 3. ##### 当增量同步的时间点接近当前时间,切换业务读写ES,当增量同步任务停止,即可认为同步完成,关闭同步服务 6 | 7 | -------------------------------------------------------------------------------- /lucene/IKAnalyzer.md: -------------------------------------------------------------------------------- 1 | ## IKAnalyzer 2 | 3 | 4 | 5 | ### 参考: 6 | 7 | [源码分析](https://blog.csdn.net/conansonic/article/details/52488154) 8 | 9 | -------------------------------------------------------------------------------- /nifi/Apache Nifi Info.md: -------------------------------------------------------------------------------- 1 | ## Nifi 2 | 3 | https://community.hortonworks.com/content/kbentry/1282/sample-hdfnifi-flow-to-push-tweets-into-solrbanana.html -------------------------------------------------------------------------------- /kafka/assets/F1E3C6D3-2FAB-4CC4-9CF4-B7DDB455F236.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/kafka/assets/F1E3C6D3-2FAB-4CC4-9CF4-B7DDB455F236.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/05ED9F87-3992-4766-87DF-DFFB0B618E9E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/05ED9F87-3992-4766-87DF-DFFB0B618E9E.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/0F9605B0-5C12-4ECC-8F98-D92D24D6BACA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/0F9605B0-5C12-4ECC-8F98-D92D24D6BACA.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/29990C57-A80D-431B-9317-FEEED7409048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/29990C57-A80D-431B-9317-FEEED7409048.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/3D849ABB-2951-4577-81FD-77B8D102E43D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/3D849ABB-2951-4577-81FD-77B8D102E43D.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/46F38883-EE81-449B-9347-F468DB6C188E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/46F38883-EE81-449B-9347-F468DB6C188E.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/47D1B806-0DC6-426B-B223-F4B3B0462C35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/47D1B806-0DC6-426B-B223-F4B3B0462C35.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/95B7BFE7-79BC-4DA9-B19D-D18C4156BAC9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/95B7BFE7-79BC-4DA9-B19D-D18C4156BAC9.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/9C68FEDE-D953-445C-B358-D06FBC10D3D1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/9C68FEDE-D953-445C-B358-D06FBC10D3D1.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/A4E15A30-0211-4857-B3C3-F132486266FA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/A4E15A30-0211-4857-B3C3-F132486266FA.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/ACE12C43-07EC-4F84-A384-1398426B3871.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/ACE12C43-07EC-4F84-A384-1398426B3871.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/B63EBA92-52F3-408C-8502-75EB6356C93F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/B63EBA92-52F3-408C-8502-75EB6356C93F.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/C044020C-68E4-43AE-8A8C-29F99E7E5E3D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/C044020C-68E4-43AE-8A8C-29F99E7E5E3D.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/D2657C77-D0EB-4CFB-A0B2-4A4BA8F6D642.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/D2657C77-D0EB-4CFB-A0B2-4A4BA8F6D642.png -------------------------------------------------------------------------------- /HDP/HDP安装/HDP安装.resources/ED723A40-6057-4B78-AE15-B0881D05EBB2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/HDP/HDP安装/HDP安装.resources/ED723A40-6057-4B78-AE15-B0881D05EBB2.png -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/0561FA27-9671-4AB3-B7EA-1F9F061CDBA9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/0561FA27-9671-4AB3-B7EA-1F9F061CDBA9.jpg -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/2AB2F0E8-827F-49B8-8E45-CD2E7A68F416.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/2AB2F0E8-827F-49B8-8E45-CD2E7A68F416.jpg -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/385D2158-4440-4E25-89C1-4E7DD52D36EB.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/385D2158-4440-4E25-89C1-4E7DD52D36EB.jpg -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/38968272-5D7B-47FF-82A7-C2552742BBA8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/38968272-5D7B-47FF-82A7-C2552742BBA8.jpg -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/6F2549C3-4036-4B2D-8ED7-607CA41A1A03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/6F2549C3-4036-4B2D-8ED7-607CA41A1A03.jpg -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/85BC2E7A-55B0-4DAC-A974-CC0090A48284.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/85BC2E7A-55B0-4DAC-A974-CC0090A48284.jpg -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/86EF6375-BDA8-4BF6-8C82-96BE3E2B9CE9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/86EF6375-BDA8-4BF6-8C82-96BE3E2B9CE9.png -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/A604A035-5DDE-4748-A08C-AD86BA3491ED.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/A604A035-5DDE-4748-A08C-AD86BA3491ED.jpg -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/B1E06C89-FF01-4660-B0E5-43FD88414CF2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/B1E06C89-FF01-4660-B0E5-43FD88414CF2.png -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/CEF30277-BB3A-49E0-B5CF-6A179A37FC19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/CEF30277-BB3A-49E0-B5CF-6A179A37FC19.jpg -------------------------------------------------------------------------------- /CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/D21BF47F-406C-4A23-ABBA-35ABFF22027A.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conch-stack/conch-bigdata/HEAD/CDH/Cloudera6.0.0安装/Cloudera6.0.0安装.resources/D21BF47F-406C-4A23-ABBA-35ABFF22027A.jpg -------------------------------------------------------------------------------- /flink/flink_info.md: -------------------------------------------------------------------------------- 1 | Flink: 2 | 3 | - 低延迟(毫秒级) 4 | - 高吞吐(每秒千万级别) 5 | - 准确性(Exactly-once语义:EventTime) 6 | - 已用性(SQL、TableAPI、DatasStreamAPI) 7 | 8 | 9 | 10 | ![image-20201021190650449](assets/image-20201021190650449.png) -------------------------------------------------------------------------------- /flink/doc.md: -------------------------------------------------------------------------------- 1 | [https://github.com/bjmashibing/Flink-Study/blob/master/docs/Flink%E8%B6%85%E7%A5%9E%E6%96%87%E6%A1%A3.md](https://github.com/bjmashibing/Flink-Study/blob/master/docs/Flink超神文档.md) 2 | 3 | 4 | 5 | https://learn.kaikeba.com/catalog/211861?type=1 -------------------------------------------------------------------------------- /hbase/HBase-Spark.md: -------------------------------------------------------------------------------- 1 | ## HBase-Spark 2 | 3 | ##### HBase and Spark Streaming 4 | 5 | - 使用HBase存储Spark Streaming的中读取Kafka的offect信息 6 | 7 | - 使用HBase累加实现流式窗口数据的累加 8 | 9 | - ```java 10 | table.incrementColumnValue(rowkey,cf,cq,value) 11 | ``` 12 | 13 | - 动态表名 14 | - 使用脚本提前创建HBase的表,半年、一年的创建 15 | 16 | -------------------------------------------------------------------------------- /flume/flume-kafka.md: -------------------------------------------------------------------------------- 1 | ## Flume整合Kafka 2 | 3 | - 分区优化 4 | - 相同的用户,进入Kafka的同一分区,后续聚合等组件可提高效率(Spark Shuffle) 5 | - 官方Kafka Sink支持读取header中topic、key作为kafka的主题和分区key值,且会覆盖配置文件中的topic配置 6 | - 实现:添加一个filter往Flume Event中添加key header 7 | - 官方支持的拦截器 8 | - Search and Replace Interceptor: 查询,替换 9 | - Regex Extractor Interceptor:正在匹配,匹配到的值作为header 10 | - 自定义拦截器 11 | - 动手实现,可应对后续复杂的数据场景(深度过滤) -------------------------------------------------------------------------------- /hadoop/企业级解决方案.md: -------------------------------------------------------------------------------- 1 | ## 企业级解决方案 2 | 3 | ### 集群角色分配策略 4 | 5 | #### 分配图谱 6 | 7 | TODO 8 | 9 | #### NFSGateways 10 | 11 | TODO 12 | 13 | #### JournalNodes 14 | 15 | 如何部署? 16 | 17 | #### Zeppelin 18 | 19 | 基于Web的交互式分析工具 20 | 21 | TODO配置使用 22 | 23 | 24 | 25 | ### 集群安全配置策略 26 | 27 | #### Knox网关 28 | 29 | > * KnoxGateway 同Ambari-server安装在同一台机器上:因为:TODO 30 | > 31 | > * 基于Jetty的高性能反向代理服务器,内置过滤器链来处理URL 32 | > * 支持LADP用户身份认证 33 | 34 | ##### LADP 35 | 36 | 37 | 38 | ### -------------------------------------------------------------------------------- /spark/Spark_Stream02.md: -------------------------------------------------------------------------------- 1 | ## Spark Streaming 优化 2 | 3 | - 自己维护Kafka的offect 4 | 5 | - 现在Kafka的分区消费速率,防止高峰期增加Spark集群资源压力 6 | 7 | - ```java 8 | sparkConf.set("spark.streaming.kafka.maxRatePerPartition", "10000"); 9 | ``` 10 | 11 | - 注册序列化Kryo,提速网络传输、减少内存消耗 12 | 13 | - ```java 14 | sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"); 15 | sparkConf.set("spark.kryo.registrator", "com.djt.stream.registrator.MyKryoRegistrator"); 16 | ``` 17 | 18 | -------------------------------------------------------------------------------- /hadoop/存储模式.md: -------------------------------------------------------------------------------- 1 | ## 数据存储模式 2 | 3 | ### 数据存储格式 4 | 5 | 列式: 6 | 7 | ​ Parquet 8 | 9 | ​ ORC 10 | 11 | ​ 文件 12 | 13 | ​ Sequence文件 14 | 15 | 16 | 17 | ### 数据压缩算法 18 | 19 | ![image-20190331183257543](assets/image-20190331183257543.png) 20 | 21 | 22 | 23 | 考虑压缩速度和压缩文件的可分割性 24 | 25 | 26 | 27 | 推荐Snappy 28 | 29 | 新实时压缩:Zstandard 30 | 31 | 32 | 33 | ### 数据序列化 34 | 35 | ​ Avro 36 | 37 | ​ Protobuf 38 | 39 | ​ Thrift 40 | 41 | 42 | 43 | 关系:Snappy压缩算法将二进制流(AvroIO)压缩成Parquet文件 44 | 45 | ![image-20190516151757410](assets/image-20190516151757410.png) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | .sts4-cache 12 | 13 | ### IntelliJ IDEA ### 14 | .idea 15 | *.iws 16 | *.iml 17 | *.ipr 18 | .mvn 19 | mvnw.cmd 20 | mvnw 21 | logs/ 22 | log/ 23 | .flattened-pom.xml 24 | */.flattened-pom.xml 25 | */target/ 26 | */logs/ 27 | */log/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /build/ 32 | /nbbuild/ 33 | /dist/ 34 | /nbdist/ 35 | /.nb-gradle/ 36 | \.DS_Store 37 | 38 | /lib 39 | /checkpoint 40 | 41 | -------------------------------------------------------------------------------- /hive/数据存储选型讨论.md: -------------------------------------------------------------------------------- 1 | Solr: 2 | 优点: 3 | 官方功能支持多 4 | 存储索引pdf等二进制文档数据 5 | 支持动态类型 6 | 可与HDFS打通 7 | 存储和索引 8 | 缺点: 9 | Solr嵌套文档不支持 10 | 无权限控制 11 | 12 | ES: 13 | 优点: 14 | 比Solr快,可配置近实时索引 15 | 原生支持嵌套(嵌套数量不能多于50个) 16 | 多租户,便于权限控制 17 | 插件多,大部分功能需插件支持 18 | 缺点: 19 | 支持的数据类型比solr少 20 | 不依赖ZK 21 | (目前)与Hadoop打通,局限于数据的互通,存储和索引依旧由ES 22 | 23 | MongoDB: 24 | 分片存储??? 25 | 26 | 公共的问题 27 | 主分片在所有创建时就已经确定了,如果无法水平扩容主分片:主分片的数量决定了能存储数据的大小(实际大小取决于你的数据、硬件和使用场景) 28 | 29 | Solr对比ES 30 | http://solr-vs-elasticsearch.com/ 31 | 32 | -------------------------------------------------------------------------------- /NLP推荐系统/指标.md: -------------------------------------------------------------------------------- 1 | ##### 报表指标 2 | 3 | | 常规 | 用户量、新用户量、UGC(社交产品)、销量、付费量、推广期间各种数据 | 4 | | ---------------- | ------------------------------------------------------------ | 5 | | 渠道/流量分析 | 分析监控引流渠道优劣 | 6 | | 用户核心转化率 | 统计B端付费率、C端购买率 CVR CTR | 7 | | 用户使用时长监控 | 用户活跃度、产品验证 | 8 | | 用户流失情况 | 监控用户流失率(1,3,7,30) | 9 | | 活跃用户动态 | 关注活跃用户动态 | 10 | 11 | ##### 数据分析 12 | 13 | 分析为什么会产生上面报表所出现的状况 14 | 15 | 可指导产品设计,指导商业推广,指导开发方式:数据驱动产品 16 | 17 | 18 | 19 | ##### 机器学习 20 | 21 | 使用机器算法消化数据 22 | 23 | 用户(物品)特征描述,在算法建模和产品上使用 24 | 25 | 用户(物品)生命周期监测:在建模上使用 26 | 27 | -------------------------------------------------------------------------------- /hbase/HBase-Rowkey-设计.md: -------------------------------------------------------------------------------- 1 | ## HBase-Rowkey设计 2 | 3 | 4 | 5 | **HBase中拼接的Rowkey的每一段需要定长,为后续scan提供便利** 6 | 7 | 8 | 9 | ##### rowkey = [userid]:[yyyymmdd] 10 | 11 | - userid放前面,可以避免数据因为time的连续性导致一段时间内,数据进入同一Region分区,导致热点数据问题 12 | - userid放前面,可以在同一用户数据连续查询时,提供查询速度 13 | 14 | 15 | 16 | ##### 小时维度的统计 17 | 18 | - cq = 小时为维度的long值 19 | 20 | - 表名:hour_table ,设计成宽表 21 | - rowkey = [userid]:[yyyymmdd] 22 | - cf = a 23 | - cq = 00 - 23 的long时间戳值 24 | - value = 值 25 | 26 | 27 | 28 | ##### 天维度统计 29 | 30 | - cq = 天为维度的int值 31 | - 表名:day_table_yyyyMM ,以月为维度建表 32 | - rowkey = [userid] 33 | - cf = a 34 | - cq = 01 - 31 天编码 35 | - value = 值 36 | 37 | 38 | 39 | ##### rowkey的设计取决于业务 40 | 41 | - 业务查询维度多,则rowkey可以继续往后扩展 42 | - 但也不需要全部交给rowkey来做 43 | - 可以设计成高表:每个月生成一张表,表名带日期信息 44 | - 设计成宽表:每个cq列的取值范围代表的一个维度 -------------------------------------------------------------------------------- /spark/Spark_Stream01.md: -------------------------------------------------------------------------------- 1 | ##### DStream 2 | 3 | 一组RDD流 4 | 5 | 将连续的数据 持久化、离散化、进行批量处理 6 | 7 | - 持久化:接收的数据暂存于executor中 8 | - 离散化:按时间分片,形成处理单元 9 | - 分片处理:分批处理 10 | 11 | 12 | 13 | ##### DStream Graph 14 | 15 | 反向**依赖关系**:保存DStream的依赖关系 16 | 17 | 对后期生成RDD Graph起关键作用 18 | 19 | 20 | 21 | ##### Transformation & output 22 | 23 | - Transformation 24 | - reduce 25 | - count 26 | - map 27 | - flatMap 28 | - join 29 | - reduceByKey 30 | - Output 31 | - print 32 | - saveAsObjectFile 33 | - saveAsTextFile 34 | - saveAsHadoopFiles: 将一批数据输出到hadoop的文件系统中,用批量数据的开始时间戳来命名 35 | - forEachRDD:允许用户对DStream的每一批数据对应的RDD本身做任意操作 36 | 37 | 38 | 39 | ### 架构 40 | 41 | Master:优化,生成DStream Graph 42 | 43 | Worker:执行job 44 | 45 | Client:发送数据 46 | 47 | 48 | 49 | ### API 50 | 51 | 两种方式接受kafka数据 52 | 53 | - Direct 54 | 55 | - Receiver 56 | 57 | 58 | 59 | ### Structured Streaming 60 | 61 | -------------------------------------------------------------------------------- /hive/Hive函数.md: -------------------------------------------------------------------------------- 1 | ## Hive函数 2 | 3 | ```sql 4 | conact_ws(',', collect_list(user_id)) 5 | 6 | case order_dow when '0' then 1 else 0 end 7 | Select case 100 when 50 then 'tom' when 100 then 'mary'else 'tim' end from lxw_dual; 8 | 9 | row_number() over (partition by user_id order by prod_cnt desc) rank 10 | 11 | regexp_replace(sentence, ' ', '') 12 | select regexp_extract('foothebar', 'foo(.*?)(bar)', 1) fromlxw_dual; 13 | 14 | -- url解析 15 | -- 语法:parse_url(string urlString, string partToExtract [, stringkeyToExtract]) 16 | -- 返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO. 17 | select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') from article; 18 | select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY','k1') from article; 19 | ``` 20 | 21 | 22 | 23 | 参考: 24 | 25 | [博客1](https://blog.csdn.net/wisgood/article/details/17376393) 26 | 27 | -------------------------------------------------------------------------------- /hbase/info_go_phoenix_hbase.md: -------------------------------------------------------------------------------- 1 | Go Thrift HBase: 2 | https://www.jianshu.com/p/5e7bb33e8e12 3 | 4 | GoHBase: 5 | https://studygolang.com/articles/16151 6 | https://github.com/tsuna/gohbase 7 | 8 | GoPhoenix: 9 | https://github.com/apache/calcite-avatica-go 10 | 文档: 11 | https://calcite.apache.org/avatica/docs/go_client_reference.html 12 | https://phoenix.apache.org/server.html 13 | 14 | Apache Calcite: 15 | SQL解析器 16 | https://calcite.apache.org/community/ 17 | 18 | Phoenix 官方文档: 19 | http://phoenix.apache.org/Phoenix-in-15-minutes-or-less.html 20 | 21 | 22 | Go Database/sql: 23 | https://golang.org/pkg/database/sql/ 24 | https://yq.aliyun.com/articles/178898?utm_content=m_29337 25 | 26 | Go Tools: 27 | https://github.com/AlexanderChen1989/ha 28 | 29 | 30 | Phoenix实战: 31 | Phoenix关于时区的处理方式说明 32 | https://mp.weixin.qq.com/s/EL1Rfj2WbdXJj3AkjhS4ZA 33 | 34 | HBase实战: 35 | 百度智能监控场景下的HBase实践 36 | https://mp.weixin.qq.com/s/GIdzt1Zn_wOaiDKoHNITfw 37 | 38 | ​ HBase Group 39 | 40 | ​ http://hbase.group/slides/188#page=11 41 | 42 | -------------------------------------------------------------------------------- /hbase/HBase使用场景.md: -------------------------------------------------------------------------------- 1 | ## HBase使用场景 2 | 3 | 特点: 4 | 5 | - 强一致性读写 6 | - 自动分片 7 | 8 | 因为HDFS在小于5个数据节点时,基本上体现不出来它的优势 9 | 10 | 11 | 12 | HBase作为默认的大数据时代的存储,基本解决以下三大类的场景: 13 | 14 | ![image-20190515141849276](assets/image-20190515141849276.png) 15 | 16 | 1、平台类:存放是平台的产品,就是其它软件的存储,比如目前很就行的Kylin,阿里内部的日志同步工具TT,图组件Titan等。此类存放的往往平台的数据,有时候往往是无业务含义的。作为平台的底层存储使用。 17 | 2、用户行为类:此类主要是面向各个业务系统。这里的用户不仅仅指的人,也包括物,比如物联网。在阿里主要还是人产生的数据,比如:淘宝收藏夹、交易数据、旺旺聊天记录等等。这里使用比较直接,就直接存放HBase,再读取。难度就是需要支持千万级别的并发写访问及读取,需要解决服务质量的问题。 18 | 3:报表类的需求:比如报表、大屏等,如阿里巴巴的天猫双十一大屏。 19 | 20 | 21 | 22 | HBase与Kudu对比: 23 | 24 | ![image-20190515142113174](assets/image-20190515142113174.png) 25 | 26 | 27 | 28 | - Facebook 29 | - Facebook用HBase存储在线消息,每天数据量近百亿,每月数据量250 ~ 300T, HBase读写比基本在1:1,吞吐量150w qps 30 | - 小米 31 | - 10+在线HBase集群,好几百台服务器,米聊历史数据,消息push系统等多个重要应用系统都建立在HBase基础之上 32 | - 网易 33 | - 哨兵监控系统,云信历史数据,日志归档数据等一系列重要应用底层都由HBase提供服务。 34 | 35 | ##### 适用场景 36 | 37 | 1. 写密集型应用,每天写入量巨大,而相对读数量较小的应用,比如IM的历史消息,游戏的日志等等 38 | 39 | 2. 不需要复杂查询条件来查询数据的应用,HBase只支持基于rowkey的查询,对于HBase来说,单条记录或者小范围的查询是可以接受的,大范围的查询由于分布式的原因,可能在性能上有点影响,而对于像SQL的join等查询,HBase无法支持。 40 | 41 | 3. 对性能和可靠性要求非常高的应用,由于HBase本身没有单点故障,可用性非常高。 42 | 43 | 数据量较大,而且增长量无法预估的应用,HBase支持在线扩展,即使在一段时间内数据量呈井喷式增长,也可以通过HBase横向扩展来满足功能。 -------------------------------------------------------------------------------- /flume/flume02.md: -------------------------------------------------------------------------------- 1 | ## Flume02 - 高级功能 2 | 3 | 实际架构: 4 | 5 | image-20200902090523439 6 | 7 | 8 | 9 | **Sink组:设置Sink组,同一个Sink组内有多个子Sink,不同Sink之间可以配置成负载均衡或故障转移** 10 | 11 | - 负载均衡(load_balance) 12 | 13 | ```shell 14 | a1.sinkgroups = g1 15 | # 组内的子Sink 16 | a1.sinkgroups.g1.sinks = k1 k2 17 | # 负载均衡 18 | a1.sinkgroups.g1.processor.type = load_balance 19 | # 负载均衡下,需设置此值为true,如果Sink失败,则将该Sink放入黑名单 20 | a1.sinkgroups.g1.processor.backoff = true 21 | # 失败Sink黑名单驻留时间 指数级增加 单位:ms 22 | a1.sinkgroups.g1.processor.selector.maxTimeOut = 30000 23 | # 负载均衡算法 随机 random、轮询 round_robin、或自定义 24 | a1.sinkgroups.g1.processor.selector = random 25 | ``` 26 | 27 | 28 | 29 | - 故障转移 30 | 31 | ```shell 32 | a1.sinkgroups = g1 33 | # 组内的子Sink 34 | a1.sinkgroups.g1.sinks = k1 k2 35 | # 故障转移 36 | a1.sinkgroups.g1.processor.type = failover 37 | # 指定Sink组内各Sink的优先级,数值越大优先级越高 38 | a1.sinkgroups.g1.processor.priority.k1 = 5 39 | a1.sinkgroups.g1.processor.priority.k1 = 10 40 | # 等待失败的Sink恢复的最大时间,默认 30000ms 41 | a1.sinkgroups.g1.processor.maxpenalty = 5000 42 | ``` 43 | 44 | 45 | 46 | - 分层架构 47 | 48 | - 日志采集层 49 | - 日志聚合层 50 | 51 | - 监控重启 52 | 53 | - Shell 监控脚本,监控某个进程是否存在,如果不存在,则调用重启脚本 54 | - 开启JMX,接入监控框架 55 | 56 | - 动态扩缩容 57 | 58 | - sink需要修改负载均衡配置,滚回重启 59 | 60 | - Kafka Channel简化架构 61 | - Source1(日志收集层) -> Kafka Channel -> sink2(日志聚合层) 62 | - 问题:Kafka的重复消费语义问题 63 | 64 | 65 | 66 | - 端点续传 67 | - Taildir Source:参考flume01.md文档 68 | 69 | 70 | 71 | - log4j滚动生产文件问题 72 | - 滚动生成文件时,会将文件重命名为加上日期的日志文件,并将原文件置空,会导致flume重复消费问题 73 | - 解决 74 | - 修改Taildir Source源码,打包编译,上传到flume安装目录的plugin.d目录下,以插件的方式加入flume 75 | - 使用:Custom Source 自定义Source的方式配置flume -------------------------------------------------------------------------------- /hbase/HBase优化.md: -------------------------------------------------------------------------------- 1 | ## HBase优化 2 | 3 | 列簇数量: 建议2个或2个一下 4 | 5 | 索引表数量:建议不超过10个 6 | 7 | ``` 8 | phoenix.index.maxIndexesPerTable=10 9 | ``` 10 | 11 | ![image-20190509192523734](assets/image-20190509192523734.png) 12 | 13 | ``` 14 | 问:能够问一下,如果hbase 表rowkey 前缀做了散列,而查询的时候我只有后缀,这该怎么查询呢? 15 | 答:正则过滤器 16 | ``` 17 | 18 | ``` 19 | HDFS 短路读 20 | RowKey优化,添加时间信息 21 | HBase cache 22 | hfile文件数量是否太多了?compact减少 23 | 内存太小了吧,32g以上 24 | ``` 25 | 26 | 27 | ## Phoenix优化 28 | 29 | jdbc:phoenix:thin:url=http://localhost:8765?doAs=alice 30 | 31 | 问题: 32 | 33 | 1. 字段映射 34 | 35 | 2. 索引 异步 ASYNC 36 | Example: create index if not exists event_object_id_idx_b on trans.event (object_id) ASYNC UPDATE_CACHE_FREQUENCY=60000; 37 | Create local indexes for write-heavy use cases. 38 | 索引表和主表放在同一RegionServer上 39 | 当查询字段不是索引字段时,索引表也会正常使用 40 | Create global indexes for read-heavy use cases. 41 | To save read-time overhead, consider creating covered indexes. 节省时间开销 42 | 索引表为全局表,各个节点上都有 43 | 当查询字段不是索引字段时,索引表将失效,导致全局扫描主表 44 | 45 | 46 | Use covered indexes to convert table scans into efficient point lookups or range queries over the index table instead of the primary table: CREATE INDEX index ON table( … )INCLUDE( … ) 47 | 48 | 49 | 50 | 3. 数据压缩 51 | 52 | 4. 对象序列化 53 | 54 | 5. 删除 55 | 56 | ​ When deleting a large data set, turn on autoCommit before issuing the DELETE query 57 | 58 | 6. 主键 59 | 60 | ​ If the primary key is monotonically increasing, create salt buckets:加盐可防止数据写入热点问题 61 | 62 | 63 | 64 | 映射:HBase中的表 65 | 如果需要在phoenix中操作直接在hbase中创建的表,则需要在phoenix中进行表的映射。映射方式有两种:视图映射和表映射。 66 | 67 | 68 | 69 | #### 性能测试: 70 | 71 | https://www.cnblogs.com/ballwql/p/8371234.html 72 | 73 | -------------------------------------------------------------------------------- /flink/flink实战(2).md: -------------------------------------------------------------------------------- 1 | ## Flink实战(2) 2 | 3 | > 算子 4 | 5 | - map 6 | 7 | - flatMap 8 | 9 | - filter 10 | 11 | - keyBy: 12 | 13 | - POJO对象或者Tuple2以上对象 14 | - 容易出现数据倾斜 15 | - key类型限制: 16 | - 不能是没有覆盖hashcode方法的POJO 17 | - 不能是数组 18 | 19 | - reduce 20 | 21 | - fold !! 已废弃 22 | 23 | - aggregations 24 | 25 | - sum/min/minBy/max/maxBy reduce 特例 26 | 27 | - min(返回指定字段的最大值,其他不变) 28 | - minBy(返回整个元素) 29 | 30 | - Interval join 31 | 32 | - KeyedStream,KeyedStream -> DataStream 33 | 34 | - 在给定周期内,按照指定的key对两个KeyedStream进行join操作 35 | 36 | - 把一定时间范围内的相关的分组数组拉成一个宽表 37 | 38 | ```java 39 | keyedStream1.intervalJoin(keyedStream2) 40 | .between(Time.milliseconds(-2), Time.milliseconds(2)) 41 | .upperBoundExclus() 42 | .lowerBoundExclus() 43 | .process(new ProcessJoinFunction out) { 44 | out.collect(new C()); 45 | } 46 | ``` 47 | 48 | - connect & union 49 | 50 | - connect后生成ConnectedStreams 51 | - 对两个流的数据应用不同处理方式,并且双流之间可以共享状态(比如计数) 52 | - 这在第一个流的输入会影响第二个流时,会非常有用 53 | - 只能连接两个流 54 | - CoMap 55 | - CoFlatMap 类似map和flatMap,只不过在ConnectedStream上用 56 | - 一起运算,节约资源??? 57 | - union合并多个流,新流会包含所有流的数据 58 | - DataStream* -> DataStream 59 | - 可合并多个流 60 | - !! connect连接的两个流类型可以不一致,而union连接的流的类型必须一致 61 | 62 | - split & select !! 已废弃 63 | 64 | - 先拆,再选 65 | - split: 66 | - DataStream -> SplitStream 67 | - 按照指定标准将DataStream拆分成多个流 68 | - select: 69 | - SplitStream -> DataStream 70 | - 搭配split使用,从SplitStream中选择一个或多个流 71 | 72 | - project 73 | 74 | - 从Tuple中选择属性子集 类似 mongodb聚合的project操作 75 | - 从Tuple中选择属性子集 类似 mongodb聚合的project操作 76 | - 只支持Tuple类型的event数据 77 | - 仅限JavaAPI 78 | - intput.project(0,2): 只要Tuple的 第一个和第三个元素 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /架构设计.md: -------------------------------------------------------------------------------- 1 | ## 架构设计与讨论 2 | 3 | ### 爬虫数据存储解析逻辑 4 | 5 | - 爬虫数据 6 | - 保存成zip包,备份(清理策略) 7 | - 调解析接口(post) 8 | - 解析 9 | - 跑爬虫数据解析任务(接收post参数解析) 10 | - 解析重跑逻辑(数据源?zip包) 11 | - 原始数据 12 | - 报告 13 | - 接收中控跑报告任务 14 | - 拉取原始数据处理 15 | - 处理完成回调中控 16 | 17 | 18 | 19 | ### [Hive分析](https://cwiki.apache.org/confluence/display/Hive/LanguageManual) 20 | 21 | - 作为数据仓库 22 | - 提供数据存储: 23 | - load数据从文件、HDFS 24 | - 查询结果插入Hive或文件系统 25 | - 利用SQL插入值到Hive表 26 | - 批处理不可变的大数据集 27 | - 不支持行级更新删除操作 28 | - 现在应该可以支持,但不推荐使用:需要Hive Transactions支持[ACID](https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions) 29 | - 支持各种表关联操作 30 | - 作为查询引擎(OLAP) 31 | 32 | ```sql 33 | // Insert value Demo 34 | CREATE TABLE students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2)) 35 | CLUSTERED BY (age) INTO 2 BUCKETS STORED AS ORC; 36 | 37 | INSERT INTO TABLE students 38 | VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32); 39 | 40 | // 根据时间分区(探索原理) 41 | CREATE TABLE pageviews (userid VARCHAR(64), link STRING, came_from STRING) 42 | PARTITIONED BY (datestamp STRING) CLUSTERED BY (userid) INTO 256 BUCKETS STORED AS ORC; 43 | 44 | INSERT INTO TABLE pageviews PARTITION (datestamp = '2014-09-23') 45 | VALUES ('jsmith', 'mail.com', 'sports.com'), ('jdoe', 'mail.com', null); 46 | 47 | INSERT INTO TABLE pageviews PARTITION (datestamp) 48 | VALUES ('tjohnson', 'sports.com', 'finance.com', '2014-09-23'), ('tlee', 'finance.com', null, '2014-09-21'); 49 | 50 | INSERT INTO TABLE pageviews 51 | VALUES ('tjohnson', 'sports.com', 'finance.com', '2014-09-23'), ('tlee', 'finance.com', null, '2014-09-21'); 52 | ``` 53 | 54 | 55 | 56 | ### HBase 57 | 58 | 支持十亿级别的大数据实时高性能读写(基于Key-Value) 59 | 60 | 支持上亿列、上百万行的 61 | 62 | 保证原子性 63 | 64 | LSM树:存储算法;利用Memstore排序数据后,再存入HFile(尽量保证数据是顺序存储到磁盘);是对B+tree的改进 65 | 66 | 压缩元数据(rowkey、column family、cq):压缩与解压也是消耗性能的,根据数据的使用需求选择(读写场景) 67 | 68 | 69 | 70 | > 不支持表关联 71 | > 72 | > ​ 曲线救国: 73 | > 74 | > 1. 在存入HBase前,进行关联 75 | > 2. 在MapReduce中进行关联 76 | 77 | 78 | 79 | > 不适用场景: 80 | > 81 | > - 不适合数据分析场景 82 | > - 单表数据量不超过千万不建议用 83 | 84 | 85 | 86 | > 使用场景: 87 | > 88 | > - 单表数据量超千万,而且并发高 89 | > - 数据分析需求弱,或不需要那么灵活或实时 90 | 91 | 92 | 93 | 94 | 95 | ### 搜索引擎 96 | 97 | 需要反向索引的场景 98 | 99 | 100 | 101 | ### 爬虫数据存储讨论 102 | 103 | > * Hive 104 | > 105 | > 只存储数据:Insert语法 106 | > 107 | > 研究Hive的分区Partition实现方式,根据时间分区,后期历史数据可根据分区删除 108 | 109 | 110 | 111 | ### 报告数据存储 112 | 113 | > - HBase 114 | 115 | 116 | 117 | ### 日志数据存储讨论 118 | 119 | ES 120 | 121 | HBase 122 | 123 | -------------------------------------------------------------------------------- /hive/Hive权限.md: -------------------------------------------------------------------------------- 1 | ## Hive权限 2 | 3 | ``` 4 | sudo -u hdfs hdfs dfs -mkdir /user/admin 5 | sudo -u hdfs hdfs dfs -chown admin:hadoop /user/admin 6 | ``` 7 | 8 | 9 | 10 | ```sql 11 | -- TODO 尝试使用 hive 用户登录shell 12 | sudo -u hive hive 13 | load data local inpath '/xxx' into table xxx; 14 | ``` 15 | 16 | 17 | 18 | https://blog.csdn.net/yrg5101/article/details/88837468 19 | 20 | https://www.jianshu.com/p/dcef793cf395 21 | 22 | 23 | 24 | ##### hive.server2.enable.doAs 25 | 26 | ``` 27 | 默认情况下,HiveServer2以提交查询的用户身份执行查询处理。但是,如果以下参数设置为false,则查询将以运行hiveserver2进程的用户身份运行。 28 | hive.server2.enable.doAs - 模拟连接的用户,默认为true。 29 | hive.server2.enable.doAs设置成false则,yarn作业获取到的hiveserver2用户都为hive用户。 30 | 设置成true则为实际的用户名 31 | 32 | 要防止在不安全模式下发生内存泄漏,请通过将以下参数设置为true来禁用文件系统缓存(请参阅 HIVE-4501): 33 | fs.hdfs.impl.disable.cache - 禁用HDFS文件系统缓存,默认为false。 34 | fs.file.impl.disable.cache - 禁用本地文件系统缓存,默认为false。 35 | ``` 36 | 37 | 38 | 39 | https://blog.csdn.net/zqqnancy/article/details/51852794 40 | 41 | ```xml 42 | 43 | hive.security.authorization.enabled 44 | true 45 | 46 | 47 | 48 | hive.server2.enable.doAs 49 | false 50 | 51 | 52 | 53 | hive.users.in.admin.role 54 | hive 55 | 56 | 57 | 58 | hive.security.authorization.manager 59 | org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory 60 | 61 | 62 | 63 | hive.security.authenticator.manager 64 | org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator 65 | ``` 66 | 67 | 68 | 69 | ##### 我的修改 70 | 71 | ``` 72 | -- 1. 在Ambari中hive里面设置custom hive-site下添加 73 | hive.users.in.admin.role=hdfs 74 | -- 2. 修改Advanced hiveserver2-site中 75 | hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory 76 | 原本为: 77 | hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.fallback.FallbackHiveAuthorizerFactory 78 | 79 | -- 3. 80 | sudo -u hdfs hive 81 | jdbc:hive2://xxx>set hive.users.in.admin.role; 82 | +--------------------------------+ 83 | | set | 84 | +--------------------------------+ 85 | | hive.users.in.admin.role=hdfs | 86 | +--------------------------------+ 87 | jdbc:hive2://xxx>show current roles; 88 | +---------+ 89 | | role | 90 | +---------+ 91 | | public | 92 | +---------+ 93 | jdbc:hive2://xxx>set role admin; 94 | INFO : OK 95 | jdbc:hive2://xxx>show roles; 96 | +---------+ 97 | | role | 98 | +---------+ 99 | | admin | 100 | | public | 101 | +---------+ 102 | jdbc:hive2://xxx>show current roles; 103 | +--------+ 104 | | role | 105 | +--------+ 106 | | admin | 107 | +--------+ 108 | ``` 109 | 110 | -------------------------------------------------------------------------------- /lucene/Solr基础语法.md: -------------------------------------------------------------------------------- 1 | ##### fTerm查询: 2 | 3 | q = {!term f=desc}芒 4 | 5 | 6 | 7 | ##### 查询参数: 8 | 9 | > **q 查询字符串** 10 | > 11 | > 例: 12 | > 13 | > ​ \*:\* 14 | > 15 | > ​ Name:张三 AND Address:北京 16 | 17 | > **fq 过虑查询(filter query)** 18 | > 19 | > 例:q=Name:张三&fq=createDate:[2014-06-18 TO 2015-12-18] 20 | > 21 | > ​ 找关键字”张三”,并且CreateDate是查询2014-06-18到2015-12-18之间的数据 22 | 23 | > **fl 指定返回那些字段内容,用逗号或空格分隔多个** 24 | > 25 | > 例:q=cat_s:(fantasy OR sci-fi)&fl=id,[child parentFilter=type_s:book] 26 | > 27 | > 【注:字段是严格区分大小写的】 28 | 29 | > **sort 排序** 30 | > 31 | > 例:(score desc, price asc)表示先 “score” 降序, 再 “price” 升序,默认是相关性降序 32 | 33 | > start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。 34 | > 35 | > rows - 指定返回结果最多有多少条记录,配合start来实现分页。 36 | 37 | > **df 默认搜索字段** 38 | > 39 | > 例:df=name 40 | 41 | > wt - (writer type)指定输出格式,可以有 xml, json, PHP, phps 42 | 43 | 44 | 45 | 46 | 47 | q.op 表示q 中 查询语句的 各条件的逻辑操作 AND(与) OR(或) 48 | 49 | hl 是否高亮 ,如hl=true 50 | 51 | hl.fl 高亮field ,hl.fl=Name,SKU 52 | 53 | hl.snippets :默认是1,这里设置为3个片段 54 | 55 | hl.simple.pre 高亮前面的格式 56 | 57 | hl.simple.post 高亮后面的格式 58 | 59 | facet 是否启动统计 60 | 61 | facet.field 统计field 62 | 63 | 64 | 65 | 66 | 67 | 2、 Solr运算符 68 | 69 | “:” 指定字段查指定值,如返回所有值: 70 | 71 | “?” 表示单个任意字符的通配 72 | 73 | “” 表示多个任意字符的通配(不能在检索的项开始使用或者?符号) 74 | 75 | “~” 表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。 76 | 77 | 邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10 78 | 79 | “^” 控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache 80 | 81 | 布尔操作符AND、|| 82 | 83 | 布尔操作符OR、&& 84 | 85 | 布尔操作符NOT、!、- (排除操作符不能单独与项使用构成查询) 86 | 87 | “+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在 88 | ( ) 用于构成子查询 89 | [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710] 90 | {} 不包含范围检索,如检索某时间段记录,不包含头尾 91 | date:{200707 TO 200710} 92 | / 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : / 93 | 94 | 注:①“+”和”-“表示对单个查询单元的修饰,and 、or 、 not 是对两个查询单元是否做交集或者做差集还是取反的操作的符号 95 | 96 |    比如:AB:china +AB:america,表示的是AB:china忽略不计可有可无,必须满足第二个条件才是对的,而不是你所认为的必须满足这两个搜索条件 97 | 98 |    如果输入:AB:china AND AB:america,解析出来的结果是两个条件同时满足,即+AB:china AND +AB:america或+AB:china +AB:america 99 | 100 |   总而言之,查询语法: 修饰符 字段名:查询关键词 AND/OR/NOT 修饰符 字段名:查询关键词 101 | 102 | 3、 Solr查询语法 103 | 104 | 1.最普通的查询,比如查询姓张的人( Name:张),如果是精准性搜索相当于SQL SERVER中的LIKE搜索这需要带引号(”“),比如查询含有北京的(Address:”北京”) 105 | 106 | 2.多条件查询,注:如果是针对单个字段进行搜索的可以用(Name:搜索条件加运算符(OR、AND、NOT) Name:搜索条件),比如模糊查询( Name:张 OR Name:李)单个字段多条件搜索不建议这样写,一般建议是在单个字段里进行条件筛选,如(Name:张 OR 李),多个字段查询(Name:张 + Address:北京 ) 107 | 108 | 3.排序,比如根据姓名升序(Name asc),降序(Name desc) 109 | 110 | 4.查询结果匹配 111 | 112 | 一般情况下solr默认是进行拆分匹配查询的,如:“苏小小”拆成“苏”,“小”,“小”等。但是如果要进行完全匹配 “苏小小” 可以将关键词用双引号括起来如下: 113 | 114 | 例如 : 115 | 116 | [http://localhost:8081/solr/select/?q=name:”苏小小”&version=2.2&start=0&rows=10&indent=on&sort=cDate](http://localhost:8081/solr/select/?q=name:”苏小小”&version=2.2&start=0&rows=10&indent=on&sort=cDate)desc&hl=true&hl.fl=content 117 | 118 | 注意:如果在搜索的目标上有一句话中包含这个关键字,那么这段话也会被搜索到,如:“很久很久以前苏小小就是很出名了”。千万不要以为只是关键字的内容才能搜索到。 -------------------------------------------------------------------------------- /serialization/Serialization Info.md: -------------------------------------------------------------------------------- 1 | ### 序列化工具 2 | 3 | - FackBook Thrift 语言支持多 4 | 5 | - Google Protobuf 压缩比大、解析速度快 6 | 7 | - Apache Avro 8 | - 动态类型: 不需要生成代码,将数据与Schema存放一起,方便构建通用的数据处理系统 9 | - 未标记的数据:读取Avro数据时 Schema是已知的,使得编码到数据中的类型信息变少,使得序列化后的数据量变少 10 | - 不需要显式指定域编号:处理数据时新旧Schema都是已知的,通过使用字段名即可解决兼容性问题 11 | 12 | 13 | 14 | ### IDL(Interface description language) 15 | 16 | - TODO 17 | 18 | 19 | 20 | ### 文件存储格式 21 | 22 | - 行式存储 23 | - 列式存储 24 | 25 | | 对比 | 行式存储 | 列式存储 | 26 | | :------- | -------------------------------------------------------- | ------------------------------------------------------------ | 27 | | 写性能 | 写入一次完成,性能高 | 将行记录拆分为单列存储,写次数多,时间花费大 | 28 | | 读性能 | 读取整行数据顺序读,性能高,读取几列数据时,需遍历无关列 | 读取整行数据需进行拼装,性能低,读取几列数据时,无需遍历无关列 | 29 | | 数据压缩 | 每行数据存储在一起,压缩比低 | 以列为单位存储数据,使得类型相同的数据存放在一起,对与压缩算法友好,压缩比高 | 30 | | 典型代表 | Text File、Sequence File | ORC(Hortonworks)、Parquet(Twitter)、CarbonData(华为) | 31 | | 描述 | 已行为单位,连续读取或写入同一行的所有列 | 写数据时将数据拆分为列,以列为单位存储(相同列存储在一起),读数据时,分别读取对应列,并**拼装成行** | 32 | 33 | 34 | 35 | #### Hadoop文件读取写入模块抽象 36 | 37 | - InputFormat 38 | - OutputFormat 39 | 40 | | 文件格式 | InputFormat | OutputFormat | 41 | | -------- | ----------------------- | ------------------------ | 42 | | Text | TextInputFormat | TextOutputFormat | 43 | | Sequence | SequenceFileInputFormat | SequenceFileOutputFormat | 44 | | ORC | OrcInputFormat | OrcOutputFormat | 45 | | Parquet | ParquetInputFormat | ParquetOutputFormat | 46 | 47 | 48 | 49 | #### 行式存储 50 | 51 | ##### Sequence File 52 | 53 | ​ Hadoop中提供的简单Key/Value二进制行式存储格式,用于存储文本格式无法存储的数据:二进制对象、图片、视频等 54 | 55 | - 物理存储分块 56 | - 未压缩的Sequence File格式 57 | - 行级压缩的Sequence File格式 58 | - 块级压缩的Sequence File格式 59 | 60 | 61 | 62 | #### 列式存储 63 | 64 | ##### Parquet 65 | 66 | ​ 为支持复杂的嵌套类型数据,配和高效压缩和编码技术,降低存储空间,提供IO效率 67 | 68 | ​ 先按行切分数据,形成Row Group,在每个Row Group中以列为单位存储数据 69 | 70 | - Row Group:一组行数据,内部以列为单位存储这些行。当往Parquet中写数据时,Row Group中的数据会缓冲到内存中,直到达到预定大小,之后刷新到磁盘;当从Parquet中读取数据时,每个Row Group可作为一个独立的数据单元由一个任务处理,通常大小在10MB到1G之间。 71 | - Column Chunk:Row Group中包含多个Column Chunk,Column Chunk由若干Page构成,读取数据时,可选择性跳过不感兴趣的Page 72 | - Data Page:数据压缩的基本单元,数据读取的最小单元,通常一个Page大小在 8KB 到 100KB之间。 73 | 74 | 相比ORC File,Parquet能更好的适配各种查询引擎(Hive, Impala)、计算框架(MapReduce,Spark)、序列化框架 75 | 76 | 77 | 78 | ###### 1. 存储格式 79 | 80 | ​ 定义Parquet内部存储格式、数据类型等,提供通用的和语言无关的列式存储格式:由 parquet-format实现 81 | 82 | ###### 2. 对象模型转换器 83 | 84 | ​ 将外部对象模型映射为Parquet内部类型:由 parquet-mr实现;目前支持Hive、Pig、MapReduce、Cascading、Crunch、Impala、Thrift、Protobuf、Avro 85 | 86 | ###### 3. 对象模型 87 | 88 | ​ 内存中数据表现的形式:Thrift、Protobuf、Avro均属于对象模型 89 | 90 | ![image-20190327162651005](../hadoop/assets/image-20190327162651005.png) 91 | 92 | 93 | 94 | #### 压缩:见Hadoop篇MapReduce 95 | 96 | Snappy压缩 97 | 98 | ​ 99 | 100 | ​ 101 | 102 | ​ -------------------------------------------------------------------------------- /hadoop/交互式计算引擎.md: -------------------------------------------------------------------------------- 1 | ## 交互式计算引擎 2 | 3 | ### 简介 4 | 5 | - OLAP (Online Analytical Processing) :联机分析处理 6 | - ROLAP Relational OLAP:基于关系型数据库的OLAP实现 7 | - 如:Impala、Presto 8 | - 以关系型数据库为核心,以关系型结构进行多维数据的表示和存储,分为事实表和维度表 9 | - **个人总结:用关系型结构表示和存储多维数据** 10 | - 可实时从数据源获取最新数据更新,保证数据的实时性 11 | - 运算效率低,用户等待时间较长 12 | - 与Hadoop生态结合好:处理Hive、HDFS、和HBase中的数据 13 | - MPP架构,扩展性好,能应对TB甚至PB级数据交互式查询需求 14 | - 嵌套式数据存储:支持常见列式存储格式:Parquet 15 | - MOLAP Multidimensional OLAP:基于多维数据组织的OLAP实现 16 | - 如:Druid、Kylin 17 | - 使用多维数组存储数据 18 | - 数据立方体(Cube)结构:高度优化,可最大程度提高查询性能 19 | - 运算效率高,占存储空间大,数据更新延迟 20 | - 数据建模:将数据分为维度和度量两类,所有查询必须针对上面两类列进行 21 | - 数据预计算:为提高查询效率,根据维度和度量列,预先生成计算结果 22 | - HOLAP Hybrid OLAP:基于混合数据组织的OLAP实现 23 | - 可根据具体业务需求选择哪些模型采用ROLAP,哪些采用MOLAP 24 | - **一般:不常用或需要灵活定义的分析用ROLAP方式;常用、常规模型采用MOLAP实现** 25 | - MPP (Massively Parallel Processing) :大规模并行处理 26 | 27 | 28 | 29 | ### ROLAP 30 | 31 | #### Impala 32 | 33 | C++编写 34 | 35 | 对等式架构:所有角色之间是对等的,没有主从之分 36 | 37 | - Catalogd:元数据管理服务 38 | - 从Hive metastore中同步表信息,将任何元信息的改变通过catalogd广播给各个Impalad服务 39 | - 一般大数据的元信息很大,Catalogd仅仅加载每张表的概略信息,详细信息由后台进程从第三方存储中延迟载入 40 | - Statestored:状态管理服务 41 | - 元数据订阅-发布服务 42 | - 单一实例:存在单点故障 43 | - 将集群元数据及其修改传播同步到所有Impalad进程 44 | - Impalad:同时承担协调者和执行者双重角色 45 | - 对与某一查询 46 | - 作为协调者:接收客户端查询请求,并对其进行词法分析、语法分析、生成逻辑查询计划、生成物理查询计划、将各个执行片段(segement)调度到Impalad上执行 47 | - 作为执行者:接收从其他Impalad发来的执行片段,利用本地资源(CPU、内存)处理这些片段,将查询结果返回给协调者 48 | - **Impalad一般部署在集群中运行DataNode进程的所有机器上**,进而利用数据本地化的特点而不必通过网络传输即可从文件系统读取数据块 49 | 50 | 51 | 52 | #### Presto 53 | 54 | Facebook开源,与Hive无缝集成 55 | 56 | Master-Slave架构 57 | 58 | - Coordinator 59 | - 协调者:接收客户端查询请求,词法分析、语法分析、生成逻辑查询计划、生成物理查询计划,将任务调度到Worker上执行,并汇总Worker返回结果 60 | - 可存在多个,避免单点故障 61 | - Discovery Server 62 | - 服务发现组件:各Worker启动时会向Discovery Server注册,并定期向其汇报状态 63 | - 轻量级服务,嵌入在Coordinator 64 | - Worker 65 | - 任务执行者:接收来自Coordinator的任务,采用多线程并行执行,将结果返回给Coordiator 66 | 67 | 68 | 69 | 支持多种数据源:采用插件方式支持(Connector插件;Hive、HDFS、MySQL、Cassandra、HBase、Redis等) 70 | 71 | 为区分各个数据源中的数据,在数据库之上引入一层命名空间:catalog 72 | 73 | Hive、MySQL等上面提到的都以catalog的方式存在,不同的catalog中可以有多个数据库,每个数据库又可有多个数据表 74 | 75 | ##### SQL 76 | 77 | 支持大部分SQL语法:SELECT、CREATE、DELETE、ALTER、DROP等 78 | 79 | Select语法: 80 | 81 | ![image-20190403104732029](assets/image-20190403104732029.png) 82 | 83 | 84 | 85 | 支持五中Join操作: 86 | 87 | 内连接、左外连接、右外连接、全外连接、笛卡尔积;还支持cube和rollup等数据仓库操作 88 | 89 | 90 | 91 | ### MOLAP 92 | 93 | 预计算:空间换时间 94 | 95 | #### Druid 96 | 97 | 基于列存储 98 | 99 | - Segment:数据强制按照时间分割成不同的数据段 100 | - 一个Segment包含时间戳、维度(dimension)、度量(metric) 列 101 | - 架构 102 | - 实时线 103 | - 批处理线 104 | - 依赖 105 | - Zookeeper:分布式协调 106 | - Metadata Storage:存储集群数据信息和相关规则 107 | - Deep Storage:存放备份数据 108 | 109 | ![image-20190403112423242](assets/image-20190403112423242.png) 110 | 111 | 112 | 113 | #### Kylin 114 | 115 | ![image-20190403112627840](assets/image-20190403112627840.png) 116 | 117 | 118 | 119 | - REST Server:提供一些RESTful接口,例如创建cube、构建cube、刷新cube、合并cube等cube相关操作;元数据管理;用户访问权限;系统配置动态修改等 120 | - JDBC/ODBC接口:使用JDBC接口的查询和使用RESTful接口的查询内部实现流程是相同的;可兼容BI工具 121 | - Query引擎:使用开源的Calcite框架实现SQL解析 122 | - Routing:负责将SQL生成的执行计划转换为面向cube缓存的查询;cube是通过预计算缓存在HBase中,这些查询只需要从HBase中获取查询结果即可返回 123 | - Metadata:元信息包括cube的定义、星状模型的定义、作业的信息、作业的输出信息、维度的存放目录信息等;元信息和cube都存储在HBase中 124 | - Cube构建引擎:负责预计算方式构建cube,通过MapReduce/Spark计算生成HTable然后加载到HBase中 125 | 126 | 127 | 128 | ![image-20190403113951902](assets/image-20190403113951902.png) 129 | 130 | -------------------------------------------------------------------------------- /lucene/ES_Config.md: -------------------------------------------------------------------------------- 1 | ``` 2 | ###------------------------------------ Node ------------------------------------ 3 | #集群名字,同一网段内相同名字加入同一集群 4 | cluster.name: test-es 5 | #节点名字 6 | node.name: node-1 7 | #节点是否为主节点 8 | node.master: true 9 | #节点是否存储数据 10 | node.data: false 11 | #关闭多播,默认为开启(true) 12 | directory.zen.ping.multicast.enabled: false 13 | 14 | ###-------------------------------------------单播配置-------------------------------------------- 15 | discovery.zen.ping.unicast.hosts: ["192.168.20.156:9300","192.168.20.156:9301","192.168.20.156:9302"] 16 | #单播最大并发连接数默认为10 17 | discovery.zen.ping.unicast.concurrent_connects: 10 18 | #最小N主节点才能组成集群(防止脑裂) 19 | discovery.zen.minimum_master_nodes: 1 20 | 21 | ###-------------------------------------------多播配置-------------------------------------------- 22 | #通信接口可赋值为地址或者接口名,默认为所有可用接口 23 | discovery.zen.ping.multicast.address: 24 | #通信端口默认54328 25 | discovery.zen.ping.multicast.port: 54328 26 | #发送多播的消息地址默认224.2.2.4 27 | discovery.zen.ping.multicast.group: 224.2.2.4 28 | #缓冲区大小默认2048K 29 | discovery.zen.ping.multicast.buffer_size: 2048 30 | #定义多播生存期,默认为3 31 | discovery.zen.ping.multicast.ttl: 3 32 | 33 | ###----------------------------------------zen错误检测-------------------------------------------- 34 | #节点向目标节点ping频率默认为1s 35 | discovery.zen.fd.ping_interval: 1s 36 | #节点向目标节点ping时常默认为30s 37 | discovery.zen.fd.ping_timeout: 30s 38 | #目标节点不可用重试次数默认为3 39 | discovery.zen.fd.ping_retries: 3 40 | 41 | ###---------------------------------------开启script使用------------------------------------------- 42 | script.inline: on 43 | script.indexed: on 44 | 45 | ###---------------------------------------索引段合并策略------------------------------------------- 46 | #tiered:(默认)合并大小相似的索引段,每层允许的索引段的最大个数 47 | #log_byte_size:策略不断地以字节数的对数为计算单位,选择多个索引来合并创建新索引 48 | #log_doc:与log_byte_size类似,不同的是前者基于索引的字节数计算,后者基于索引段文档数计算 49 | 50 | # index.merge.policy.type: tiered 51 | 52 | ###---------------------------------- Gateway ----------------------------------- 53 | #启动集群需要节点数5表示要有5个节点才能启动集群 54 | # gateway.recover_after_nodes: 5 55 | #启动集群需要的数据节点数 56 | # gateway.recover_after_data_nodes: 3 57 | #启动集群候选主节点数目 58 | # gateway.recover_after_master_nodes: 3 59 | #上述条件满足后,启动恢复前等待时间 60 | # gateway.recover_after_time: 10m 61 | #立即启动恢复过程需要集群中存在的节点数 62 | # gateway.expected_nodes: 3 63 | #立即启动恢复过程需要集群中存在的数据节点数 64 | # gateway.expected_data_nodes: 3 65 | #立即启动恢复过程需要集群中存在的候选主节点数 66 | # gateway.expected_master_nodes: 3 67 | 68 | ###---------------------------------集群级的恢复配置--------------------------------- 69 | #从分片源恢复分片时允许打开的并发流的数量默认为3 70 | # indices.recovery.concurrent_streams: 3 71 | #分片恢复过程中每秒传输数据的最大值默认为20M 72 | # indices.recovery.max_bytes_per_sec: 20M 73 | #分片恢复过程中是否压缩传输的数据默认为true 74 | # indices.recovery.compress: true 75 | #从分片源向目标分片拷贝时数据块的大小默认512K 76 | # indices.recovery.file_chunk_size: 512K 77 | #恢复过程中分片间传输数据时,单个请求可以传输多少行日志事务默认为1000 78 | # indices.recovery.translog_ops: 1000 79 | #从源分片拷贝事务日志使用的数据块的大小默认为512K 80 | # indices.recovery.translog_size: 512K 81 | 82 | ###---------------------------------索引级缓存过滤器配置--------------------------------- 83 | #缓存类型默认值为node 可选参数[{"resident":"不会被jvm清理"},{"soft":"内存不足时会被jvm清理在weak之后"},{"weak":"内存不足时会被jvm优先清理"},{"node":"缓存会在节点级控制"}] 84 | #index.cache.filter.type: node 85 | #存储到缓存中的最大记录数默认为-1无限制 86 | #index.cache.filter.max_size: -1 87 | #存储到缓存中的数据失效时间默认为-1永不失效 88 | #index.cache.filter.expire: -1 89 | #节点级的缓存大小默认为20%也可以使用1024mb 90 | #index.cache.filter.size: 20% 91 | 92 | ###---------------------------------索引级字段缓存配置--------------------------------- 93 | #字段数据缓存最大值可以为百分比20%或者具体值10G 94 | #index.fielddata.cache.size: 20% 95 | #字段数据缓存失效时间默认为-1永不失效 96 | #index.fielddata.cache.expire: -1 97 | ``` 98 | 99 | -------------------------------------------------------------------------------- /NLP推荐系统/推荐系统设计.md: -------------------------------------------------------------------------------- 1 | ## 推荐系统 2 | 3 | 解决长尾问题 4 | 5 | #### 关注推荐对象的属性 6 | 7 | 物品:关键字、基因 8 | 用户:性别、年龄、地域、工作、消费 9 | 用户和物品之间的关系:评分、收藏、购买 10 | 推荐:根据上面的关系,进行建模推荐 11 | 12 | #### 推荐方式: 13 | 14 | 基于人口统计:相似用户喜欢相似物品 15 | 基于内容推荐:相似内容(物品标签有相似),推荐给同一用户 16 | 基于协同过滤推荐:(基于行为)用户A喜欢a,b,c,用户B喜欢a,c,那么推测用户A和B喜好类似,可将b物品推荐给B用户 17 | 18 | 19 | 20 | #### 唯一标识 21 | 22 | PC端:cookieid 23 | 24 | 手机端:imei/imsi 25 | 26 | 手机浏览器:m端 27 | 28 | 手机应用:app端 29 | 30 | 31 | 32 | 33 | 34 | #### 任务:(T+1) 35 | 36 | Rating Rrediction 评分预测 37 | 38 | Top-N Recommendation Top-N推荐 39 | 40 | | key | value | 41 | | :----: | :-------: | 42 | | 用户ID | item_list | 43 | 44 | | key | value | 45 | | :--------: | :------------: | 46 | | 0 (新用户) | topN_item_list | 47 | 48 | ![image-20190525141332843](assets/image-20190525141332843.png) 49 | 50 | 区域等等…. 51 | 52 | 53 | 54 | 统计数值较有意义,后者相对前者有成倍的价值 55 | 56 | ![image-20190525144106396](assets/image-20190525144106396.png) 57 | 58 | 选择参考 59 | 60 | ![image-20190525144551453](assets/image-20190525144551453.png) 61 | 62 | 63 | 64 | #### 注: 65 | 66 | 标签的刻画能力 衡量 有些标签比较泛Å 67 | 68 | 69 | 70 | ![image-20190524013340993](assets/image-20190524013340993.png) 71 | 72 | 73 | 74 | #### NLP相似度 75 | 76 | 相似度越小,距离越大,越不相似 77 | 78 | - 余弦相似度 79 | 80 | - 一个向量空间中两个向量的夹角的余弦值 作为衡量两个个体之前的差异的大小 81 | - 余弦值接近1,夹角趋于0,表明两个向量越相似 82 | - 压缩存储 (**稀疏存储**) 83 | - [0,1,0,0,0,2] 压缩为 1:1 5:2 类似ES的反向索引字典的压缩 84 | - Python里面称为 scipy 85 | - Spark里面称为 sparse vector 86 | - Spark里面的数组形式叫 dense vector 87 | - 余弦公式 88 | 89 | $$ 90 | \cos(\theta)=\frac{\sum_{i=1}^{n}{(x_i *y_i)}}{\sqrt{\sum_{i=1}^n(x_i)^2}*\sqrt{\sum_{i=1}^n(y_i)^2}} 91 | =\frac{a \cdot b}{\left \| a \right \| * \left \| b \right \|} 92 | $$ 93 | 94 | 95 | 96 | - 欧氏距离:计算公式 97 | 98 | $$ 99 | \sqrt{x_1^2 + x_2^2} 100 | $$ 101 | 102 | 103 | 104 | - Term weight = tf * idf **关键词** 105 | - TF词频率 106 | 107 | $$ 108 | TF = \frac{某个文档中词出现的次数}{整个文档的词数} 109 | $$ 110 | 111 | or 112 | $$ 113 | TF = \frac{某个文档中词出现的次数}{整个文档中出现次数最多的词的次数} 114 | $$ 115 | 116 | 117 | - IDF 逆向文档频d率 118 | - 加1保证分母不为0 119 | - log压缩值域 120 | 121 | $$ 122 | \log{\frac{总文档数}{包含该词的文档数+1}} 123 | $$ 124 | 125 | ​ 126 | 127 | - 空间向量模型 128 | 129 | - 自动摘要 130 | 131 | - 文章的信息都包含在句子中,自动摘要就是要找到哪些句子包含的信息最多 132 | - 信息多:用关键字的数量来衡量,关键字可通过TF-IDF算出 133 | - 只要关键字之间的距离小于"门阈值",则认为他们在同一个"簇"内 134 | - 如果两个关键词之间有 5 个以上的其他词,就可以将这两个关键词分到两个簇 135 | - 计算每个簇的重要性分值 136 | 137 | $$ 138 | 簇的重要性 = \frac{包含的关键词数量^2}{簇的长度} 139 | $$ 140 | 141 | 142 | 143 | - 简化 144 | - 不再分簇:只考虑句子包含的关键词 145 | - 待优化 146 | 147 | - LCS (longest common subsequence) 148 | 149 | - 最长公共子序列 (有序) 150 | 151 | - 另外简易:Jccard distance set1 & set2 将句子切词到set中,判断交集 152 | 153 | - 区别最长公共子串 (不可分开的) 154 | 155 | - 求解 156 | 157 | - 穷举:复杂度高 158 | - 动态规划法 159 | 160 | $$ 161 | LCS(X_m, Y_n) = 162 | \begin{cases} 163 | LCS(X_{m-1},Y_{n-1}) + X_m & \text 当{X_m=Y_n} \\ 164 | max\{LCS(X_{m-1},Y_n), LCS(X_m,Y_{n-1})\} & \text 当{X_m \neq Y_n} 165 | \end{cases} 166 | $$ 167 | 168 | 169 | 170 | - 计算:二维数组 $C[m,n]$ 171 | - $C[i,j]$ 记录序列 $X_i$ 和 $Y_j$的最长公共子序列的长度 172 | - 当i = 0 或 j = 0 时,空的 计为 0 173 | - 相等:对角+1 174 | - 不相等:左 - 1 或 上 - 1 取最大值 175 | - 相等就加,不等就往下传递 176 | 177 | $$ 178 | C(i, j) = 179 | \begin{cases} 180 | 0 & \text 当 i=0 或 j=0 \\ 181 | C(X_{i-1},Y_{j-1}) + 1 & \text 当i>0, j>0,且{X_i=Y_j} \\ 182 | max\{C(X_{i-1},Y_j), C(X_i,Y_{j-1})\} & \text 当i>0, j>0,且{X_m \neq Y_n} 183 | \end{cases} 184 | $$ 185 | 186 | 187 | 188 | 189 | ![image-20190606005535462](assets/image-20190606005535462.png) 190 | 191 | 192 | 193 | 拉格朗日 194 | 195 | 最大似然 196 | 197 | 叶贝斯公式 -------------------------------------------------------------------------------- /hadoop/流式实时计算引擎.md: -------------------------------------------------------------------------------- 1 | ## 流式实时计算引擎 2 | 3 | ### 简介 4 | 5 | 面向行处理(row-based):延迟低,吞吐率也低 6 | 7 | 面向微批处理(micro-batch):延迟高,吞吐率高 8 | 9 | 10 | 11 | ### Storm 12 | 13 | #### 概念: 14 | 15 | - Tuple 16 | - 由一组可序列化的元素构成,每个元素可是任意类型(可序列化) 17 | - Stream 18 | - 无限的Tuple形成的Stream,每个Stream由唯一ID,对Tuple中元素命名的Schema和无限的Tuple构成 19 | - Topology 20 | - 用户应用程序 - 一系列Spout和Blot组成的DAG任务 21 | - 每个Topology中,每个Spout和Blot由多个Task构成,Task之间互相独立,可并行执行 22 | - Spout 23 | - Stream的数据源:Spout可将数据发送到一个或多个Stream中 24 | - Bolt 25 | - 消息处理逻辑:包括过滤、聚集、与外部数据库通信、转换等 26 | - 可进一步将数据发送到一个或多个Stream中 27 | - Stream Grouping:决定Topology中Tuple在不同Task之间传递的方式 28 | - Shuffle Grouping:随机轮询方式,Task产生的Tuple将采用轮询的方式发送给下一类组件的Task 29 | - LoaclOrShuffle Grouping:经过优化的Shuffle Grouping,同一个Worker内的Task优先将Tuple传递给同Worker的替他Task 30 | - Fields Grouping:某个字段值相同的Tuple将被发送给同一个Task 31 | 32 | #### 架构: 33 | 34 | ![image-20190403144048405](assets/image-20190403144048405.png) 35 | 36 | - Nimbus 37 | - 集群的管理和调度组件 38 | - 通常只有一个 39 | - 负责代码的分发,任务调度,故障监控及容错(重新将失败的任务调度到其他机器上) 40 | - 无状态(可直接kill -9) 41 | - Supervisor 42 | - 计算组件,通常有多个,负责执行实际的计算任务 43 | - 根据Nimbus启动或停止Worker进程 44 | - 无状态 45 | - Worker:实际的计算进程,每个Supervisor启动多个Worker进程(需静态为每个Worker分配一个固定端口号),每个Worker只属于特定的某个Topology 46 | - Executor:每个Worker内部可启动多个Executor线程,以运行实际用户逻辑代码(Task);每个Executor可运行同类组件(同一个Topology内的Spout或Bolt) 中一个或多个Task 47 | - Task:用户逻辑代码 48 | - Zookeeper:存储状态信息和运行时统计信息 49 | - Supervisor注册和发现,监控失败的Supervisor 50 | - Worker通过Zookeeper向Nimbus发送包含Executor运行状态的心跳信息 51 | - Supervisor通过Zookeeper向Nimbus发送包含自己最新状态的心跳信息 52 | 53 | 54 | 55 | ```java 56 | Config conf = new Config(); 57 | conf.setNumWorkers(2); // 设置Worker进程数 58 | 59 | topologyBuilder.setSpout("kafka-spout", new KafkaSpout(), 2); // 为KafkaSpout启动2个Executor 60 | topologyBuilder.setBolt("split-bolt", new SplitBolt(), 2) // 为SplitBolt启动2个Executor线程 61 | .setNumTasks(4) // 设置Task数量 62 | .shuffleGrouping("kafka-spout"); 63 | topologyBuilder.setBolt("merge-bolt", new MergeBolt(), 6) 64 | .shuffleGrouping("split-bolt"); 65 | StromSubmitter.submitTopology("mytopology", conf, topologyBuilder.createTopology()); 66 | ``` 67 | 68 | 一旦Topology运行起来,用户可通过WebUI或Shell命令动态修改Topology的并发度 69 | 70 | ```shell 71 | # 将Worker数目增加到4,kafka-spout的Executor数目增加到4,merge-bolt的Executor数目增加到8 72 | storm rebalance mytopology -n 4 -e kafka-spout=4 -e merge-bolt=8 73 | ``` 74 | 75 | 76 | 77 | #### Storm可靠性 78 | 79 | Storm acker: 80 | 81 | - 为每个Spout Tuple保存一个64位的校验值,初始值为0 82 | - 每当Bolt发送或接受一个Tuple,该Tuple的ID(每个Tuple均对应一个唯一的64位ID)跟这个校验值进行异或操作 83 | - 如果每个Tuple处理完成了。则校验值变为0,意味着Tuple被完成的处理完毕。 84 | 85 | 如果一条消息在一定时间内未处理完成,则Storm认为该消息丢失或者未处理完整,则由acker通知Spout重新发送数据 —— At least once 一致性语言 86 | 87 | 88 | 89 | ### Spark Streaming 90 | 91 | 微批处理:近实时 92 | 93 | DStream:流式的RDD序列 94 | 95 | - Transformation 96 | - DStream to DStream 97 | - output 98 | - 产生一个或一组结果 99 | 100 | ![image-20190404114211955](assets/image-20190404114211955.png) 101 | 102 | ```scala 103 | // 上下文 StreamingContext 104 | val conf = new SparkConf().setAppName("test").setMaster(master) // 应用名称、运行模式Master 105 | val ssc = new StreamingContext(conf, Seconds(1)) // Seconds(1) 表示批处理间隔 106 | ``` 107 | 108 | - 创建StreamingContext 109 | - 设置数据源,并创建DStream与数据源交互 110 | - 实现核心计算逻辑:调用DStream上的Transformation和output 111 | - 启动应用程序:StreamingContext.start() 112 | - 等待应用结束运行:StreamingContext.awaitTermination() 退出或错误退出 113 | 114 | #### 数据源 115 | 116 | - 基础数据源 117 | - 文件系统API、Socket、actor 118 | - Streamcontext.fileStream[keyclass, valueclass, inputformatclass] (dataDirectory) 119 | - 高级数据源 120 | - Kafka、Flume等,需引入外部依赖包 121 | 122 | #### 可靠性 123 | 124 | - checkpoint 125 | - 允许用户将数据和状态定期保存到文件系统中,一旦重启,可直接从文件系统中恢复 126 | - StreamingContext.checkpoint(checkpointDirectory) 启用状态恢复机制 (通常为HDFS上:可靠) 127 | - checkpoint会详尽记录程序的上下文,这使得应用程序很难升级 128 | - Offset management 129 | - 将每次处理的RDD偏移量记录下来,一旦重启,重新从未处理完的位置开始处理数据 130 | - 开销小,兼容性好 131 | - 需要依赖可靠的数据来源:Kafka或HDFS 132 | 133 | -------------------------------------------------------------------------------- /spark/Spark-Hive-New.md: -------------------------------------------------------------------------------- 1 | **参考:spark-demo 中的 JieBaKryHive.java** 2 | 3 | 1. Hive Warehouse Connector - HWC 4 | 5 |   在hdp3.0,默认spark和hive各使用自己的metastore catalog,即在hive中创建的表spark中是看不到的。 6 | 7 |   原因是新版hive支持ACID,默认也启用了ACID Manager,而SparkSQL还不支持ACID,所以它们两个各自使用不同的catalog。 8 | 9 |   如果要让sparksql直接使用hive元数据,有两种方案: 10 | 11 |   1.hive禁用ACID,spark使用hive的catalog 12 | 13 |   2.spark通过HWC访问hive元数据; 14 | 15 |   建议使用HWC,spark可以通过hwc使用hive元数据,并且也支持ranger,但只支持如下3类应用: 16 | 17 |   · Spark shell 18 | 19 |   · PySpark 20 | 21 |   · The spark-submit script 22 | 23 |   也就是还不支持spark-sql? 24 | 25 |   Updates for HDP-3.0: 26 | 27 |   · Hive uses the "hive" catalog, and Spark uses the "spark" catalog. No extra configuration steps are required – these catalogs are created automatically when you install or upgrade to HDP-3.0 (in Ambari the Spark metastore.catalog.default property is set to spark in "Advanced spark2-hive-site-override"). 28 | 29 |   · You can use the Hive Warehouse Connector to read and write Spark DataFrames and Streaming DataFrames to and from Apache Hive using low-latency, analytical processing (LLAP). Apache Ranger and the Hive Warehouse Connector now provide fine-grained row and column access control to Spark data stored in Hive. 30 | 31 |   2. spark hwc配置 32 | 33 | 34 | 35 |   3.使用 36 | 37 |   启动shell: 38 | 39 | spark-shell --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-1.0.0.3.0.0.0-1634.jar 40 | 41 |   注:因为hive-warehouse-connector-assembly-1.0.0.3.0.0.0-1634.jar 没有s3 api,在访问s3文件时会报错,但最终会查出结果。 42 | 43 | 44 | 45 | 网上资料: 46 | 47 | #创建hive会话 48 | 49 | scala> val hive = com.hortonworks.spark.sql.hive.llap.HiveWarehouseBuilder.session(spark).build() #或val hive = com.hortonworks.hwc.HiveWarehouseSession.session(spark).build() 50 | 51 | #如果使用用户名密码 52 | 53 | val hive = com.hortonworks.hwc.HiveWarehouseSession.session(spark).userPassword("hive","passw").build() 54 | 55 | #查看数据库 56 | 57 | scala> hive.showDatabases().show 58 | 59 | +------------------+ 60 | 61 | | database_name| 62 | 63 | +------------------+ 64 | 65 | | default| 66 | 67 | |information_schema| 68 | 69 | | iot| 70 | 71 | | sys| 72 | 73 | +------------------+ 74 | 75 | #查看数据表 76 | 77 | scala> hive.showTables().show 78 | 79 | +--------+ 80 | 81 | |tab_name| 82 | 83 | +--------+ 84 | 85 | | invites| 86 | 87 | | pokes| 88 | 89 | +--------+ 90 | 91 | #查询数据表内容 92 | 93 | hive.executeQuery("SELECT * FROM pokes limit 3").show() 94 | 95 | #切换数据库 96 | 97 | hive.setDatabase("iot") 98 | 99 |   4.SparkSQL 使用HWC 100 | 101 |   需要配置Custom spark-thrift-sparkconf: 102 | 103 | - spark.sql.hive.hiveserver2.url=jdbc:hive2://{hiveserver-interactive-hostname}:10500 104 | 105 | - spark.jars=/usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-1.0.0.3.0.0.0-1634.jar 106 | 107 | - spark.hadoop.hive.zookeeper.quorum={some-or-all-zookeeper-hostnames}:2181 108 | 109 | - spark.hadoop.hive.llap.daemon.service.hosts=@llap0 110 | 111 |   属性spark_thrift_cmd_opts设置值:--jars /usr/hdp/2.6.3.0-235/spark_llap/spark-llap-assembly-1.0.0.2.6.3.0-235.jar --conf spark.sql.hive.llap=true 112 | 113 |   连接spark jdbc: 114 | 115 | bin/beeline -u jdbc:hive2://slave5.cluster.local:10016 -n hive 116 | 117 | 118 | 119 | 0: jdbc:hive2://slave5.cluster.local:10016> show databases; 120 | 121 | +---------------+--+ 122 | 123 | | databaseName | 124 | 125 | +---------------+--+ 126 | 127 | | default | 128 | 129 | | spdb | 130 | 131 | +---------------+--+ 132 | 133 |   结果不对,还是spark catalog 。 134 | 135 |   另附: shell下访问spark catalog的结果: 136 | 137 | scala> spark.catalog.listDatabases.show 138 | 139 | Hive Session ID = 1ea54a87-9df0-4ca0-b7a4-f741bb091e6f 140 | 141 | +-------+----------------+--------------------+ 142 | 143 | | name| description| locationUri| 144 | 145 | +-------+----------------+--------------------+ 146 | 147 | |default|default database|hdfs://slave5.clu...| 148 | 149 | | spdb| |hdfs://slave5.clu...| 150 | 151 | +-------+----------------+--------------------+ -------------------------------------------------------------------------------- /flink/flink实战(1).md: -------------------------------------------------------------------------------- 1 | # Flink实战(1) 2 | 3 | #### 知识点: 4 | 5 | > DataSet 6 | > 7 | > ​ DataSource 8 | > 9 | > DataStream 10 | > 11 | > ​ DataStreamSource 12 | 13 | 14 | 15 | > processFunction自定义算子 16 | 17 | 18 | 19 | ##### 重新分区策略: 20 | 21 | >keyBy():基于hash重新分区 22 | > 23 | >broadcast():广播 24 | > 25 | >rebalance():随机重新分区 26 | 27 | 28 | 29 | ##### 序列化 30 | 31 | > POJO类 Avro序列化 32 | > 33 | > 一般通用类:Kryo序列化 34 | > 35 | > 值类型Values:ByteValue、IntValue等等 36 | > 37 | > Hadoop的Writable类:write() 和 readFields() 方法进行序列化逻辑 38 | 39 | 40 | 41 | ##### 类型擦除与推理 42 | 43 | > Flink 重建被丢弃的类型,会存储在数据集中 44 | > 45 | > ​ DataStream.getType() 方法获取,由Flink自己使用 46 | 47 | 48 | 49 | ##### 累加器与计数器 50 | 51 | > IntCounter、LongCounter、DoubleCounter 52 | > 53 | > Histogram:柱状图 54 | 55 | 56 | 57 | ![image-20190503174645592](assets/image-20190503174645592.png) 58 | 59 | 60 | 61 | ##### 执行图 62 | 63 | > StreamGraph 64 | > 65 | > ​ StreamTransformation 66 | > 67 | > ​ StreamNode & StreamEdge 68 | > 69 | > JobGraph 70 | > 71 | > ​ Operator Chain:组合 72 | > 73 | > ​ JobVertex & JobEdge:符合条件的StreamNode chain成一个JobVertex 74 | > 75 | > ​ 配置Checkpoint 76 | > 77 | > ​ 配置重启策略 78 | 79 | 80 | 81 | #### 数据源 82 | 83 | ##### Source 84 | 85 | > 基于文件 86 | > 87 | > 基于Socket 88 | > 89 | > 基于Collection 90 | 91 | ##### 自定义数据源 92 | 93 | > 实现SourceFunction 非并行 94 | > 95 | > 实现ParallelSourceFunction 96 | > 97 | > 继承 RichParallelSourceFuntion 98 | 99 | ##### Sink 100 | 101 | > Connectors 102 | 103 | ##### 自定义Sink 104 | 105 | > 实现SinkFunction 106 | > 107 | > 实现RichSinkFunction 108 | 109 | 110 | 111 | 112 | #### 编译源码 113 | mvn clean install -DskipTests 114 | 115 | // 跳过测试、QA插件和Javadoc 116 | 117 | mvn clean install -DskipTests -Dfast 118 | mvn clean install -DskipTests -Dfast -Dhadoop.version=2.8.3 119 | mvn clean install -DskipTests -Dfast -Pvendor-repos -Dhadoop.version=3.1.1-hdp3.1.0 120 | mvn clean install -Dmaven.test.skip -Dfast -Pvendor-repos -Dhadoop.version=3.1.1-hdp3.1.0 121 | 122 | 123 | 124 | #### Java表达式 125 | 126 | ```java 127 | public static class Wc { 128 | private Wcc wcc; 129 | private int count; 130 | ...getter,setter 131 | } 132 | 133 | public static class Wcc{ 134 | private int num; 135 | private Tuple3 word; 136 | private IntWritable hadoopCitizen; 137 | } 138 | ``` 139 | 140 | > "count" 141 | > 142 | > "wcc":递归选取Wcc的所有字段 143 | > 144 | > "wcc.word.f2":Wcc类中的tuple word的第三个字段 145 | > 146 | > "wcc.hadoopCitizen":选择hadoop intWritable类型 147 | > 148 | > KeySelector选取 149 | 150 | 151 | 152 | #### 自定义函数 153 | 154 | RichMapFunction: 可进行数据库操作,一次打开 155 | 156 | ```java 157 | public class KafkaSinkFunction extends RichFlatMapFunction { 158 | private Producer producer; 159 | private String topic; 160 | private properties props; 161 | 162 | public KafkaSinkFunction(String topic, Properties props) { 163 | this.topic = topic; 164 | this.props = props; 165 | } 166 | 167 | @Override 168 | public void open(Configuration params) throw Exception { 169 | producer = new KafkaProducer<>(props); 170 | } 171 | 172 | @Override 173 | public void close() throws Exception { 174 | producer.close(); 175 | } 176 | 177 | @Override 178 | public void flatMap(String value, Collector out) throws Exception { 179 | producer.send(new ProducerRecord(topic, new Random().nextInt()+"", JSON.toJSONString(value))); 180 | } 181 | 182 | } 183 | ``` 184 | 185 | ```java 186 | @JSONField(serializeUsing=Decimal128Serializer.class, deserializeUsing=Decimal128Deserializer.clss) 187 | private Decimal128 amount; 188 | ``` 189 | 190 | 191 | 192 | #### 共享Slot 193 | 194 | TODO 条件 195 | 196 | dataStream.filter(…).map().startNewChain().reduce():连同map一起开启新的链路 197 | 198 | 199 | 200 | ##### OperatorChain && Task 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | #### 博客 222 | 223 | 1. 为什么我们选择基于Flink搭建实时个性化营销平台 224 | https://mp.weixin.qq.com/s/A04LKJbK6kOKSBCfKG5Ypg 225 | 2. Flink SQL 功能解密系列 —— 维表 JOIN 与异步优化 226 | https://yq.aliyun.com/articles/457385 227 | 3. EFK 228 | https://www.elastic.co/cn/blog/building-real-time-dashboard-applications-with-apache-flink-elasticsearch-and-kibana 229 | 4. 博客 230 | http://wuchong.me/categories/Flink/ 231 | http://www.54tianzhisheng.cn/tags/Flink/ 232 | 233 | 5. 源码: 234 | https://blog.csdn.net/yanghua_kobe 235 | 236 | 237 | [OPPO数据中台之基石](https://mp.weixin.qq.com/s?__biz=MzU5OTQ1MDEzMA==&mid=2247486279&idx=1&sn=3b73e76a5597879a04bf671e93d6959d&chksm=feb5fc3ac9c2752cd0dae6def3d412d37ff1613c69e532042fc4e22b19ca639a71c06f6c3aea&mpshare=1&scene=23&srcid=#rd) 238 | 239 | -------------------------------------------------------------------------------- /sqoop/sqoop info.md: -------------------------------------------------------------------------------- 1 | ### Sqoop1:(全量同步) 2 | 3 | A tool to transfer and sync data between relational databases to hdfs. 4 | 5 | use sqoop client instead of starting a server 6 | 7 | baseed on Map() to create MapReduce job 8 | 9 | submit sqoop job with shell command, sqoop will read meta data from RDBMS, 并根据并发度和数据表大小将数据分成若干片,每片交给一个Map Task处理,多个Map Task同时去取数据库中数据,并行写入目标存储系统如HDFS、HBase、和Hive 10 | 11 | - 并发度 12 | - 数据源 13 | - 超时时间 14 | 15 | 使用: 16 | 17 | ```sqoop 18 | // HDP中sqoop默认使用mysql的驱动,无需单独配置 19 | // 校验 20 | sqoop list-tables --connect jdbc:mysql://192.168.16.212:3306/hive --username root --password 123456 21 | sqoop list-databases --connect jdbc:mysql://192.168.16.212:3306/hive --username root --password 123456 22 | 23 | // MySQL -> HDFS 24 | sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table t_test --fields-terminated-by ',' --null-string '**' -m 2 --append --target-dir '/data/sqoop/test.db 25 | 26 | // Hive -> MySQL 27 | sqoop export -D sqoop.export.records.per.statement=100 --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table t_test1 --fields-terminated-by ',' --export-dir '/usr/hive/....' --batch --update-key uid --update-mode allowinsert 28 | 29 | // MySQL -> HBase 30 | sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table user --hbase-table user --column-family behavior --hbase-create-table 31 | 32 | $ sqoop import 33 | --connect jdbc:mysql://localhost/serviceorderdb 34 | --username root -P 35 | --table customercontactinfo 36 | --columns "customernum,customername" 37 | --hbase-table customercontactinfo 38 | --column-family CustomerName 39 | --hbase-row-key customernum -m 1 40 | Enter password: 41 | ... 42 | 13/08/17 16:53:01 INFO mapreduce.ImportJobBase: Retrieved 5 records. 43 | $ sqoop import 44 | --connect jdbc:mysql://localhost/serviceorderdb 45 | --username root -P 46 | --table customercontactinfo 47 | --columns "customernum,contactinfo" 48 | --hbase-table customercontactinfo 49 | --column-family ContactInfo 50 | --hbase-row-key customernum -m 1 51 | Enter password: 52 | ... 53 | 13/08/17 17:00:59 INFO mapreduce.ImportJobBase: Retrieved 5 records. 54 | $ sqoop import 55 | --connect jdbc:mysql://localhost/serviceorderdb 56 | --username root -P 57 | --table customercontactinfo 58 | --columns "customernum,productnums" 59 | --hbase-table customercontactinfo 60 | --column-family ProductNums 61 | --hbase-row-key customernum -m 1 62 | Enter password: 63 | ``` 64 | 65 | 常用参数: 66 | 67 | - -config 指定应用程序配置文件 68 | - -D 指定属性和属性值 69 | - -fs local or namenode:port 指定namenode地址 70 | - -jt local or resourcemanager:port 指定ResourceManager地址 71 | - -files 逗号分隔的文件列表,需要分发到集群中各个节点的文件列表 72 | - --connect 73 | - --driver 驱动类 com.mysql.jdbc.Driver 74 | - --username --password 75 | - --table 76 | - --target-dir HDFS目录 77 | - --as-textfile 默认文件格式 78 | - --as-parquetfile 79 | - --as-avrodatafile 80 | - --as-sequencefile 81 | - -m 并发启动的Map Task数目 并行度 82 | - -e 只将指定sql返回的数据导出到HDFS中 83 | - --export-dir 导出的目录 84 | - --batch 批量处理 85 | - --update-key <属性名> 根据主键或者若干列更新数据,默认未设置,HDFS中的数据会新增到尾部 86 | - --update-mode 更新的模式 updateonly只做更新 or allowinsert更新且运行(不更新的数据)新增 87 | - --fields-terminated-by 按char分隔 默认 逗号 88 | - --lines-terminated-by 按char换行 默认 \n 89 | - --append 追加模式 90 | 91 | 优点: 92 | 93 | ​ 简单方便 94 | 95 | 缺点: 96 | 97 | ​ 依赖多,开发逻辑难 98 | 99 | 100 | 101 | TODO: sqoop如何保证容错,机器或网络故障后如何完成同步工作? 102 | 103 | 104 | 105 | >sqoop是如何根据--split-by进行分区的? 106 | > 假设有一张表test,sqoop命令中--split-by id --m 10。首先,sqoop会去查表的元数据,sqoop会向关系型数据库比如mysql发送一个命令:select max(id),min(id) from test。然后会把max、min之间的区间平均分为10分,最后10个并行的map去找数据库,导数据就正式开始了。 107 | 108 | 109 | 110 | 111 | 112 | ### Sqoop2: 113 | 114 | 提供Server与Client,将复杂操作抽象到Server端,提供REST接口供Client调用,简化客户端逻辑,提供更加灵活便捷的操作 115 | 116 | 缺点: 117 | 118 | ​ 部署维护困难 119 | 120 | 121 | 122 | ### 增量同步: 123 | 124 | #### CDC (change data capture) 125 | 126 | > **Low的方法** 127 | > 128 | > * 定时扫描整表 129 | > 130 | > sqoop增量实现方式:周期性的扫描整表,把变化的数据找出来,发送给数据搜集器 131 | > 132 | > * 写双份 133 | > 134 | > 修改业务代码,将数据修改同时发送给数据库和数据搜集器 135 | > 136 | > * 利用触发机制 137 | > 138 | > 利用数据库触发器 139 | 140 | 141 | 142 | 方案:基于事务或提交日志解析 143 | 144 | #### Canal(阿里) 145 | 146 | 主要针对MySQL 147 | 148 | 模拟数据库主备复制协议,接收数据库的binlog,捕获数据更改 149 | 150 | * Canal实现MySQL主备复制协议,向MySQL Server发送dump协议 151 | * MySQL接收到dump请求,向Canal推送binlog 152 | * Canal解析binlog对象,并发送给各个消费者 153 | 154 | #### DataBus(LinkedIn) 155 | 156 | 支持MySQL与Oracle 157 | 158 | 架构可扩展 159 | 160 | 161 | 162 | ### 多机房数据同步 163 | 164 | #### Otter(阿里) 165 | 166 | 定位:分布式数据库同步系统 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Conch-Bigdata 2 | 3 | > 人人会点大数据! 4 | 5 | 6 | 7 | ##### 本项目内容主要以笔记为主,后期如果涉及相关BigData代码,会在个人Github账号中给到Demo. 8 | 9 | 10 | 11 | ##### 如果你觉得写得差强人意,麻烦给一个小星星!![yes](assets/star.png) 12 | 13 | 14 | 15 | #### 简单分类: 16 | 17 | > **数据采集**:Flume、Kafka、Scribe、Chukwa 18 | > 19 | > **数据处理**:Hadoop、Spark、Storm、Flink、Pig、Tez、Impala、Presto、Kylin、Drill、Phoniex、Beam、Apex 20 | > 21 | > **数据存储**:HBase、HDFS、Cassandra、Kudu、Alluxio、Parquet 22 | > 23 | > **数据仓库**:Hive、HAWQ 24 | > 25 | > **分布式协调**:Zookeeper 26 | > 27 | > **序列化**:Avro、protobuf、Parquet、apacheORC、Thrift 28 | > 29 | > **数据转移**:Sqoop、SSIS 30 | > 31 | > **集群部署&管理&监控&调度&可视化分析**: Ambari、Yarn、Mesos、业务Quartz、Oozie、Azkaban、Hue 32 | > 33 | > **机器学习&数据挖掘**:Mahout、TF、Spark MLlib、R 34 | > 35 | > **搜索引擎**:Solr, ElasticSearch 36 | > 37 | > **可视化**:Grafana、Kibana、NodeJS+socket.io+HighCharts、Flask+flask-SocketIO 38 | > 39 | > **BI可视化工具**:Redash、CBoard、Apache Superset、Tableau 40 | > 41 | > **数据生命周期管理框架**: Apache Falcon 42 | > 43 | > **安全**:apache Sentry、Knox、Kerberos and Kerberos+apache ranger + apache eagle 44 | > 45 | > **数据流自动化**:apache NiFi 46 | > 47 | > **新型ETL**:NDF 48 | > 49 | > **阿里云对象存储系统**: 50 | > 51 | > **统一编程模型**:Cascading、Apache Crunch、Apache Beam 52 | 53 | 54 | 55 | #### 初步整理: 56 | 57 | ![image-20191018181746190](assets/image-20191018181746190.png) 58 | 59 | 60 | 61 | #### 一句话介绍: 62 | 63 | | 组件 | 简介 | 64 | | -------------- | ------------------------------------------------------------ | 65 | | HDFS | 分布式文件系统 | 66 | | Ambari | 部署、管理、监控Hadoop集群 | 67 | | Avro | 数据序列化系统 | 68 | | Cassandra | 可扩展的多主数据库,无单点故障 | 69 | | Chukwa | 用于管理大型分布式系统的数据收集系统 | 70 | | HBase | 可扩展的分布式数据库,支持大型表的结构化数据存储 | 71 | | Hive | 一种数据仓库基础结构,提供数据摘要和即席查询 | 72 | | Mahout | 可扩展的机器学习和数据挖掘库 | 73 | | Pig | 用于并行计算的高级数据流语言和执行框架 | 74 | | Spark | 适用于Hadoop数据的快速通用计算引擎。 Spark提供了一种简单而富有表现力的编程模型,支持广泛的应用程序,包括ETL,机器学习,流处理和图形计算 | 75 | | Tez | 一个基于Hadoop YARN的通用数据流编程框架,它提供了一个强大而灵活的引擎来执行任意DAG任务来处理批处理和交互式用例的数据。 Tez正在被Hadoop生态系统中的Hive,Pig和其他框架采用,也被其他商业软件(例如ETL工具)采用,以取代Hadoop MapReduce作为底层执行引擎 | 76 | | Zookeeper | 适用于分布式应用程序的高性能协调服务 | 77 | | HCatalog | HCatalog is a table and storage management layer for Hadoop that enables users with different data processing tools — Pig, MapReduce — to more easily read and write data on the grid. | 78 | | Oozie | 管理Hadoop作业的工作流调度系统 | 79 | | Sqoop | 数据同步,关系型数据库到非关系型数据库 | 80 | | Flume | 数据采集 | 81 | | Hue | Hadoop可视化分析 | 82 | | Impala | 基于Hive并使用内存进行计算,兼顾数据仓库,具有实时、批处理、多并发等优点。实时查询分析引擎。支持列式存储、支持Jdbc/odbc远程访问 | 83 | | Isilon | EMC Isilon is a distributed filesystem. | 84 | | kudu | enable fast analytics on fast data | 85 | | Sentry | 服务存储身份验证政策元数据并为客户端提供对该元数据的并发安全访问 | 86 | | Solr | 全文搜索引擎 | 87 | | ElasticSearch | 全文搜索引擎 | 88 | | Flink | Apache Flink是一种通用的集群计算工具,可以处理批处理,交互处理,流处理,迭代处理,内存处理,图形处理 | 89 | | Kylin | Distributed Analytics Engine | 90 | | istio | Istio lets you connect, secure, control, monitor, and observe services. | 91 | | Alluxio | 统一结构化大数据 | 92 | | Presto | Distributed SQL Query Engine for Big Data | 93 | | Apache Pulsar | 雅虎开发的企业级发布订阅消息系统 | 94 | | FreeIPA | 开源的身份管理系统 | 95 | | Azkaban | 任务调度系统LinkedIn | 96 | | Drill | Schema-free SQL Query Engine for Hadoop, NoSQL and Cloud Storage | 97 | | Apache Beam | An advanced unified programming model | 98 | | Apache Parquet | 面向分析型业务的列式存储格式 | 99 | | Apache ORC | 列式存储格式 | 100 | | CarbonData | Apache CarbonData 是一种新的融合存储解决方案,利用先进的列式存储,索引,压缩和编码技术提高计算效率,从而加快查询速度,其查询速度比 PetaBytes 数据快一个数量级 http://carbondata.iteblog.com/ | 101 | | InfluxDB | InfluxDB是一个由InfluxData开发的开源时序型数据库。 它由Go写成,着力于高性能地查询与存储时序型数据。 InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。 | 102 | | Akka | Build powerful reactive, concurrent, distributed, and resilient message-driven applications more easily | 103 | -------------------------------------------------------------------------------- /lucene/Solr.md: -------------------------------------------------------------------------------- 1 | ## Solr 2 | 3 | ##### [Solr with HDFS](https://lucene.apache.org/solr/guide/7_3/running-solr-on-hdfs.html) 4 | 5 | - This does not use Hadoop MapReduce to process Solr data, 6 | 7 | - it only uses the HDFS filesystem for index and transaction log file storage. 8 | - To use Hadoop MapReduce to process Solr data, see the MapReduceIndexerTool in the Solr contrib area. 9 | - must be using Hadoop 2.x 10 | - need to instruct Solr to use the `HdfsDirectoryFactory`. 11 | 12 | 13 | 14 | 只是存储数据到HDFS,数据还是Solr Data形式 15 | 16 | 通过MR批量创建索引 17 | 18 | Spark读取Solr数据 19 | 20 | 21 | 22 | ##### 性能 23 | 24 | - If you are looking for the best performance with the fewest variations, then SSDs and ample memory is where you should be looking. 25 | 26 | - Solr on HDFS can perform just as well as local disks given the right amount of memory. 27 | - For large scale analytics then Solr on HDFS performs well 28 | - For high speed indexing then you will need SSDs since the write performance of Solr on HDFS is not going to match 29 | 30 | 31 | 32 | ##### HDFS Block Cache 调优 33 | 34 | ![image-20190522200547311](assets/image-20190522200547311.png) 35 | 36 | 37 | 38 | ``` 39 | // Standalone mode 40 | bin/solr start -Dsolr.directoryFactory=HdfsDirectoryFactory 41 | -Dsolr.lock.type=hdfs 42 | -Dsolr.data.dir=hdfs://host:port/path 43 | -Dsolr.updatelog=hdfs://host:port/path 44 | 45 | // SolrCloud mode (基于Solr和Zookeeper的分布式搜索方案) 46 | bin/solr start -c -Dsolr.directoryFactory=HdfsDirectoryFactory 47 | -Dsolr.lock.type=hdfs 48 | -Dsolr.hdfs.home=hdfs://host:port/path 49 | 50 | // The Block Cache 51 | -XX:MaxDirectMemorySize=20g 52 | // solr.hdfs.confdir=?? : Pass the location of HDFS client configuration files - needed for HDFS HA for example. 53 | // 其他参考官方文档(https://lucene.apache.org/solr/guide/6_6/running-solr-on-hdfs.html) 54 | ``` 55 | 56 | 57 | 58 | ##### 使用 59 | 60 | - 定义Schema 61 | - 告诉Solr你要索引的文档的Field构成 62 | - 数据发送给Solr 63 | - DB -> Solr 64 | - 公开搜索:使用Solr API 65 | 66 | 内嵌Jetty服务 67 | 68 | > In Solr, unless otherwise specified, all units of distance are kilometers and points are in degrees of latitude and longitude. 69 | > 70 | > 在Solr里面,除非特殊声明,所有的距离都是千米,索引的点都是精度和维度 71 | 72 | 73 | 74 | ##### Solr Core 75 | 76 | 运行在Solr服务器中的具体唯一命名的,可管理和配置的索引 (针对不同文档,业务需求,定义不同内核用于索引和存储) 77 | 78 | 79 | 80 | ##### 服务规模考量 81 | 82 | 83 | 84 | ##### Field (https://blog.csdn.net/supermao1013/article/details/83628344) 85 | 86 | ![image-20190530161227604](assets/image-20190530161227604.png) 87 | 88 | 89 | 90 | ##### Field Type 91 | 92 | ``` 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | ``` 101 | 102 | > - name:字段类型名称,用于Field定义中的type属性引用 103 | > - class:存放该类型的值来进行索引的字段类名(同lucene中Field的子类)。注意,应以 *solr.*为前缀,这样solr就可以很快定位到该到哪个包中去查找类,如 solr.TextField 。如果使用的是第三方包的类,则需要用全限定名。solr.TextField 的全限定名为:org.apache.solr.schema.TextField。 104 | > - positionIncrementGap:用于多值字段,定义多值间的间隔,来阻止假的短语匹配 105 | > - autoGeneratePhraseQueries:用于文本字段,如果设为true,solr会自动对该字段的查询生成短语查询,即使搜索文本没带“” 106 | > - synonymQueryStyle:同义词查询分值计算方式 107 | > - enableGraphQueries:是否支持图表查询 108 | > - docValuesFormat:docValues字段的存储格式化器:schema-aware codec,配置在solrconfig.xml中的 109 | > 110 | > - postingsFormat:词条格式器:schema-aware codec,配置在solrconfig.xml中的 111 | 112 | **Solr中提供的 FieldType 类,在 org.apache.solr.schema 包下** 113 | 114 | Solr自带的FieldType查看:(http://lucene.apache.org/solr/guide/7_5/field-types-included-with-solr.html) 115 | 116 | 117 | 118 | #### 索引 119 | 120 | ##### 新增 121 | 122 | solr-admin-web -> collection -> Documents -> JSON 123 | 124 | [**索引中无则新增,有则更新**] 125 | 126 | ```xml 127 | // 增加权重(boost),增加权重后,可以在搜索的时候做权重过滤 128 | 129 | 130 | 05991 131 | angrybird 132 | 133 | 134 | ``` 135 | 136 | 137 | 138 | ##### 删除 139 | 140 | ```xml 141 | 1 142 | 143 | 144 | id:1 145 | 146 | 147 | // 删除所有索引 148 | *:* 149 | 150 | 151 | {delete:{query:"*:*"}} 152 | ``` 153 | 154 | 155 | 156 | 157 | 158 | ##### 问题 159 | 160 | 无权限控制,需自行在业务中添加字段来分权限 (对比ES的多租户) 161 | 162 | 163 | 164 | ### 参考: 165 | 166 | [Idea导入源码](https://blog.csdn.net/sweety820/article/details/74347068) 167 | 168 | [源码分析](https://blog.csdn.net/conansonic/article/details/52388859) 169 | 170 | [Solr with HDFS](https://lucene.apache.org/solr/guide/6_6/running-solr-on-hdfs.html) 171 | 172 | [Solr on HDFS最佳实践](https://risdenk.github.io/2018/10/23/apache-solr-running-on-apache-hadoop-hdfs.html) -------------------------------------------------------------------------------- /hive/Hive_SQL优化经典案例_02.txt: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------------------------------------------------------------------- 2 | ------------------------------------------------------------------------------------------------------------------------------- 3 | -- Hive SQL 优化案例二:复杂SQL分解法 4 | -- 问题描述:一个复杂的SQL,查询执行一段时间后报错:基本上是查不出来; 5 | -- 分析函数对于大表来说不是 hive的强项,这个时候我们将其分解成很多子集,并且合理利用 hive 分区表的优势,然后去 join 6 | ------------------------------------------------------------------------------------------------------------------------------- 7 | 8 | -- 1.1 将要执行的查询 9 | 10 | create table bi_tmp.aloha_UserLoyalty_190301_190303 as 11 | select aid, imei, idfa, udid, event, duration, dt, time_local, hour, source, 12 | first_value(time_local) over(partition by udid, event order by time_local) as first_time, 13 | last_value(time_local) over(partition by udid, event order by time_local) as last_time, 14 | count(time_local) over(partition by udid, event, dt) as event_count_per_day, 15 | sum(duration) over(partition by udid, event, dt) as event_duration_each_day 16 | from dwb_v8sp.event_column_info_new_hour 17 | where event in ('app_start', 'app_exit', 'effective_play', 'share_succ', 'like', 'unlike', 'like_comment', 'unlike_comment', 18 | 'comment_success') 19 | and dt >= '2019-03-01' and dt <= '2019-03-03'; 20 | 21 | select count(*) 22 | from dwb_v8sp.event_column_info_new_hour 23 | where event in ('app_start', 'app_exit', 'effective_play', 'share_succ', 'like', 'unlike', 'like_comment', 'unlike_comment', 'comment_success') 24 | and dt >= '2019-03-01' and dt <= '2019-03-03'; 25 | 26 | ------------------------------------------------------------------------------------------------------------------------------- 27 | -- 总记录行数 2.7 亿 28 | 0: jdbc:hive2://ks-hdp-master-01.dns.rightpad (bi_tmp)> select count(*) 29 | . . . . . . . . . . . . . . . . . . . . . . . . . . . > from dwb_v8sp.event_column_info_new_hour 30 | . . . . . . . . . . . . . . . . . . . . . . . . . . . > where event in ('app_start', 'app_exit', 'effective_play', 'share_succ', 'like', 'unlike', 'like_comment', 'unlike_comment', 'comment_success') 31 | . . . . . . . . . . . . . . . . . . . . . . . . . . . > and dt >= '2019-03-01' and dt <= '2019-03-03'; 32 | +------------+ 33 | | _c0 | 34 | +------------+ 35 | | 269361541 | 36 | +------------+ 37 | 1 row selected (102.624 seconds) 38 | 39 | select count(distinct event) as dis_event 40 | from dwb_v8sp.event_column_info_new_hour 41 | where event in ('app_start', 'app_exit', 'effective_play', 'share_succ', 'like', 'unlike', 'like_comment', 'unlike_comment', 'comment_success') 42 | and dt >= '2019-03-01' and dt <= '2019-03-03'; 43 | 44 | --- 分解成三个子集,并保存到三张表: bi_tmp.zyt1, bi_tmp.zyt2, bi_tmp.zyt3 45 | 46 | -- drop table if exists bi_tmp.zyt1; 47 | create table bi_tmp.zyt1 partitioned by(event) 48 | as 49 | select udid, 50 | min(time_local) as first_time, 51 | max(time_local) as last_time, 52 | event 53 | from dwb_v8sp.event_column_info_new_hour 54 | where event in ('app_start', 'app_exit', 'effective_play', 'share_succ', 'like', 'unlike', 'like_comment', 'unlike_comment', 'comment_success') 55 | and dt >= '2019-03-01' and dt <= '2019-03-03' 56 | group by udid, event; 57 | 58 | -- drop table if exists bi_tmp.zyt2 purge; 59 | create table bi_tmp.zyt2 partitioned by(dt,event) 60 | as 61 | select udid, 62 | count(time_local) as event_count_per_day, 63 | sum(duration) as event_duration_each_day, 64 | dt, 65 | event 66 | from dwb_v8sp.event_column_info_new_hour 67 | where event in ('app_start', 'app_exit', 'effective_play', 'share_succ', 'like', 'unlike', 'like_comment', 'unlike_comment', 'comment_success') 68 | and dt >= '2019-03-01' and dt <= '2019-03-03' 69 | group by udid, dt, event; 70 | 71 | create table bi_tmp.zyt3 partitioned by(dt,event) 72 | as select aid, imei, idfa, udid, duration, time_local, hour, source, dt, event 73 | from dwb_v8sp.event_column_info_new_hour t3 74 | where event in ('app_start', 'app_exit', 'effective_play', 'share_succ', 'like', 'unlike', 'like_comment', 'unlike_comment', 75 | 'comment_success') 76 | and dt >= '2019-03-01' and dt <= '2019-03-03'; 77 | 78 | -- 插入目标表: 79 | create table bi_tmp.aloha_UserLoyalty_190301_190303 as 80 | select t3.aid, t3.imei, t3.idfa, t3.udid, t3.event, t3.duration, t3.dt, t3.time_local, t3.hour, t3.source, 81 | t1.first_time, 82 | t1.last_time, 83 | t2.event_count_per_day, 84 | t2.event_duration_each_day 85 | from bi_tmp.zyt1 t1 join bi_tmp.zyt2 t2 on t1.event=t2.event and t1.udid=t2.udid 86 | join bi_tmp.zyt3 t3 on t2.dt=t3.dt and t2.event= t3.event and t2.udid=t3.udid; 87 | 88 | -- 验证数据:(与上面的查询记录行数对的上) 89 | 90 | 0: jdbc:hive2://ks-hdp-master-01.dns.rightpad (bi_tmp)> select count(*) from bi_tmp.aloha_UserLoyalty_190301_190303; 91 | +------------+ 92 | | _c0 | 93 | +------------+ 94 | | 269361541 | 95 | +------------+ 96 | 1 row selected (0.22 seconds) 97 | 98 | -------------------------------------------------------------------------------- /hadoop/数据分析篇.md: -------------------------------------------------------------------------------- 1 | ## 数据分析篇 2 | 3 | ### Hive 4 | 5 | Spark SQL、Impala和Presto引擎可直接读取处理Hive Metastore中的数据表 6 | 7 | #### 架构 8 | 9 | - Driver 10 | - SQL解析、生成逻辑计划、物理计划、查询优化与执行 11 | - 输入为SQL语句 12 | - 输出为一系列分布式执行程序(可以为MapReduce、Tez或Spark) 13 | - Metastore 14 | - 管理和存储元信息的服务 15 | - 保存数据库基本信息和数据表的定义等 16 | - 持久化到关系型数据库(默认嵌入式的Derby,可自定义为MySQL) 17 | - Hadoop 18 | - 依赖Hadoop:HDFS、YARN、MapReduce 19 | 20 | 21 | 22 | **可个性化指定每个HQL的执行引擎:MapReduce、Tez或Spark** 23 | 24 | ![image-20190404161032740](assets/image-20190404161032740.png) 25 | 26 | 27 | 28 | ```sql 29 | create table page_view ( 30 | view_time String, 31 | country String, 32 | userId String, 33 | page_url String, 34 | referrer_url String, 35 | ip String 36 | ) 37 | row format delimited fields terminated by ',' lines terminated by '\n' 38 | stored as TEXTFILE 39 | 40 | // 建表语法 41 | create [temporary] [external] table [if not exists] [`db_name`].`table_name` 42 | [(`col_name` `data_type` [comment `col_comment`],...)] 43 | [partitioned by (`col_name` `data_type` [comment `col_comment`],...)] 44 | [clustered by (`col_name`, `col_name`,...) into `num_buckets` buckets] 45 | [ 46 | [row format `row_fromat`] 47 | [stored as `file_format`] 48 | ] 49 | [location `hdfs_path`] 50 | [tblproperties (`property_name`=`property_vale`,...)] 51 | [as `select_statement`] 52 | 53 | // 解释 54 | // 表类型 55 | temporary table:临时表 56 | 仅当前session可见,一旦session退出,该数据表将自动被删除 57 | exteral table:外部表 58 | 外部表的数据存储路径是用户定义的,而非hive默认存放位置,外部表被删除后,其数据不会被清除(仅删除元数据) 59 | managed table:受管理表 60 | 默认的数据表类型,数据受Hive管理,与元信息生命周期一致 61 | 62 | // 数据类型 data_type 63 | // 基本数据类型 64 | tinyint、smallint、int、bigint、boolean、float、double、double precision、string、binary、timestamp、decimal、date、varchar和char 65 | // 数组 66 | array 类似Java数组 67 | // 映射表 68 | map 类似Java的map 69 | // 结构体 70 | struct 类似c语言中的结构体:由一系列具有相同类型或不同类型的数据构成的数据集合 71 | // 联合体 72 | union 类似c语言中的联合体:和结构体类似,但它将几种不同或相同类型的变量存放在同一段内存单元中 73 | 74 | // 分区表和分桶表:为加速数据处理,将数据划分成更小的存储单位 partitioned by & clustered by 75 | // 分区表 76 | 数据表可按照某个或几个字段进一步划分成多个数据分区,不同分区数据将被存放在不同目录中 77 | // 分桶表 78 | 数据表或数据分区可进步按照某个字段划分成若干桶 79 | 80 | // 行格式 row format 81 | // 仅对行式存储格式有意义 82 | 83 | // 数据格式 file_format 84 | textfile 85 | sequencefile 86 | rcfile 87 | orc 88 | parquet 89 | avro 90 | inputformat input_format_classname outputformat output_format_classname: 通过自定义这两个组件定义数据格式 91 | 92 | // 数据存放位置 hdfs_path 93 | 每个表对应数据将被存放在一个单独的目录中 94 | 参数配置:hive.metastore.warehouse.dir指定,默认是 /usr/hive/warehouse/.db// 95 | 96 | // 表属性 97 | hbase.table.name="table_name" // 用于hive与HBase集成,表示该hive表对应的HBase表为table_name 98 | orc.compress="ZLIP" 99 | ``` 100 | 101 | 102 | 103 | #### 查询 104 | 105 | - Order by 和 Sort by 106 | - Order by只启动一个reduceTask,Sort by 启动多个reduceTask 107 | 108 | - Distribute by 和 Cluster by 109 | - distribute by 按指定字段或表达式对数据进行拆分 110 | - Cluster by等价于 Distribute by 和 Sort by的结合 111 | - SELECT col1, col2 FROM t1 CLUSTER BY col1 同比 SELECT col1,col2 FROM t1 DISTRIBUTE BY col1 SORT BY col1 112 | - 数据量大时,推荐使用 distribute by + sort by 的方案 113 | 114 | 115 | 116 | 117 | 118 | ### Spark SQL 119 | 120 | #### 架构 121 | 122 | ![image-20190404162714596](assets/image-20190404162714596.png) 123 | 124 | 125 | 126 | ### 统一编程模型 127 | 128 | #### Apache Beam 129 | 130 | - SDK 131 | - Pipeline:封装整个数据处理逻辑计算:包括输入、处理以及输出;每个Beam必须创建一个Pipeline,并定义其运行相关配置选项(比如采用的计算引擎、计算引擎的相关参数等) 132 | - PCollection:分布式数据集的抽象;可以是有限的(bounded),即来自固定数据源如HDFS;可以是无限的(unbounded),即来自不断更新的数据源如Kafka消息队列 133 | - Transform:是Pipeline中一个数据处理操作或步骤,每个Transform以一个或多个PCollection对象作为输入,依次遍历其中每一个元素并作用在用户定义的函数上,最终产生一个或多个PCollection对象 134 | - IO Source与Sink:对数据读取和存储逻辑的抽象 135 | - Runner 136 | 137 | ![image-20190406140012345](assets/image-20190406140012345.png) 138 | 139 | ##### Beam IO 140 | 141 | ![image-20190409200641442](assets/image-20190409200641442.png) 142 | 143 | 144 | 145 | 146 | 147 | ##### 构建Pipline 148 | 149 | 创建Pipline时需定义配置信息:封装在PipelineOptions中 150 | 151 | - DirectPiplineOptions 152 | - SparkPiplineOptions 153 | - FlinkPiplineOptions 154 | - ApexPiplineOptions 155 | 156 | 157 | 158 | SparkPiplineOptions: ![image-20190406160453989](assets/image-20190406160453989.png) 159 | 160 | 161 | 162 | ##### 序列化、反序列器 163 | 164 | Beam默认序列化框架为Coder 165 | 166 | CoderRegister:Beam中序列化器注册中心,所有用到的序列化器统一在该类中注册;默认预先注册了多种基本类型的序列化器,还提供了Protobuf、Avro、 Writable等高级数据类型的序列化器 167 | 168 | 169 | 170 | ##### 流式计算 171 | 172 | 窗口 滚动、滑动、Session 173 | 174 | 延迟和乱序 Watermark 和 Trigger 175 | 176 | ```java 177 | // 2分钟 滚动(固定)窗口; 178 | // 水位; 179 | // 过早到达的数据,不需要等待watermark时间戳触发计算,而是每1分钟便进行一次计算 180 | // 延迟到达的数据,每收到1条数据就进行一次计算 181 | // 运行每个窗口的数据最多延迟一分钟到达 182 | // 丢弃模式:discardingFiredPanes() 183 | // 累计模式:accumulatingFiredPanes() 184 | // 累计并撤销模式:accumulatingAndRetractingFiredPanes() 185 | PCollection scores = input 186 | .apply( 187 | Window.into(FixedWindows.of(Duration.standardMinutes(2))) 188 | .triggering( 189 | AtWatermark() 190 | .withEarlyFirings(AtPeriod(Duration.standardMinutes(1))) 191 | .withLateFirings(AtCount(1))) 192 | .discardingFiredPanes() // “丢弃”模式 193 | .withAllowedLateness(Druation.standardMinutes(1))) 194 | .apply(Sum.integersPerKey()); 195 | ``` 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | -------------------------------------------------------------------------------- /lucene/Lucene.md: -------------------------------------------------------------------------------- 1 | ## Lucene 2 | 3 | #### Scalable, High-Performance Indexing 4 | 5 | - over [150GB/hour on modern hardware](http://home.apache.org/~mikemccand/lucenebench/indexing.html) 6 | - 每秒可以索引40M 7 | - small RAM requirements -- only 1MB heap 8 | - 参考 对象重用 9 | - incremental indexing as fast as batch indexing 10 | - index size roughly 20-30% the size of text indexed 11 | 12 | 13 | 14 | #### 内存 15 | 16 | - 添加文档 -> 内存 -> 文档到达一定数量或内存满(默认16M) 会触发flash到磁盘-> flash会触发多Segment合并(后台异步合并) 17 | - DocComsumer在处理文档时直接将数据持久化到文件,只有在处理中时需要使用RAM 18 | - 其他的Comsumer:FreqProxTermsWriter和NormsWriter会缓存在内存中,当有新的Segment制造出的时候才会flash到磁盘 19 | - 查询时,需要将磁盘上的索引信息读到内存 20 | 21 | 22 | 23 | 24 | 25 | #### 索引创建过程 26 | 27 | 参考:Annotated-Lucene源码剖析 28 | 29 | 30 | 31 | 32 | 33 | #### Lucene数据存储 34 | 35 | ##### lucene基本概念 36 | 37 | - **segment** : lucene内部的数据是由一个个segment组成的,写入lucene的数据并不直接落盘,而是先写在内存中,经过了refresh间隔,lucene才将该时间段写入的全部数据refresh成一个segment,segment多了之后会进行merge成更大的segment。lucene查询时会遍历每个segment完成。由于lucene* 写入的数据是在内存中完成,所以写入效率非常高。但是也存在丢失数据的风险,所以Elasticsearch基于此现象实现了translog,只有在segment数据落盘后,Elasticsearch才会删除对应的translog。 38 | 39 | - **doc** : doc表示lucene中的一条记录 40 | - **field** :field表示记录中的字段概念,一个doc由若干个field组成。 41 | - **term** :term是lucene中索引的最小单位,某个field对应的内容如果是全文检索类型,会将内容进行分词,分词的结果就是由term组成的。如果是不分词的字段,那么该字段的内容就是一个term。 42 | - **倒排索引**(inverted index): lucene索引的通用叫法,即实现了term到doc list的映射。 43 | - **正排数据**:搜索引擎的通用叫法,即原始数据,可以理解为一个doc list。 44 | - **docvalues** :Elasticsearch中的列式存储的名称,Elasticsearch除了存储原始存储、倒排索引,还存储了一份docvalues,用作分析和排序。 45 | 46 | 47 | 48 | ##### 磁盘缓存 49 | 50 | - IndexWriter添加的Document在内存中,此时Lucene查询不可见 51 | - ES同时添加translog,用于保证异常发送时数据不丢失,ES每5秒或每次请求操作结束前,会强制刷新translog日志到磁盘:(会牺牲一定性能以换去一致性) 52 | - index.translog.durability=async 53 | - ES默认30分钟进行一次主动flash或translog文档大小大于512M时 54 | - flash_threshold_period 55 | - flash_threshold_size 56 | 57 | - ES默认1秒refresh内存到文件系统缓存,这样lucene就可实时可搜索了 58 | 59 | - 如果对写入性能要求高,而对查询实时要求相对低,可选择增加refresh时间 10s 60 | 61 | - 这样会在文件系统缓存中存在很多Segment,大小不等 62 | 63 | - Segment合并,后台线程运行(归并线程) 64 | - 合并多个小Segment到大Segment,大的Segment合并期间,Lucene查询不可见,合并完成Commit后,会逐渐将被合并的几个小Segment无读取和查询打开后,删除掉,替换为从大的Segment读取 65 | - 归并线程数 Math.min(3, Runtime.getRuntime().availableRrocessors() / 2) 66 | 67 | 68 | 69 | 70 | 71 | ##### 语言处理组件(linguistic processor) 72 | 73 | ​ 主要是对得到的词元(Token)做一些同语言相关的处理。 74 | 75 | ​ 对于英语,语言处理组件(Linguistic Processor)一般做以下几点: 76 | 77 | - 变为小写(Lowercase)。 78 | - 将单词缩减为词根形式,如“cars”到“car”等。这种操作称为:stemming。 79 | - 将单词转变为词根形式,如“drove”到“drive”等。这种操作称为:lemmatization 80 | 81 | 82 | 83 | 84 | 85 | ##### 源码核心类 86 | 87 | - IndexWriter 只能开启一个 88 | 89 | - DocumentWriter 90 | 91 | - DocumentsWriterPerThreadPool 92 | - ThreadState 93 | - DocumentsWriterPerThread 并发处理索引 94 | - DefaultIndexingChain 95 | - FreqProxTermsWriter 词 96 | - TermVectorsConsumer 词向量 97 | - StoredFieldsWriter 存储Field中的值 98 | - CompressingStoredFieldsWriter:构造函数会创建对应的.fdt和.fdx文件,并写入相应的头信息(参考:Lucene存储参考) 99 | - processField() 方法处理字段 100 | - Invert indexed fields 101 | - invert() 方法 处理 反向索引 102 | - Add stored fields 103 | - writeField() 方法 处理 字段存储 104 | - DocValues 105 | - indexDocValue() 方法 106 | - flash() 107 | 108 | 109 | 110 | ##### Integer的问题 111 | 112 | Lucene6后加入的点(point)的概念:来表示数值类型 113 | 114 | ``` 115 | IndexableFieldType: 116 | 117 | /** 118 | * If this is positive, the field is indexed as a point. 119 | * 返回点的维数 120 | */ 121 | public int pointDimensionCount(); 122 | 123 | /** 124 | * The number of bytes in each dimension's values. 125 | * 返回点中数值类型的字节数 126 | */ 127 | public int pointNumBytes(); 128 | ``` 129 | 130 | point提供了精确、范围查询的便捷方法 131 | 132 | 点:有空间概念:维度;一维 一个值,二维 两个值... 133 | 134 | 可以表示地理空间 135 | 136 | 137 | 138 | ##### 预定义的字段子类 139 | 140 | - TextField 141 | - StringField 142 | - IntPoint 143 | - LongPoint 144 | - FloatPoint 145 | - DoublePoint 146 | - SortedDocValuesField 147 | - SortedSetDocValuesField 148 | - NumericDocValuesField 149 | - SortedNumericDocValuesField 150 | - StoredField 151 | 152 | 如果上述不能满足,可自行声明 Field 和 FieldType 153 | 154 | 155 | 156 | ##### 对象重用 157 | 158 | > Field提供setXXXValue()方法 159 | > 160 | > 多个文档,只需要不断修改值就可以了:体现了1MB heap 161 | 162 | 163 | 164 | > 加入索引时,每个数据记录可重用 Document对象 165 | 166 | 167 | 168 | ##### 索引更新删除 169 | 170 | > 删除 171 | > 172 | > ​ 根据Term、Query找到相应文档ID,同时删除索引信息,再删除对应文档 173 | > 174 | > 更新 175 | > 176 | > ​ 先删除,在新增doc 177 | > 178 | > 只可以根据索引的字段进行更新(要基于Term和Query找ID) 179 | 180 | 181 | 182 | ##### 相似度 183 | 184 | ​ BM25和Vector Space Model算法 185 | 186 | 187 | 188 | ##### 词法分析、语言处理、语法分析 189 | 190 | 191 | 192 | ##### 问题 193 | 194 | Lucene严格限制: 195 | 196 | ​ 单个索引中最大文档数:约 21.4亿 197 | 198 | 199 | 200 | #### 参考 201 | 202 | [Lucene原理细讲](https://blog.csdn.net/liuhaiabc/article/details/52346493) 203 | 204 | [Lucene存储原理](https://www.cnblogs.com/zxf330301/articles/8728369.html) 205 | 206 | [Lucene存储参考](https://elasticsearch.cn/article/6178) 207 | 208 | [Lucene列式存储格式DocValues](https://mp.weixin.qq.com/s?__biz=MzI4Njk3NjU1OQ==&mid=2247484096&idx=1&sn=d613665e9efcb3ec708b866571e66a90&chksm=ebd5fd80dca27496f03c5449c63064fab2ebde19860e95219e946f46e60206b18947f41d8c1d&scene=21#wechat_redirect) 209 | 210 | [lucene字典实现原理倒排索引实现——FST](http://www.cnblogs.com/bonelee/p/6226185.html) 211 | 212 | [FST测试]([http://examples.mikemccandless.com/fst.py?terms=&cmd=Build+it](http://examples.mikemccandless.com/fst.py?terms=&cmd=Build+it)) 213 | 214 | [Lucene源码分析](https://blog.csdn.net/conansonic/article/details/51886014) -------------------------------------------------------------------------------- /hive/Hive+ES.md: -------------------------------------------------------------------------------- 1 | ## Hive integrate with ElasticSearch 2 | 3 | 下载jar包,导入Hive的auxlib中,需要重启Hive么? - 需要 4 | 5 | 6 | 7 | #### 注意 8 | 9 | ​ 目前官方的ElasticSearch-hadoop不支持hadoop3.0版本 - 2019.06.11 10 | 11 | 12 | 13 | ``` 14 | // 建表 15 | CREATE EXTERNAL TABLE es (id string, field1_s string, field2_i int) 16 | STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' 17 | LOCATION '/tmp/es' 18 | TBLPROPERTIES('es.nodes' = '10.76.95.124:31483', 19 | 'es.index.auto.create' = 'true', 20 | 'es.resource' = 'es/hive', 21 | 'es.read.metadata' = 'true', 22 | 'es.mapping.names' = 'id:_metadata._id'); 23 | 24 | # 如果只需要mapping es 的 _id 可使用如下 25 | 'es.mapping.id' = 'goods_order_id', 26 | 27 | // 问题: 28 | 1. MetaException(message:java.lang.NoClassDefFoundError org/apache/commons/httpclient/HttpConnectionManager) 29 | 2. message:java.lang.NoClassDefFoundError org/apache/commons/httpclient/Credentials 30 | 31 | // 目前官方的ElasticSearch-hadoop不支持hadoop3.0版本 - 2019.06.11 32 | ``` 33 | 34 | 35 | 36 | Hive 集成:https://www.elastic.co/guide/en/elasticsearch/hadoop/current/hive.html 37 | 38 | 建表语句的在es中的配置:https://www.elastic.co/guide/en/elasticsearch/hadoop/current/configuration.html 39 | 40 | 41 | 42 | ### Configuration 43 | 44 | #### Required settings 45 | 46 | - `es.resource` 47 | 48 | Elasticsearch resource location, where data is read *and* written to. Requires the format `/` (relative to the Elasticsearch host/port (see [below](https://www.elastic.co/guide/en/elasticsearch/hadoop/current/configuration.html#cfg-network)))). 49 | 50 | ``` 51 | es.resource = twitter/tweet # index 'twitter', type 'tweet' 52 | 53 | # 查询所有索引所有的type 54 | 'es.resource' = '_all/types' 55 | # 查询index索引下所有的type 56 | 'es.resource' = 'index/' 57 | ``` 58 | 59 | 60 | 61 | #### Querying 62 | 63 | - `es.query` (default none) 64 | 65 | Holds the query used for reading data from the specified `es.resource`. By default it is not set/empty, meaning the entire data under the specified index/type is returned. `es.query` can have three forms: 66 | 67 | - uri query 68 | - using the form `?uri_query`, one can specify a [query string](https://www.elastic.co/guide/en/elasticsearch/reference/7.1/search-uri-request.html). Notice the leading `?`. 69 | - query dsl 70 | - using the form `query_dsl` - note the query dsl needs to start with `{` and end with `}` as mentioned [here](https://www.elastic.co/guide/en/elasticsearch/reference/7.1/search-request-body.html) 71 | - external resource 72 | - if none of the two above do match, elasticsearch-hadoop will try to interpret the parameter as a path within the HDFS file-system. If that is not the case, it will try to load the resource from the classpath or, if that fails, from the Hadoop `DistributedCache`. The resource should contain either a `uri query` or a `query dsl`. 73 | 74 | ``` 75 | 1)以uri 方式查询 76 | es.query = ?q=98E5D2DE059F1D563D8565 77 | 2)以dsl 方式查询 78 | es.query = { "query" : { "term" : { "user" : "costinl" } } } 79 | 'es.query'='{"query": {"match_all": { }}}', 80 | 3) external resource 81 | es.query = org/mypackage/myquery.json 82 | ``` 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | #### Serialization 95 | 96 | `es.batch.size.bytes` (default 1mb) 97 | 98 | Size (in bytes) for batch writes using Elasticsearch [bulk](https://www.elastic.co/guide/en/elasticsearch/reference/7.1/docs-bulk.html) API. Note the bulk size is allocated *per task*instance. Always multiply by the number of tasks within a Hadoop job to get the total bulk size at runtime hitting Elasticsearch. 99 | 100 | `es.batch.size.entries` (default 1000) 101 | 102 | Size (in entries) for batch writes using Elasticsearch [bulk](https://www.elastic.co/guide/en/elasticsearch/reference/7.1/docs-bulk.html) API - (0 disables it). Companion to `es.batch.size.bytes`, once one matches, the batch update is executed. Similar to the size, this setting is *per task* instance; it gets multiplied at runtime by the total number of Hadoop tasks running. 103 | 104 | `es.batch.write.refresh` (default true) 105 | 106 | Whether to invoke an [index refresh](https://www.elastic.co/guide/en/elasticsearch/reference/7.1/indices-refresh.html) or not after a bulk update has been completed. Note this is called only after the entire write (meaning multiple bulk updates) have been executed. 107 | 108 | `es.batch.write.retry.count` (default 3) 109 | 110 | Number of retries for a given batch in case Elasticsearch is overloaded and data is rejected. Note that only the rejected data is retried. If there is still data rejected after the retries have been performed, the Hadoop job is cancelled (and fails). A negative value indicates infinite retries; be careful in setting this value as it can have unwanted side effects. 111 | 112 | `es.batch.write.retry.wait` (default 10s) 113 | 114 | Time to wait between batch write retries that are caused by bulk rejections. 115 | 116 | `es.ser.reader.value.class` (default *depends on the library used*) 117 | 118 | Name of the `ValueReader` implementation for converting JSON to objects. This is set by the framework depending on the library (Map/Reduce, Hive, Pig, etc…) used. 119 | 120 | `es.ser.writer.value.class` (default *depends on the library used*) 121 | 122 | Name of the `ValueWriter` implementation for converting objects to JSON. This is set by the framework depending on the library (Map/Reduce, Hive, Pig, etc…) used. 123 | 124 | -------------------------------------------------------------------------------- /spark/spark_01.md: -------------------------------------------------------------------------------- 1 | ## Spark_01 2 | 3 | ```sql 4 | -- 运行spark例子 5 | ./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster examples/jars/spark-examples_2.11-2.3.2.3.1.0.0-78.jar 10 6 | 7 | -- RDD依赖 8 | 1. 宽依赖:存在shuffle的操作 9 | 2. 窄依赖:一对一的操作 10 | ``` 11 | 12 | 13 | 14 | ##### 测试Jieba UDF分词 15 | 16 | ```sql 17 | -- 添加数据 18 | use zjj; 19 | create table news_seg(sentence string) stored as textfile; 20 | load data inpath '/data/allfile/allfiles.txt' into table news_seg; 21 | 22 | -- 测试 23 | select split(regexp_replace(sentence, ' ', ''), '##@@##')[0] as sentence, split(regexp_replace(sentence, ' ', ''), '##@@##')[1] as label from news_seg limit 1; 24 | 25 | create table news_noseg as 26 | select split(regexp_replace(sentence, ' ', ''), '##@@##')[0] as sentence, split(regexp_replace(sentence, ' ', ''), '##@@##')[1] as label from news_seg; 27 | 28 | select * from news_noseg limit 10; 29 | ``` 30 | 31 | 32 | 33 | ##### HDP3.0 中Hive和Spark打通模式变化 34 | 35 | ``` 36 | 参考: 37 | https://docs.hortonworks.com/HDPDocuments/HDP3/HDP-3.1.0/integrating-hive/content/hive_hivewarehouseconnector_for_handling_apache_spark_data.html 38 | ``` 39 | 40 | 41 | 42 | ##### 练习1 43 | 44 | ```scala 45 | /* 46 | -- 表信息 47 | -- order_product_prior 订单产品信息表 48 | -- order_id, product_id, add_to_cart_order, reordered 49 | 50 | -- orders 订单表:订单和用户的信息 dow=day of week 51 | -- order_id,user_id,eval_set,order_number(购买订单的顺序),order_dow(星期几),order_hour_of_day(一天中的哪个小时),days_since_prior_order(距离上一个订单的时间) 52 | */ 53 | 54 | package com.dbzjz.demo.sparkdemo 55 | 56 | import org.apache.spark.sql.DataFrame 57 | import org.apache.spark.sql.functions._ 58 | 59 | object SimpleFeature { 60 | 61 | def Feat(priors:DataFrame, orders:DataFrame): DataFrame = { 62 | 63 | // 每个商品的商品销量;每个商品再次购买商品的销量;每个商品再次购买占总购买的比率 avg([0,1,0,1,1,...]) 64 | val priorsCnt = priors 65 | .selectExpr("product_id", "cast(reordered as int)") 66 | .groupBy("product_id") 67 | .agg( 68 | count("product_id").as("prod_cnt"), 69 | sum("reordered").as("prod_sum_rod"), 70 | avg("reordered").as("prod_rod_rate")) 71 | 72 | 73 | // 每个用户平均购买订单的间隔周期;每个用户的总订单数量 todo 处理空值 74 | val tmp = orders 75 | .selectExpr("*", "if(days_since_prior_order == '',0,days_since_prior_order) as dspo") 76 | .drop("days_since_prior_order") // 删除一列 77 | 78 | val tmp1 = tmp 79 | .selectExpr("user_id", "order_id", "cast(dspo as int)") 80 | .groupBy("user_id") 81 | .agg( 82 | avg("dspo").as("order_cycle"), 83 | count("order_id").as("order_cnt") 84 | ) 85 | 86 | // 每个用户购买的product商品去重后的集合数据 87 | val joinOn = priors.col("order_id") === orders.col("order_id") 88 | val tmp2 = orders 89 | // .join(priors, "order_id") 90 | .join(priors, joinOn) 91 | 92 | // 法一 hivesql 93 | val tmp3 = tmp2 94 | .selectExpr("user_id", "concat_ws(',', collect_set(product_id))") 95 | .groupBy("user_id") 96 | 97 | // 法二 rdd 98 | import priors.sparkSession.implicits._ 99 | val tmp4 = tmp2.select("user_id", "product_id") 100 | .rdd 101 | .map(x => (x(0).toString, x(1).toString)) 102 | .groupByKey() 103 | .mapValues(_.toSet.mkString(",")) 104 | .toDF("user_id", "prods") 105 | 106 | // 每个用户总商品数量以及去重后的商品数量 107 | val tmp5 = tmp2.select("user_id", "product_id") 108 | .rdd 109 | .map(x => (x(0).toString, x(1).toString)) 110 | .groupByKey() 111 | .mapValues{values=> 112 | val valuesSet = values.toSet 113 | (values.size, valuesSet.size) 114 | }.toDF("user_id", "tuple") 115 | .selectExpr("user_id", "tuple._1 as prod_cnt", "tuple._2 as prod_dist_cnt") 116 | 117 | // 每个用户购买的平均每个订单的商品数量(hive已做过) 118 | // 1)每个订单的商品数量 119 | val tmp6 = priors.groupBy("order_id").count() 120 | // 2) 每个用户,订单的avg(商品数量) 121 | val tmp7 = tmp6.join(orders, "order_id") 122 | .groupBy("user_id") 123 | .avg("count") 124 | .withColumnRenamed("avg(count)", "per_order_avg_prod_cnt") 125 | 126 | val userFeature = tmp1.join(tmp4, "user_id") 127 | .join(tmp5, "user_id") 128 | .join(tmp6, "user_id") 129 | .selectExpr("user_id", 130 | "order_cycle as u_order_cycle", "order_cnt as u_order_cnt", 131 | "prods as u_dist_prod_set", 132 | "prod_cnt as u_prod_cnt", "prod_dist_cnt as u_prod_dist_cnt", 133 | "per_order_avg_prod_cnt as u_per_order_avg_prod_cnt" 134 | ) 135 | 136 | /** 137 | * user and product Feature : cross feature 交叉特征 138 | * 特征分类:count、rate(比率)、avg(mean)、std(方差)、max、min 139 | * 140 | * 141 | * */ 142 | userFeature 143 | } 144 | } 145 | 146 | ``` 147 | 148 | 149 | 150 | ##### Submit param 151 | 152 | ```shell 153 | ./bin/spark-submit \ 154 | --class com.hadoop123.example.SparkInvertedIndex \ 155 | --master yarn-cluster \ 156 | --deploy-mode cluster \ 157 | --driver-memory 3g \ 158 | --num-executors 3 \ 159 | --executor-memory 4g \ 160 | --executor-cores 4 \ 161 | --queue spark \ 162 | SparkInvertedIndex.jar 163 | ``` 164 | 165 | 166 | 167 | ##### 优化: 168 | 169 | ```shell 170 | 1. SparkConf和SparkSubmit中可设置 171 | 172 | --driver-memory:1-4G:collect时会将数据缓存到AM中 173 | --num-executors: Executor的数量:一般在5,10,20个之间 174 | --executor-memory:建议4-8G,(4*10总内存)可参考数据量的10倍配置 175 | --executor-cores:根据实际情况:1,3(建议),5个 176 | --queue spark 177 | --spark.default.parallelism:每个Stage的默认Task数量:建议500-1000之间,默认一个HDFS的Block对应一个Task,默认值偏少,不能有效利用资源 178 | --spark.storage.memoryFraction:设置RDD持久化数据在executor内存中能占的比例,默认0.6,即executro内存的60%的内存可用于持久化RDD数据;建议有较多持久化操作时,可设置高一些,超出内存会导致频繁GC 179 | --spark.shuffle.memoryFraction:聚合操作exector内存的比例,默认0.2;建议若持久化操作较少,但是shuffle较多时,可降低持久化内存占比,提高shuffle操作的内存占比 180 | 181 | 2. RDD复用 182 | 183 | 3. 避免重复创建相同数据的RDD 184 | 185 | 4. 缓存中间计算结果,加速故障恢复cache() persist() 对应缓存持久化级别:内存、磁盘、内存-磁盘等等 186 | 187 | 5. 尽量减少Shuffle,很难避免 188 | Broadcast+map的join操作不会导致shuffle,但是前提是广播的RDD数据量较小?2G内? 189 | 190 | 6. 尽量使用reduceByKey或aggregateByKey代替groupByKey,他们会预聚合 191 | 192 | 7. 使用Kryo优化序列化性能(10倍) 193 | ``` 194 | 195 | -------------------------------------------------------------------------------- /Problems.md: -------------------------------------------------------------------------------- 1 | ## Problems 2 | 3 | HDFS 4 | 5 | ``` 6 | 问题: 7 | Connection failed: [Errno 111] Connection refused to apollo03.dev.zjz:2049 8 | 解决: 9 | HDFS NFS Gateway工作需要依附 rpcbind 服务,所以启动前需要确定rpcbind服务正常开启。 10 | service rpcbind status 11 | service rpcbind start 12 | 13 | sudo systemctl status rpcbind 14 | sudo vim /etc/systemd/system/sockets.target.wants/rpcbind.socket 15 | systemctl status rpcbind.socket 16 | 17 | ● rpcbind.socket - RPCbind Server Activation Socket 18 | Loaded: loaded (/usr/lib/systemd/system/rpcbind.socket; enabled; vendor preset: enabled) 19 | Active: failed (Result: resources) 20 | Listen: /var/run/rpcbind.sock (Stream) 21 | 0.0.0.0:111 (Stream) 22 | 0.0.0.0:111 (Datagram) 23 | [::]:111 (Stream) 24 | [::]:111 (Datagram) 25 | Warning: rpcbind.socket changed on disk. Run 'systemctl daemon-reload' to reload units. 26 | 27 | sudo systemctl daemon-reload 28 | sudo systemctl start rpcbind.socket 29 | 解决! 30 | 31 | 问题: 32 | hadoop集群安全模式,导致hbase无法读取,yarn无法运行 33 | 34 | 在安全模式下输入指令: 35 | hadoop dfsadmin -safemode leave 36 | hdfs dfsadmin -safemode leave 37 | sudo -u hdfs hdfs dfsadmin -safemode leave 38 | 即可退出安全模式 39 | 40 | 格式:Usage: java DFSAdmin [-safemode enter | leave | get |wait] 41 | 用户可以通过dfsadmin -safemode value 来操作安全模式,参数value的说明如下: 42 | enter - 进入安全模式 43 | leave - 强制NameNode离开安全模式 44 | get   - 返回安全模式是否开启的信息 45 | wait  - 等待,一直到安全模式结束 46 | 47 | 问题:权限 48 | change dfs.permissions.enabled to false 49 | ``` 50 | 51 | 52 | 53 | Hive 54 | 55 | ``` 56 | 修改Hive Interactive 的 HiveServer2 Port 和 thrift.http.port 的地址 57 | 以匹配 HiveServer2服务 58 | 59 | 修改hive.server2.thrift.http.port=10002 60 | 61 | 待定 62 | ``` 63 | 64 | 65 | 66 | HBase: 67 | 68 | ``` 69 | // 检查HBase集群状态: 70 | hbase hbck 71 | // https://blog.csdn.net/xiao_jun_0820/article/details/28602213 72 | // https://www.cnblogs.com/quchunhui/p/9583746.html 73 | ``` 74 | 75 | 76 | 77 | TimeLine: 78 | 79 | ``` 80 | 问题: 81 | 内嵌HBase问题 82 | // 参考,不用这个 https://www.cnblogs.com/langfanyun/p/10821415.html 83 | // 官方: 84 | https://docs.hortonworks.com/HDPDocuments/HDP3/HDP-3.1.0/data-operating-system/content/configure_hbase_for_timeline_service_2.0.html 85 | 86 | // {hdp-dir} = /usr/hdp/3.1.0.0-78 87 | export HBASE_CLASSPATH_PREFIX=/usr/hdp/3.1.0.0-78/hadoop-yarn/timelineservice/*; /usr/hdp/3.1.0.0-78/hbase/bin/hbase org.apache.hadoop.yarn.server.timelineservice.storage.TimelineSchemaCreator -Dhbase.client.retries.number=35 -create -s 88 | 89 | // 日志 90 | INFO [main] storage.TimelineSchemaCreator: Successfully created HBase schema. 91 | INFO [main] storage.TimelineSchemaCreator: Schema creation finished successfully 92 | 93 | // HBase授权 94 | grant 'yarn', 'RWXCA' 95 | 96 | 错误:ERROR: DISABLED: Security features are not available 97 | search keywords:HDP HBase acl 98 | 参考:https://docs.hortonworks.com/HDPDocuments/HDP3/HDP-3.1.0/security-reference/content/kerberos_nonambari_configure_hbase_for_access_control_lists_acl_.html 99 | 解决:因为目前集群未开启安全kerberos,所以此参考暂时无法处理,先看看不开启acl是不是任意用户都可访问 100 | 直接 scan timelineservice相关的表,发现里面已经有数据了,说明yarn可以正常读取 101 | ``` 102 | 103 | 104 | 105 | Ambari: 106 | 107 | ``` 108 | 问题: 109 | Cannot create /var/run/ambari-server/stack-recommendations 110 | 原因:文件权限 111 | 解决: 112 | sudo chown -R ambari /var/run/ambari-server 113 | 114 | 参考: 115 | https://blog.csdn.net/qq_19968255/article/details/72881989 116 | ``` 117 | 118 | 119 | 120 | HDP 3.1.0 HIVE使用tez 长时间无反应 成功解决 121 | 122 | ``` 123 | 问题: 124 | HDP 3.1.0 安装的HIVE使用tez,执行任务需要用到tez session时会找不到 125 | 解决: 126 | 1. 在打开后增加以下设置 127 | set hive.server2.tez.initialize.default.sessions=true; 128 | 2. 如需一直生效,在hive的配置文件hive-site.xml中添加 129 | 130 | hive.server2.tez.initialize.default.sessions 131 | true 132 | 133 | 3. 在ambari的管理界面点开hive advance 设置 134 | Start Tez session at Initialization 为 true 135 | ``` 136 | 137 | 138 | 139 | Spark (2.x问题汇总:https://blog.csdn.net/xwc35047/article/details/53933265) 140 | 141 | ``` 142 | 问题: 143 | HDP 上安装了 Hive3.1 和 Spark2, 提交 Spark 作业时,报找不到 Hive 中表的问题 144 | 解决: 145 | 网上的另外几种方法: 146 | 1. 把 hive-site.xml 复制到 Spark 的 conf 目录下。 147 | 我看了一下 spark 的 conf 目录,有 hive-site.xml 这个表的,而且从日志中也可以看到 spark 能找到 hive 的 thrift://datacenter2:9083 这个地址,说明没问题。 148 | 149 | 2. 创建 spark session 的时候要启用 hive。 150 | val ss = SparkSession.builder().appName("统计").enableHiveSupport().getOrCreate() 151 | 我的程序里有启用的,所以也不是原因。 152 | 153 | 3. 关闭 Hive 3 中的默认的 ACID 功能,修改如下几个参数 154 | hive.strict.managed.tables=false 155 | hive.create.as.insert.only=false 156 | metastore.create.as.acid=false 157 | 试过之后,问题依旧。 158 | 崩溃了,找不到其它解决方法了。先记录一下。 159 | ================================================ 160 | 有别的事,先做别的了。过了2天,抱着试试看的态度,在 /etc/spark2/3.1.0.0-78/0 下建了个软链接到 /etc/hive/conf 下的 hive-site.xml ,竟然找得到表了。通过比较,发现原 spark 下的 hive-site.xml 里多了一个 metastore.catalog.default 的配置,值是 spark。在网上搜了一下,才知道要改成 hive 才可以读 hive 下创建的表。这个值我理解的是表示hive仓库的命名空间。为什么 Spark 没有默认设置成 hive 的 catalog 的呢? 因为 HDP 3.1 中的 hive 会默认开启 ACID,spark 读取 ACID 的 表时,会出错,所以设置了一个 spark 的 catalog。 161 | 162 | 163 | 问题:spark-shell 164 | scala> spark.sql("select * from orders") 165 | res7: org.apache.spark.sql.DataFrame = [order_id: string, user_id: string ... 5 more fields] 166 | scala> res7.show() 167 | 错误:java.io.IOException: Not a file: hdfs://hdftofuat/warehouse/tablespace/managed/hive/zjj.db/orders/delta_0000001_0000001_0000 168 | 解决: 169 | Unlike Hive, spark can not traverse through sub folders in HDFS.(与Hive不同,spark不能遍历HDFS中的子文件夹) 170 | 网上很多让设置这个的解决方案:尝试成功 171 | scala> sc.hadoopConfiguration.setBoolean("mapreduce.input.fileinputformat.input.dir.recursive", true) 172 | 深入分析: 173 | 存在子文件是因为,ACID的事务 174 | INSERT 语句会在一个事务中运行。它会创建名为 delta 的目录,存放事务的信息和表的数据。 175 | 176 | metastore.catalog.default:hive 177 | 这个选项默认为Spark, 即读取SparkSQL自己的metastore_db,修改完后,Spark Shell会去读取Hive的metastore,这样就可以实现以Spark Shell方式访问Hive SQL方式创建的databases/tables. 178 | 179 | 统一解决: 180 | 给mapReduce2添加mapreduce.input.fileinputformat.input.dir.recursive=true的custom设置 181 | ``` 182 | 183 | 184 | 185 | 全新Cloudera:https://www.cloudera.com/downloads.html 186 | 187 | Doc: 188 | 189 | https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.1.4/index.html 190 | 191 | https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.1.4/release-notes/content/comp_versions.html -------------------------------------------------------------------------------- /hadoop/HDFS深入理解.md: -------------------------------------------------------------------------------- 1 | ## HDFS深入理解 2 | 3 | ### Java中常见数据结构占用的内存大小 4 | 5 | ``` 6 | 下面先列举下java中常见数据结构占用的内存大小(64bit的jvm) 7 | int = 4 bytes 8 | long = 8 bytes 9 | Reference size(引用) = 8 bytes 10 | Object header size(对象头) = 16 bytes 11 | Array header size(数组头) = 24 bytes 12 | ArrayList header size(list头) = 24(数组头) + 4(属性size的大小) = 28 bytes 13 | TreeMap.Entry = 64 bytes. (Entry的属性中有5个引用) 14 | HashMap.Entry = 48 bytes. (Entry的属性有3个引用) 15 | String header = 64 bytes. 16 | ``` 17 | 18 | 19 | 20 | > 考了资料如*Hadoop权威指南*、*HADOOP-1687*等,INodeFile、INodeDirectory和BlockInfo对象大小在150~200bytes之间,可以使用150bytes对其内存进行评估 21 | 22 | 23 | 24 | ### CMS内存回收算法 25 | 26 | TODO: 27 | 28 | 正常情况下,对超过100GB内存进行回收处理时,可以控制到秒级别的停顿时间,但是如果回收失败被降级到串行内存回收时,应用的停顿时间将达到数百秒,这对应用本身是致命的。 29 | 30 | 31 | 32 | ### Hadoop NameNode内存瓶颈解决方案 33 | 34 | - 合并小文件:Ozone 35 | - 适量调整Block块大小:默认128M (不过BlockSize调整会间接影响到计算任务,需要进行适当的权衡) 36 | - 扩展NameNode分散单点负载(水平扩展NameNode): HDFS Federation方案 or Ozone 37 | - 根据元数据增长趋势,参考本文前述的内存空间占用预估方法,能够大体得到NameNode常驻内存大小,一般按照常驻内存占内存总量~60%调整JVM内存大小可基本满足需求。 38 | - 为避免GC出现降级的问题,可将CMSInitiatingOccupancyFraction调整到~70。 39 | - NameNode重启过程中,尤其是DataNode进行BlockReport过程中,会创建大量临时对象,为避免其晋升到Old区导致频繁GC甚至诱发FGC,可适当调大Young区(-XX:NewRatio)到10~15。 40 | 41 | 42 | 43 | #### 网上内存估算方案一 44 | 45 | ``` 46 | 问题说明 47 | HDFS元数据都会存在于Namenode的内存中,因此NameNode的内存大小直接决定了集群支持最大容量,如何估算namenode需要内存大小? 48 | 49 | 元数据占用内存空间说明 50 | 对象类别 估算大小(bytes) 计算方法 估计总大小(bytes) 51 | 文件 224 224+2*文件名长度 250 52 | 目录 264 264+2*文件名长度 290 53 | 块 152 152+72*副本数 368 54 | 55 | NameNode元数据内存估算举例 56 | 一个典型集群拥有如下信息 57 | 文件数量:10 600 000 58 | 目录数量:310 000 59 | 块数量:13 300 000 60 | 61 | 计算元数据需要内存: 250x 10600000+290x310000 +368x13300000 62 | = 7 634 300 000(bytes)≈ 7.63G 63 | 64 | 实际测算:在该NameNode实际使用内存9G。 65 | 实际计算中内存更大是因为内存中除了元数据还有其他信息。 66 | ``` 67 | 68 | 69 | 70 | #### 网上内存估算方案二 71 | 72 | ``` 73 | 例子: 74 | NameNode文件和block信息如下: 75 | 94115032 files and directories, 91722740 blocks = 185837772 total filesystem object(s). 76 | 77 | memSum = 185837772 * 150 bytes = 27875665800bytes = 25.9612368g < 26g 78 | 79 | 使用jmap命令查看此时NameNode的内存 80 | 命令jmap -histo:live pid > mem,输出内存大小为24619484976(22.9286821g,大约23g) 81 | ``` 82 | 83 | 84 | 85 | #### 美团内存估算方案(2016) 86 | 87 | ``` 88 | NetworkTopology:(相对开销少) 89 | 1. DatanodeDescriptor:(标识DataNode的关键结构) 90 | 假设集群中包括2000个DataNode节点,NameNode维护这部分信息需要占用的内存总量: 91 | (64 + 114 + 56 + 109 ∗ 16)∗ 2000 = ~4MB 92 | 2. InnerNode(描述机器拓扑结构中机架信息) 93 | 假设集群包括80个机架和2000个DataNode节点,NameNode维护拓扑结构中内部节点信息需要占用的内存总量: 94 | (44 + 48) ∗ 80 + 8 ∗ 2000 = ~25KB 95 | 96 | NameSpace: 97 | 假设HDFS目录和文件数分别为1亿,Block总量在1亿情况下,整个Namespace在JVM中内存使用情况: 98 | Total(Directory) = (24 + 96 + 44 + 48) ∗ 100M + 8 ∗ num(total children) 99 | Total(Files) = (24 + 96 + 48) ∗ 100M + 8 ∗ num(total blocks) 100 | Total = (24 + 96 + 44 + 48) ∗ 100M + 8 ∗ num(total children) + (24 + 96 + 48) ∗ 100M + 8 ∗ num(total blocks) = ~38GB 101 | 关于预估方法的几点说明: 102 | 1. 对目录树结构中所有的Directory均按照默认INodeDirectory.withQuotaFeature结构进行估算,如果集群开启ACL/Snapshotd等特性,需增加这部分内存开销。 103 | 2. 对目录树结构中所有的File按照INodeFile进行估算。 104 | 3. 从整个目录树的父子关系上看,num(total children)就是目录节点数和文件节点数之和。 105 | 4. 部分数据结构中包括了字符串,按照均值长度为8进行预估,实际情况可能会稍大。 106 | 107 | BlockMap: 108 | LightWeightGSet对应的内存空间全局唯一。尽管经过LightWeightGSet优化内存占用,但是BlocksMap仍然占用了大量JVM内存空间,假设集群中共1亿Block,NameNode可用内存空间固定大小128GB,则BlocksMap占用内存情况: 109 | 16 + 24 + 2% ∗ 128GB +( 40 + 128 )∗ 100M = ~20GB 110 | 111 | 总结: 112 | 根据前述对NameNode内存的预估,对比Hadoop集群历史实际数据:文件目录总量~140M,数据块总量~160M,NameNode JVM配置72GB,预估内存使用情况: 113 | Namespace:(24 + 96 + 44 + 48) ∗ 70M + 8 ∗ 140M + (24 + 96 + 48) ∗ 70M + 8 ∗ 160M = ~27GB BlocksMap:16 + 24 + 2% ∗ 72GB +( 40 + 128 )∗ 160M = ~26GB 114 | 说明:这里按照目录文件数占比1:1进行了简化,基本与实际情况吻合,且简化对内存预估结果影响非常小。 115 | 二者组合结果~53GB,结果与监控数据显示常驻内存~52GB基本相同,符合实际情况。 116 | 117 | 当可用JVM内存达180GB时,可管理元数据总量达~700000000(7亿),基本能够满足中小规模以下集群需求。 118 | 119 | 可供参考的NameNode内存数据空间占用预估模型: 120 | Total = 198 ∗ num(Directory + Files) + 176 ∗ num(blocks) + 2% ∗ size(JVM Memory Size) 121 | ``` 122 | 123 | ![image-20190418204037498](assets/image-20190418204037498.png) 124 | 125 | 126 | 127 | ### NameNode 迁移方案 128 | 129 | ``` 130 | 1、思路: 131 | • Hadoop集群是“机器不相关”(或者IP不相关?)的,无论是那台机器做Namenode,只要配置指向该节点,且该节点文件路径与原Namenode一致,则其他Datanode节点就应该会很傻很天真的以为它就是Namenode节点。 132 | 2、迁移方案举例: 133 | • 需把 192.168.7.2(hadoop-server1)NameNode迁移到 192.168.7.5 机器上,并保证hadoop集群上的存储数据不被损坏。 134 | 3、修改 192.168.7.5 的主机名为 hadoop-server1 135 | • 建议使用原先NameNode的主机名,这样可以省去修改集群节点配置文件 136 | 4、vi /etc/hosts 修改所有节点的hosts文件 137 | • 把192.168.7.2 改成 192.168.7.5 138 | 5、建立SSH 互信 139 | • 当hadoop-server2用主机名ssh hadoop-server1连接会出现失败,因为hadoop-server2的key记录里hadoop-server1是192.168.7.2,在hadoop-server2执行’ssh-keygen -f “/home/hadoop/.ssh/known_hosts” -R hadoop-server1’命令删除历史数据即可 140 | 6、配置192.168.7.5 JDK环境 141 | 7、从192.168.7.2 远程复制 zookeeper-3.4.8整个目录,7.5路径必须跟7.2保持一致。 142 | • scp -r /home/hadoop/zookeeper-3.4.8/ hadoop@192.168.7.5:/home/hadoop/ 143 | 8、配置Zookeeper环境变量 144 | 9、从192.168.7.2 远程复制 hadoop-2.4.0整个目录,7.5路径必须跟7.2保持一致。 145 | • scp -r /home/hadoop/hadoop-2.4.0/ hadoop@192.168.7.5:/home/hadoop/ 146 | 11、配置Hadoop环境变量 147 | 13、启动zookeeper、启动hadoop集群 148 | ``` 149 | 150 | 151 | 152 | ### HDFS数据删除 153 | 154 | HDFS中的数据删除也是比较有特点的,并不是直接删除,而是先放在一个类似回收站的地方(/trash),可供恢复。 155 | 156 | 对于用户或者应用程序想要删除的文件,HDFS会将它重命名并移动到/trash中,当过了一定的生命期限以后,HDFS才会将它从文件系统中删除,并由Namenode修改相关的元数据信息。并且只有到这个时候,Datanode上相关的磁盘空间才能节省出来,也就是说,当用户要求删除某个文件以后,并不能马上看出HDFS存储空间的增加,得等到一定的时间周期以后(现在默认为6小时)。 157 | 158 | 对于备份数据,有时候也会需要删除,比如用户根据需要下调了Replicaion的个数,那么多余的数据备份就会在下次Beatheart联系中完成删除,对于接受到删除操作的Datanode来说,它要删除的备份块也是先放入/trash中,然后过一定时间后才删除。因此在磁盘空间的查看上,也会有一定的延时。 159 | 160 | 那么如何立即彻底删除文件呢,可以利用HDFS提供的Shell命令:bin/Hadoop dfs expunge清空/trash。 161 | 162 | 163 | 164 | ### HDFS恢复过程 165 | 166 | TODO 167 | 168 | 169 | 170 | ### 整理总结 171 | 172 | > 按文件、目录、Block等比估算: 173 | > 174 | > 大致公式:572*B + 0.02 * M (B 文件数;M机器内存) 175 | > 176 | > - 3个主控节点;每个节点内存32G 177 | > - 2个NameNode分布在两台机器上、SNameNode单独一台机器 178 | > - 预算10G给HDFS 179 | > - 572*B + 0.02 * 32000 = 10000 => B: 16M ~ 1600 0000 ~ 1600万 180 | > - 可同时支持1600万文件、1600万目录、1600万Block 181 | > - 预算20G给HDFS 182 | > - 572*B + 0.02 * 32000 = 10000 183 | > - 5个节点;3个节点16G;2个节点32G 184 | > - 兼顾其他主控程序的运行内存需要: Yarn、Spark 185 | > - 7个节点;4个节点16G;3个节点32G 186 | 187 | 188 | 189 | ### 参考 190 | 191 | [博客1NameNode内存分析](http://bigdatadecode.club/NameNode%E5%86%85%E5%AD%98%E8%A7%A3%E6%9E%90%E5%8F%8A%E5%A4%A7%E5%B0%8F%E8%AF%84%E4%BC%B0.html) 192 | 193 | [博客2NameNode内存分析-美团](https://tech.meituan.com/2016/08/26/namenode.html) 194 | 195 | [博客3NameNode内存详解-美团]() 196 | 197 | [博客3HDFS恢复过程](http://bigdatadecode.club/[%E8%AF%91]HDFS%E6%81%A2%E5%A4%8D%E8%BF%87%E7%A8%8B1.html) -------------------------------------------------------------------------------- /hbase/Phoenix01.md: -------------------------------------------------------------------------------- 1 | ## Phoenix 2 | 3 | ### Quick Start 4 | 5 | us_population.sql 6 | 7 | ```sql 8 | CREATE TABLE IF NOT EXISTS us_population ( 9 | state CHAR(2) NOT NULL, 10 | city VARCHAR NOT NULL, 11 | population BIGINT 12 | CONSTRAINT my_pk PRIMARY KEY (state, city)); 13 | ``` 14 | 15 | us_population.csv 16 | 17 | ``` 18 | NY,New York,8143197 19 | CA,Los Angeles,3844829 20 | IL,Chicago,2842518 21 | TX,Houston,2016582 22 | PA,Philadelphia,1463281 23 | AZ,Phoenix,1461575 24 | TX,San Antonio,1256509 25 | CA,San Diego,1255540 26 | TX,Dallas,1213825 27 | CA,San Jose,912332 28 | ``` 29 | 30 | us_population_queries.sql 31 | 32 | ```sql 33 | SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum" 34 | FROM us_population 35 | GROUP BY state 36 | ORDER BY sum(population) DESC; 37 | ``` 38 | 39 | run 40 | 41 | ```shell 42 | cd /usr/hdp/3.1.0.0-78/phoenix/bin 43 | 44 | # 执行SQL脚本 45 | ./psql.py us_population.sql us_population.csv us_population_queries.sql 46 | 47 | # 登录本地 48 | ./sqlline.py localhost 49 | 50 | ./sqlline.py localhost ../examples/stock_symbol.sql 51 | ``` 52 | 53 | 54 | 55 | 映射HBase: 56 | 57 | ``` 58 | 映射前: 59 | hbase(main):013:0> scan 'mytable' 60 | ROW COLUMN+CELL 61 | row1 column=mycf:name, timestamp=1557403023523, value=billyWangpaul 62 | row2 column=mycf:name, timestamp=1557403057529, value=test1 63 | row3 column=mycf:name, timestamp=1557403063542, value=test2 64 | 65 | 映射: 66 | CREATE TABLE "mytable" ( 67 | "ROW" VARCHAR NOT NULL PRIMARY KEY, 68 | "mycf"."name" VARCHAR 69 | ); 70 | 71 | 映射后: 72 | Phoenix: 73 | 0: jdbc:phoenix:localhost> select * from "mytable"; 74 | +-------+----------------+ 75 | | ROW | name | 76 | +-------+----------------+ 77 | | row1 | billyWangpaul | 78 | | row2 | test1 | 79 | | row3 | test2 | 80 | +-------+----------------+ 81 | 82 | HBase: 83 | hbase(main):014:0> scan 'mytable' 84 | ROW COLUMN+CELL 85 | row1 column=mycf:_0, timestamp=1557403023523, value= 86 | row1 column=mycf:name, timestamp=1557403023523, value=billyWangpaul 87 | row2 column=mycf:_0, timestamp=1557403057529, value= 88 | row2 column=mycf:name, timestamp=1557403057529, value=test1 89 | row3 column=mycf:_0, timestamp=1557403063542, value= 90 | row3 column=mycf:name, timestamp=1557403063542, value=test2 91 | ``` 92 | 93 | 94 | 95 | ### 语法学习: 96 | 97 | #### 建表 98 | 99 | Phoenix中的表必须有主键 100 | 101 | 区分大小写 小写用 "my_case_sensitive_table" 102 | 103 | 主键不能有 colunm Family (Primary key columns must not have a family name) 104 | 105 | 非主键字段 不定长字段不能定义为not null (A non primary key column may only be declared as not null on tables with immutable rows) 106 | 107 | 中文的字段可设置为VARCHAR类型 108 | 109 | > CREATE TABLE IF NOT EXISTS MYTABLE (ID INTEGER PRIMARY KEY, NAME VARCHAR, SEX VARCHAR, ADDRESS VARCHAR); 110 | 111 | ``` 112 | CREATE TABLE my_schema.my_table ( 113 | id BIGINT not null primary key, 114 | date 115 | ) 116 | 117 | CREATE TABLE my_table ( 118 | id INTEGER not null primary key desc, 119 | date DATE not null, 120 | m.db_utilization DECIMAL, 121 | i.db_utilization 122 | ) 123 | m.DATA_BLOCK_ENCODING='DIFF' 124 | 125 | CREATE TABLE stats.prod_metrics ( 126 | host char(50) not null, 127 | created_date date not null, 128 | txn_count bigint 129 | CONSTRAINT pk PRIMARY KEY (host, created_date) 130 | ) 131 | 132 | CREATE TABLE IF NOT EXISTS "my_case_sensitive_table"( 133 | "id" char(10) not null primary key, 134 | "value" integer 135 | ) 136 | DATA_BLOCK_ENCODING='NONE', 137 | VERSIONS=5, 138 | MAX_FILESIZE=2000000 split on (?, ?, ?) 139 | 140 | CREATE TABLE IF NOT EXISTS my_schema.my_table ( 141 | org_id CHAR(15), 142 | entity_id CHAR(15), 143 | payload binary(1000), 144 | CONSTRAINT pk PRIMARY KEY (org_id, entity_id) 145 | ) 146 | TTL=86400 147 | ``` 148 | 149 | 150 | 151 | #### 删除表 152 | 153 | > DROP TABLE IF EXISTS MYTABLE; 154 | 155 | #### 插入数据 156 | 157 | > UPSERT INTO MYTABLE VALUES (1, 'WXB', 'MALE', '010-22222222'); 158 | 159 | #### 删除数据 160 | 161 | > DELETE FROM MYTABLE WHERE ID = 1; 162 | 163 | #### 查询数据 164 | 165 | > SELECT * FROM MYTABLE WHERE ID=1; 166 | 167 | #### 修改数据 168 | 169 | > UPSERT INTO MYTABLE VALUES (1, 'WXB', 'MALE', '010-22222222'); 170 | 171 | 172 | 173 | #### 索引 174 | 175 | ##### IMMutable Indexing 176 | 177 | ​ 不可变索引主要创建在不可变表上,适用于数据只写一次不会有Update等操作,在什么场景下会用到不可变索引呢,很经典的时序数据:`write once read many times`。在这种场景下,所有索引数据(primary和index)要么全部写成功,要么一个失败全都失败返回错误给客户端。不可变索引用到场景比较少,下面是创建不可变索引的方式: 178 | 179 | ``` 180 | create table test (pk VARCHAR primary key,v1 VARCHAR, v2 VARCHAR) IMMUTABLE_ROWS=true; 181 | 182 | 即在创建表时指定IMMUTABLE_ROWS参数为true,默认这个参数为false。如果想把不可变索引改为可变索引,可用alter修改: 183 | alter table test set IMMUTABLE_ROWS=false; 184 | ``` 185 | 186 | 187 | 188 | ##### Mutable Indexing 189 | 190 | ​ 可变索引意思是在修改数据如Insert、Update或Delete数据时会同时更新索引。这里的索引更新涉及WAL,即主表数据更新时,会把索引数据也同步更新到WAL,只有当WAL同步到磁盘时才会去更新实际的primary/index数据,以保证当中间任何一个环节异常时可通过WAL来恢复主表和索引表数据。 191 | 192 | 193 | 194 | https://yq.aliyun.com/articles/688618 索引 195 | 196 | ### 参考 197 | 198 | [博客1](https://zhuanlan.zhihu.com/p/21584994) 199 | 200 | [入门到精通](https://yq.aliyun.com/articles/574090?spm=a2c4e.11163080.searchblog.154.4f172ec1vxmdeh) 201 | 202 | [视频分享](https://yq.aliyun.com/teams/382/type_blog-cid_414-page_1) 203 | 204 | [用例](https://mp.weixin.qq.com/s/xh8NE8MpmahUtClViCdEIg) 205 | 206 | [Phoenix关于时区的处理方式说明](https://mp.weixin.qq.com/s/EL1Rfj2WbdXJj3AkjhS4ZA) 207 | 208 | [百度智能监控场景下的HBase实践](https://mp.weixin.qq.com/s/GIdzt1Zn_wOaiDKoHNITfw) 209 | 210 | [阿里云HBase+Spark+Phoenix,提供复杂数据分析支持](https://help.aliyun.com/document_detail/95046.html?spm=a2c4g.11186623.6.601.b81978f0GCM62z) 211 | 212 | -------------------------------------------------------------------------------- /hadoop/Yarn深入理解.md: -------------------------------------------------------------------------------- 1 | ## Yarn深入理解 2 | 3 | ### 内存配置 4 | 5 | #### RM的内存资源配置, 配置的是资源调度相关 6 | 7 | RM1:yarn.scheduler.minimum-allocation-mb 分配给AM单个容器可申请的最小内存 8 | RM2:yarn.scheduler.maximum-allocation-mb 分配给AM单个容器可申请的最大内存 9 | 注: 10 | 11 | - 最小值可以计算一个节点最大Container数量 12 | - 一旦设置,不可动态改变 13 | 14 | #### NM的内存资源配置,配置的是硬件资源相关 15 | 16 | NM1:yarn.nodemanager.resource.memory-mb 节点最大可用内存 17 | NM2:yarn.nodemanager.vmem-pmem-ratio 虚拟内存率,默认2.1 18 | 注: 19 | 20 | - RM1、RM2的值均不能大于NM1的值 21 | - NM1可以计算节点最大最大Container数量,max(Container)=NM1/RM1 22 | - 一旦设置,不可动态改变 23 | 24 | #### AM内存配置相关参数,配置的是任务相关 25 | 26 | AM1:mapreduce.map.memory.mb 分配给map Container的内存大小 27 | AM2:mapreduce.reduce.memory.mb 分配给reduce Container的内存大小 28 | 29 | - 这两个值应该在RM1和RM2这两个值之间 30 | - AM2的值最好为AM1的两倍 31 | - 这两个值可以在启动时改变 32 | 33 | AM3:mapreduce.map.Java.opts 运行map任务的jvm参数,如-Xmx,-Xms等选项 34 | AM4:mapreduce.reduce.java.opts 运行reduce任务的jvm参数,如-Xmx,-Xms等选项 35 | 注: 这两个值应该在AM1和AM2之间 36 | 37 | 38 | 39 | ### 计算 40 | 41 | 每两个container使用一块磁盘以及一个CPU核的时候可以使集群的资源得到一个比较好的利用。 42 | 43 | YARN以及MAPREDUCE所有可用的内存资源应该要除去系统运行需要的以及其他的hadoop的一些程序 44 | 45 | 总共保留的内存=系统内存+HBASE内存 46 | 47 | 参考保留内存 48 | 49 | | 每台机子内存 | 系统需要的内存 | HBase需要的内存 | 50 | | ------------ | -------------- | --------------- | 51 | | 4GB | 1GB | 1GB | 52 | | 8GB | 2GB | 1GB | 53 | | 16GB | 2GB | 2GB | 54 | | 24GB | 4GB | 4GB | 55 | | 48GB | 6GB | 8GB | 56 | | 64GB | 8GB | 8GB | 57 | | 72GB | 8GB | 8GB | 58 | | 96GB | 12GB | 16GB | 59 | | 128GB | 24GB | 24GB | 60 | | 255GB | 32GB | 32GB | 61 | | 512GB | 64GB | 64GB | 62 | 63 | 64 | 65 | #### 每台机器container计算: 66 | 67 | containers = min (2\*CORES, 1.8*DISKS, (Total available RAM) / MIN_CONTAINER_SIZE) 68 | 69 | 说明: 70 | 71 | - CORES为机器CPU核数 72 | - **DISKS为机器上挂载的磁盘个数** 73 | - Total available RAM为机器总内存 74 | - MIN_CONTAINER_SIZE是指container最小的容量大小,这需要根据具体情况去设置,可以参考下面的表格: 75 | 76 | | 每台机子可用的RAM | container最小值 | 77 | | :---------------- | :-------------- | 78 | | 小于4GB | 256MB | 79 | | 4GB到8GB之间 | 512MB | 80 | | 8GB到24GB之间 | 1024MB | 81 | | 大于24GB | 2048MB | 82 | 83 | 84 | 85 | > - 2核4线程 1块磁盘 5G(8G内存) 512M 86 | > - min(2 * 4, 1.8 * 1, 5000M/512M) = 2 87 | 88 | 89 | 90 | #### 每个container的平均使用内存大小计算方式为: 91 | 92 | RAM-per-container = max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers)) 93 | 94 | 95 | 96 | > max(512M, 5000M/2) = 2500M 97 | 98 | 99 | 100 | 通过上面的计算,YARN以及MAPREDUCE可以这样配置: 101 | 102 | | 配置文件 | 配置设置 | 默认值 | 计算值 | 8G | 103 | | :-------------------- | :----------------------------------- | :-------- | :------------------------------- | ----- | 104 | | yarn-site.xml | yarn.nodemanager.resource.memory-mb | 8192 MB | = containers * RAM-per-container | 5000M | 105 | | yarn-site.xml | yarn.scheduler.minimum-allocation-mb | 1024MB | = RAM-per-container | 2500M | 106 | | yarn-site.xml | yarn.scheduler.maximum-allocation-mb | 8192 MB | = containers * RAM-per-container | 5000M | 107 | | yarn-site.xml (check) | yarn.app.mapreduce.am.resource.mb | 1536 MB | = 2 * RAM-per-container | 5000M | 108 | | yarn-site.xml (check) | yarn.app.mapreduce.am.command-opts | -Xmx1024m | = 0.8 * 2 * RAM-per-container | 4000M | 109 | | mapred-site.xml | mapreduce.map.memory.mb | 1024 MB | = RAM-per-container | 2500M | 110 | | mapred-site.xml | mapreduce.reduce.memory.mb | 1024 MB | = 2 * RAM-per-container | 5000M | 111 | | mapred-site.xml | mapreduce.map.java.opts | | = 0.8 * RAM-per-container | | 112 | | mapred-site.xml | mapreduce.reduce.java.opts | | = 0.8 * 2 * RAM-per-container | | 113 | 114 | 举个例子:对于128G内存、32核CPU的机器,挂载了7个磁盘,根据上面的说明,系统保留内存为24G,不适应HBase情况下,系统剩余可用内存为104G,计算containers值如下: 115 | 116 | containers = min (2*32, 1.8* 7 , (128-24)/2) = min (64, 12.6 , 51) = 13 117 | 118 | 计算RAM-per-container值如下: 119 | 120 | RAM-per-container = max (2, (124-24)/13) = max (2, 8) = 8 121 | 122 | 使用脚本 [yarn-utils.py ](http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.1.1/bk_installing_manually_book/content/rpm-chap1-9.html)来计算上面的值: 123 | 124 | 这样的话,每个container内存为8G,似乎有点多,我更愿意根据集群使用情况任务将其调整为2G内存,则集群中下面的参数配置值如下: 125 | 126 | | 配置文件 | 配置设置 | 计算值 | 127 | | :-------------------- | :----------------------------------- | :----------------- | 128 | | yarn-site.xml | yarn.nodemanager.resource.memory-mb | = 52 * 2 =104 G | 129 | | yarn-site.xml | yarn.scheduler.minimum-allocation-mb | = 2G | 130 | | yarn-site.xml | yarn.scheduler.maximum-allocation-mb | = 52 * 2 = 104G | 131 | | yarn-site.xml (check) | yarn.app.mapreduce.am.resource.mb | = 2 * 2=4G | 132 | | yarn-site.xml (check) | yarn.app.mapreduce.am.command-opts | = 0.8 * 2 * 2=3.2G | 133 | | mapred-site.xml | mapreduce.map.memory.mb | = 2G | 134 | | mapred-site.xml | mapreduce.reduce.memory.mb | = 2 * 2=4G | 135 | | mapred-site.xml | mapreduce.map.java.opts | = 0.8 * 2=1.6G | 136 | | mapred-site.xml | mapreduce.reduce.java.opts | = 0.8 * 2 * 2=3.2G | 137 | 138 | 139 | 140 | ![image-20190422153706588](assets/image-20190422153706588.png) 141 | 142 | 143 | 144 | # CPU配置 145 | 146 | YARN中目前的CPU被划分成虚拟CPU(CPU virtual Core),这里的虚拟CPU是YARN自己引入的概念,初衷是,考虑到不同节点的CPU性能可能不同,每个CPU具有的计算能力也是不一样的,比如某个物理CPU的计算能力可能是另外一个物理CPU的2倍,这时候,你可以通过为第一个物理CPU多配置几个虚拟CPU弥补这种差异。用户提交作业时,可以指定每个任务需要的虚拟CPU个数。 147 | 148 | 在YARN中,CPU相关配置参数如下: 149 | 150 | - yarn.nodemanager.resource.cpu-vcores:表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物理CPU总数。 151 | - yarn.scheduler.minimum-allocation-vcores:单个任务可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应的值改为这个数。 152 | - yarn.scheduler.maximum-allocation-vcores:单个任务可申请的最多虚拟CPU个数,默认是32。 153 | 154 | 注: 155 | 156 | ​ 4倍于cup-vcores 157 | 158 | 159 | 160 | ![image-20190422184503191](assets/image-20190422184503191.png) 161 | 162 | 163 | 164 | ### Yarn HA 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | ### 参考 173 | 174 | [Hortonworks]() 175 | 176 | [博客1]() 177 | 178 | [博客2优化]() 179 | 180 | [Spark on Yarn]() -------------------------------------------------------------------------------- /lucene/ES_CRUD.md: -------------------------------------------------------------------------------- 1 | ### Kibana Shell 2 | 3 | ``` 4 | GET _search 5 | { 6 | "query": { 7 | "match_all": {} 8 | } 9 | } 10 | 11 | GET /customer/customer/_mapping 12 | DELETE /myindex 13 | GET customer/customer/_search 14 | GET /customer/_settings 15 | 16 | 17 | # 添加索引 18 | PUT /myindex/ 19 | { 20 | "settings": { 21 | "index":{ 22 | "number_of_shards":3, 23 | "number_of_replicas":0 24 | } 25 | } 26 | } 27 | 28 | # 查看索引信息 29 | GET /myindex/_settings 30 | GET _all/_settings 31 | GET /myindex/_mapping 32 | GET /myindex/test/_mapping 33 | 34 | # 添加数据 35 | PUT /myindex/test/1 36 | { 37 | "first_name": "Jane", 38 | "last_name":"smith", 39 | "age":32, 40 | "about":"I Like to collect rock albums", 41 | "interests":["music"] 42 | } 43 | 44 | # 不指定id 用POST 45 | POST /myindex/test/ 46 | { 47 | "first_name": "Douglas", 48 | "last_name":"Fir", 49 | "age":23, 50 | "about":"I Like to build cabinets", 51 | "interests":["forestry"] 52 | } 53 | 54 | GET /myindex/test/1 55 | GET /myindex/test/_search 56 | # 过滤source 57 | GET /myindex/test/1?_source=age,about 58 | 59 | GET /goodscenter_goods/repo/_search 60 | { 61 | "query": { 62 | "term": { 63 | "_id":"_update" 64 | } 65 | } 66 | } 67 | 68 | # 更新 69 | # 1. 覆盖 70 | PUT /myindex/test/1 71 | { 72 | "first_name": "Jane", 73 | "last_name":"smith", 74 | "age":33, 75 | "about":"I Like to collect rock albums", 76 | "interests":["music"] 77 | } 78 | 79 | # 2. POST 80 | POST /myindex/test/1/_update 81 | { 82 | "doc": { 83 | "age": 34 84 | } 85 | } 86 | 87 | # 删除 88 | DELETE /myindex/test/aOsYImsBJbHqWal4B2p2 89 | 90 | # 批量 91 | # 批量获取 92 | GET /_mget 93 | { 94 | "docs":[ 95 | { 96 | "_index":"myindex", 97 | "_type":"test", 98 | "_id":"1", 99 | "_source":"interests" 100 | }, 101 | { 102 | "_index":"myindex", 103 | "_type":"test", 104 | "_id":"2" 105 | }, 106 | { 107 | "_index":"myindex", 108 | "_type":"test", 109 | "_id":"3" 110 | } 111 | ] 112 | } 113 | 114 | # 简写1 115 | GET /myindex/test/_mget 116 | { 117 | "docs":[ 118 | { 119 | "_id":"1" 120 | }, 121 | { 122 | "_type":"test", 123 | "_id":"2" 124 | } 125 | ] 126 | } 127 | 128 | # 简写2 129 | GET /myindex/test/_mget 130 | { 131 | "ids":["1", "2"] 132 | } 133 | 134 | # bulk 批量 135 | # {action:{metadata}} \n 136 | # {requestbody}\n 137 | # action: 138 | # create 创建文档 139 | # update 更新文档 140 | # index 创建新文档或替换已有文档 141 | # delete 删除一个文档 142 | # metadata: _index、_type、_id 143 | # create 与 index的区别 144 | # 如果数据存在,使用create操作失败,index则可成功执行 145 | # bulk 将数据载入内存,一般建议5-15M,默认最大100M,可在es的config中的elasticsearch.yml中配置 146 | 147 | 148 | POST /myindex1/test/_bulk 149 | {"index":{"_id":1}} 150 | {"title":"Java","price":33} 151 | {"index":{"_id":2}} 152 | {"title":"Html","price":44} 153 | {"index":{"_id":3}} 154 | {"title":"Python","price":55} 155 | 156 | # 删除 157 | POST /myindex1/test/_bulk 158 | {"delete":{"_index":"myindex1","_type":"test","_id":"3"}} 159 | {"create":{"_index":"myindex2","_type":"test","_id":"1"}} 160 | {"name":"lili"} 161 | {"index":{"_index":"myindex2","_type":"test","_id":"1"}} 162 | {"name":"bianle"} 163 | {"update":{"_index":"myindex2","_type":"test","_id":"1"}} 164 | {"doc":{"name":"youbianle"}} 165 | 166 | GET /myindex1/test/_mget 167 | { 168 | "ids":["1", "2","3"] 169 | } 170 | 171 | GET /myindex2/test/_search 172 | 173 | # 相比brown OR dog,我们更想要的结果是brown AND dog 174 | GET /my_index/my_type/_search 175 | { 176 | "query": { 177 | "match": { 178 | "title": { 179 | "query": "BROWN DOG!", 180 | "operator": "and" 181 | } 182 | } 183 | } 184 | } 185 | 186 | # 控制精度(Controlling Precision) 187 | # 在all和any中选择有种非黑即白的感觉。如果用户指定了5个查询词条,而一份文档只包含了其中的4个呢?将"operator"设置成"and"会将它排除在外。 188 | # 有时候这正是你想要的,但是对于大多数全文搜索的使用场景,你会希望将相关度高的文档包含在结果中,将相关度低的排除在外。换言之,我们需要一种介于两者中间的方案。match查询支持minimum_should_match参数,它能够让你指定有多少词条必须被匹配才会让该文档被当做一个相关的文档。尽管你能够指定一个词条的绝对数量,但是通常指定一个百分比会更有意义,因为你无法控制用户会输入多少个词条: 189 | GET /my_index/my_type/_search 190 | { 191 | "query": { 192 | "match": { 193 | "title": { 194 | "query": "quick brown dog", 195 | "minimum_should_match": "75%" 196 | } 197 | } 198 | } 199 | } 200 | 201 | GET /my_index/my_type/_search 202 | { 203 | "query": { 204 | "bool": { 205 | "should": [ 206 | { "match": { "title": "brown" }}, 207 | { "match": { "title": "fox" }}, 208 | { "match": { "title": "dog" }} 209 | ], 210 | "minimum_should_match": 2 211 | } 212 | } 213 | } 214 | 215 | # 合并查询(Combining Queries) 216 | # 在合并过滤器中我们讨论了使用bool过滤器来合并多个过滤器以实现and,or和not逻辑。bool查询也做了类似的事,但有一个显著的不同。 217 | GET /my_index/my_type/_search 218 | { 219 | "query": { 220 | "bool": { 221 | "must": { "match": { "title": "quick" }}, 222 | "must_not": { "match": { "title": "lazy" }}, 223 | "should": [ 224 | { "match": { "title": "brown" }}, 225 | { "match": { "title": "dog" }} 226 | ] 227 | } 228 | } 229 | } 230 | 231 | # 全文搜索 should查询子句的匹配数量越多,那么文档的相关度就越高 232 | GET /_search 233 | { 234 | "query": { 235 | "bool": { 236 | "must": { 237 | "match": { 238 | "content": { 239 | "query": "full text search", 240 | "operator": "and" 241 | } 242 | } 243 | }, 244 | "should": [ 245 | { "match": { "content": "Elasticsearch" }}, 246 | { "match": { "content": "Lucene" }} 247 | ] 248 | } 249 | } 250 | } 251 | 252 | # 通过指定一个boost值来控制每个查询子句的相对权重,该值默认为1。一个大于1的boost会增加该查询子句的相对权重 253 | GET /_search 254 | { 255 | "query": { 256 | "bool": { 257 | "must": { 258 | "match": { 259 | "content": { 260 | "query": "full text search", 261 | "operator": "and" 262 | } 263 | } 264 | }, 265 | "should": [ 266 | { "match": { 267 | "content": { 268 | "query": "Elasticsearch", 269 | "boost": 3 270 | } 271 | }}, 272 | { "match": { 273 | "content": { 274 | "query": "Lucene", 275 | "boost": 2 276 | } 277 | }} 278 | ] 279 | } 280 | } 281 | } 282 | 283 | # boost参数被用来增加一个子句的相对权重(当boost大于1时),或者减小相对权重(当boost介于0到1时),但是增加或者减小不是线性的。换言之,boost设为2并不会让最终的_score加倍。相反,新的_score会在适用了boost后被归一化(Normalized)。每种查询都有自己的归一化算法(Normalization Algorithm),算法的细节超出了本书的讨论范围。但是能够说一个高的boost值会产生一个高的_score。如果你在实现你自己的不基于TF/IDF的相关度分值模型并且你需要对提升过程拥有更多的控制,你可以使用function_score查询,它不通过归一化步骤对文档的boost进行操作。 284 | ``` 285 | 286 | -------------------------------------------------------------------------------- /hive/Hive+Solr.md: -------------------------------------------------------------------------------- 1 | ## Hive integrate with Solr 2 | 3 | 4 | 5 | >注意: 6 | > 7 | >​ 安装第三方jar包时,需设置hive和interactive的 HIVE_AUX_JARS_PATH 8 | > 9 | >​ 参考Ambari的配置:在HDPS安装文档中有链接 10 | > 11 | >​ Jar放入${HIVE_HOME}/auxlib目录 12 | > 13 | >​ HDP的 HIVE_HOME 是/usr/hdp/current/hive-server2 14 | > 15 | >​ 完整路径为 : /usr/hdp/current/hive-server2/auxlib 16 | > 17 | >- 问题 18 | > - 后续发现在Ambari中的hive-env中去掉export的auxlib相关配置后,系统重启能够自动识别第三方jar包 19 | > - 将hive-interactive-env中相应的配置也一起去掉 20 | > - 这样就解决了Tez在执行时,前一两次可以,后面报错:***auxlib. Failing because I am unlikely to write too 21 | > - Tez Session中可查看资源信息:hdfs:/tmp/hive/hdfs/_tez_session_dir/ 22 | 23 | 24 | 25 | #### 创建Hive表 26 | 27 | ``` 28 | CREATE EXTERNAL TABLE solr (id string, field1_s string, field2_i int) 29 | STORED BY 'com.lucidworks.hadoop.hive.LWStorageHandler' 30 | LOCATION '/tmp/solr' 31 | TBLPROPERTIES('solr.zkhost' = '192.168.20.68:2181,192.168.20.65:2181,192.168.20.174:2181/solr', 32 | 'solr.collection' = 'collection1', 33 | 'solr.query' = '*:*'); 34 | 35 | SHOW tables; 36 | DESC solr; 37 | 38 | SELECT id, field1_s, field2_i FROM solr; 39 | # 报错:提示collection1不存在 40 | # Error: java.io.IOException: shaded.org.apache.solr.common.SolrException: Collection not found: collection1 (state=,code=0) 41 | # 解决:需手动在solr中创建collection1 42 | 43 | # 模板 44 | SELECT id, field1_s, field2_i FROM solr left 45 | JOIN sometable right 46 | WHERE left.id = right.id; 47 | INSERT INTO solr 48 | SELECT id, field1_s, field2_i FROM sometable; 49 | 50 | # 测试 51 | sudo -u hdfs hive 52 | INSERT INTO solr VALUES('0001','xiaodou',28); 53 | INSERT INTO solr SELECT id, title as field1_s, seq as field2_i FROM books; 54 | 55 | # 报错 56 | Unable to find class: com.lucidworks.hadoop.hive.LWHiveInputFormat 57 | java.lang.ClassNotFoundException: com.lucidworks.hadoop.hive.LWHiveInputFormat 58 | # 解决:请按照文章开头,正确配置第三方包地址 59 | 60 | # 将books.csv上传的hdfs上 61 | sudo -u hdfs hdfs dfs -mkdir -p /tmp/csv 62 | sudo -u hdfs hdfs dfs -ls /tmp 63 | sudo -u hdfs hdfs dfs -chown root:hdfs /tmp/csv 64 | sudo hdfs dfs -put books.csv /tmp/csv 65 | sudo -u hdfs hdfs dfs -ls /tmp/csv 66 | 67 | CREATE TABLE books (id STRING, cat STRING, title STRING, price FLOAT, in_stock BOOLEAN, author STRING, series STRING, seq INT, genre STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' lines terminated BY '\n' stored AS textfile TBLPROPERTIES("skip.header.line.count"="1"); 68 | 69 | LOAD DATA INPATH 'hdfs:/tmp/csv/books.csv' OVERWRITE INTO TABLE books; 70 | ``` 71 | 72 | ##### Defining Fields for Solr 73 | 74 | - dynamic fields 75 | - create all of your fields in solr before indexing any content from hive 76 | 77 | 78 | 79 | ##### Table Properties 80 | 81 | > - solr.zkhost 82 | > 83 | > The location of the ZooKeeper quorum if using LucidWorks in SolrCloud mode. If this property is set along with the `solr.server.url` property, the `solr.server.url` property will take precedence. 84 | > 85 | > - solr.server.url 86 | > 87 | > The location of the Solr instance if not using LucidWorks in SolrCloud mode. If this property is set along with the `solr.zkhost`property, this property will take precedence. 88 | > 89 | > - solr.collection 90 | > 91 | > The Solr collection for this table. If not defined, an exception will be thrown. 92 | > 93 | > - solr.query 94 | > 95 | > The specific Solr query to execute to read this table. If not defined, a default of `*:*` will be used. This property is not needed when loading data to a table, but is needed when defining the table so Hive can later read the table. 96 | > 97 | > - lww.commit.on.close 98 | > 99 | > If true, inserts will be automatically committed when the connection is closed. True is the default. 100 | > 101 | > - lww.jaas.file 102 | > 103 | > Used only when indexing to or reading from a Solr cluster secured with Kerberos. 104 | > 105 | > This property defines the path to a JAAS file that contains a service principal and keytab location for a user who is authorized to read from and write to Solr and Hive. 106 | > 107 | > The JAAS configuration file **must** be copied to the same path on every node where a Node Manager is running (i.e., every node where map/reduce tasks are executed). Here is a sample section of a JAAS file: 108 | > 109 | > ``` 110 | > Client { 111 | > com.sun.security.auth.module.Krb5LoginModule required 112 | > useKeyTab=true 113 | > keyTab="/data/solr-indexer.keytab" 114 | > storeKey=true 115 | > useTicketCache=true 116 | > debug=true 117 | > principal="solr-indexer@SOLRSERVER.COM"; 118 | > }; 119 | > ``` 120 | > 121 | > - The name of this section of the JAAS file. This name will be used with the `lww.jaas.appname` parameter. 122 | > - The location of the keytab file. 123 | > - The service principal name. This should be a different principal than the one used for Solr, but must have access to both Solr and Hive. 124 | > 125 | > - lww.jaas.appname 126 | > 127 | > Used only when indexing to or reading from a Solr cluster secured with Kerberos. 128 | > 129 | > This property provides the name of the section in the JAAS file that includes the correct service principal and keytab path. 130 | 131 | 132 | 133 | ```sql 134 | // 失败 135 | // Map类型 shell中一行一行复制进去 136 | # 创建一个内部表 137 | CREATE TABLE solr_map_inner (name string, movie map) row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':' lines terminated BY '\n' stored AS textfile; 138 | 139 | # load 只能load到内部表内 140 | load data inpath 'hdfs:/tmp/csv/film1.csv' overwrite into table solr_map_inner; 141 | 142 | CREATE EXTERNAL TABLE solr_map (name string, movie map) 143 | row format delimited fields terminated by '\t' 144 | collection items terminated by ',' 145 | map keys terminated by ':' 146 | STORED BY 'com.lucidworks.hadoop.hive.LWStorageHandler' 147 | LOCATION '/tmp/solr' 148 | TBLPROPERTIES('solr.zkhost' = '192.168.20.68:2181,192.168.20.65:2181,192.168.20.174:2181/solr', 149 | 'solr.collection' = 'collection2', 150 | 'solr.query' = '*:*'); 151 | 152 | INSERT INTO solr_map SELECT * FROM solr_map_inner; 153 | 154 | // 失败 155 | 156 | 157 | // Struct类型 158 | create table movie_score_inner(id string,name_s string,info struct)row format delimited fields terminated by "\t" collection items terminated by ":" stored AS textfile; 159 | 160 | load data inpath 'hdfs:/tmp/csv/movie.csv' overwrite into table movie_score_inner; 161 | 162 | CREATE EXTERNAL TABLE solr_movie_score (id string,name_s string,info struct) 163 | STORED BY 'com.lucidworks.hadoop.hive.LWStorageHandler' 164 | LOCATION '/tmp/solr' 165 | TBLPROPERTIES('solr.zkhost' = '192.168.20.68:2181,192.168.20.65:2181,192.168.20.174:2181/solr', 166 | 'solr.collection' = 'collection3', 167 | 'solr.query' = '*:*'); 168 | 169 | INSERT OVERWRITE TABLE solr_movie_score SELECT ms.* FROM movie_score_inner ms; 170 | ``` 171 | 172 | 173 | 174 | 参考: 175 | 176 | [官方文档](https://doc.lucidworks.com/lucidworks-hdpsearch/4.0.0/Guide-Jobs.html#hive-serde) -------------------------------------------------------------------------------- /hive/HDFS_Shell_Help.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## FS Shell 4 | 5 | 调用文件系统(FS)Shell命令应使用 bin/hadoop fs 的形式。 所有的的FS shell命令使用URI路径作为参数。URI格式是*scheme://authority/path*。对HDFS文件系统,scheme是*hdfs*,对本地文件系统,scheme是*file*。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。一个HDFS文件或目录比如*/parent/child*可以表示成*hdfs://namenode:namenodeport/parent/child*,或者更简单的*/parent/child*(假设你配置文件中的默认值是*namenode:namenodeport*)。大多数FS Shell命令的行为和对应的Unix Shell命令类似,不同之处会在下面介绍各命令使用详情时指出。出错信息会输出到*stderr*,其他信息输出到*stdout*。 6 | 7 | 8 | 9 | ### cat 10 | 11 | 使用方法:hadoop fs -cat URI [URI …] 12 | 13 | 将路径指定文件的内容输出到*stdout*。 14 | 15 | 示例: 16 | 17 | - hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2 18 | - hadoop fs -cat file:///file3 /user/hadoop/file4 19 | 20 | 返回值: 21 | 成功返回0,失败返回-1。 22 | 23 | 24 | 25 | ### chgrp 26 | 27 | 使用方法:hadoop fs -chgrp [-R] GROUP URI [URI …] Change group association of files. With -R, make the change recursively through the directory structure. The user must be the owner of files, or else a super-user. Additional information is in the [Permissions User Guide](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html). --> 28 | 29 | 改变文件所属的组。使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。更多的信息请参见[HDFS权限用户指南](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html)。 30 | 31 | 32 | 33 | ### chmod 34 | 35 | 使用方法:hadoop fs -chmod [-R] URI [URI …] 36 | 37 | 改变文件的权限。使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。更多的信息请参见[HDFS权限用户指南](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html)。 38 | 39 | 40 | 41 | ### chown 42 | 43 | 使用方法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ] 44 | 45 | 改变文件的拥有者。使用-R将使改变在目录结构下递归进行。命令的使用者必须是超级用户。更多的信息请参见[HDFS权限用户指南](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html)。 46 | 47 | 48 | 49 | ### copyFromLocal 50 | 51 | 使用方法:hadoop fs -copyFromLocal URI 52 | 53 | 除了限定源路径是一个本地文件外,和[**put**](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html#putlink)命令相似。 54 | 55 | 56 | 57 | ### copyToLocal 58 | 59 | 使用方法:hadoop fs -copyToLocal [-ignorecrc] [-crc] URI 60 | 61 | 除了限定目标路径是一个本地文件外,和[**get**](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html#getlink)命令类似。 62 | 63 | 64 | 65 | ### cp 66 | 67 | 使用方法:hadoop fs -cp URI [URI …] 68 | 69 | 将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。 70 | 示例: 71 | 72 | - hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 73 | - hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir 74 | 75 | 返回值: 76 | 77 | 成功返回0,失败返回-1。 78 | 79 | 80 | 81 | ### du 82 | 83 | 使用方法:hadoop fs -du URI [URI …] 84 | 85 | 显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。 86 | 示例: 87 | hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://host:port/user/hadoop/dir1 88 | 返回值: 89 | 成功返回0,失败返回-1。 90 | 91 | 92 | 93 | ### dus 94 | 95 | 使用方法:hadoop fs -dus 96 | 97 | 显示文件的大小。 98 | 99 | 100 | 101 | ### expunge 102 | 103 | 使用方法:hadoop fs -expunge 104 | 105 | 清空回收站。请参考[HDFS设计](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html)文档以获取更多关于回收站特性的信息。 106 | 107 | 108 | 109 | ### get 110 | 111 | 使用方法:hadoop fs -get [-ignorecrc] [-crc] 112 | 113 | 复制文件到本地文件系统。可用-ignorecrc选项复制CRC校验失败的文件。使用-crc选项复制文件以及CRC信息。 114 | 115 | 示例: 116 | 117 | - hadoop fs -get /user/hadoop/file localfile 118 | - hadoop fs -get hdfs://host:port/user/hadoop/file localfile 119 | 120 | 返回值: 121 | 122 | 成功返回0,失败返回-1。 123 | 124 | 125 | 126 | ### getmerge 127 | 128 | 使用方法:hadoop fs -getmerge [addnl] 129 | 130 | 接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。addnl是可选的,用于指定在每个文件结尾添加一个换行符。 131 | 132 | 133 | 134 | ### ls 135 | 136 | 使用方法:hadoop fs -ls 137 | 138 | 如果是文件,则按照如下格式返回文件信息: 139 | 文件名 <副本数> 文件大小 修改日期 修改时间 权限 用户ID 组ID 140 | 如果是目录,则返回它直接子文件的一个列表,就像在Unix中一样。目录返回列表的信息如下: 141 | 目录名 修改日期 修改时间 权限 用户ID 组ID 142 | 示例: 143 | hadoop fs -ls /user/hadoop/file1 /user/hadoop/file2 hdfs://host:port/user/hadoop/dir1 /nonexistentfile 144 | 返回值: 145 | 成功返回0,失败返回-1。 146 | 147 | 148 | 149 | ### lsr 150 | 151 | 使用方法:hadoop fs -lsr 152 | ls命令的递归版本。类似于Unix中的ls -R。 153 | 154 | 155 | 156 | ### mkdir 157 | 158 | 使用方法:hadoop fs -mkdir 159 | 160 | 接受路径指定的uri作为参数,创建这些目录。其行为类似于Unix的mkdir -p,它会创建路径中的各级父目录。 161 | 162 | 示例: 163 | 164 | - hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2 165 | - hadoop fs -mkdir hdfs://host1:port1/user/hadoop/dir hdfs://host2:port2/user/hadoop/dir 166 | 167 | 返回值: 168 | 169 | 成功返回0,失败返回-1。 170 | 171 | 172 | 173 | ### movefromLocal 174 | 175 | 使用方法:dfs -moveFromLocal 176 | 177 | 输出一个”not implemented“信息。 178 | 179 | 180 | 181 | ### mv 182 | 183 | 使用方法:hadoop fs -mv URI [URI …] 184 | 185 | 将文件从源路径移动到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。不允许在不同的文件系统间移动文件。 186 | 示例: 187 | 188 | - hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2 189 | - hadoop fs -mv hdfs://host:port/file1 hdfs://host:port/file2 hdfs://host:port/file3 hdfs://host:port/dir1 190 | 191 | 返回值: 192 | 193 | 成功返回0,失败返回-1。 194 | 195 | 196 | 197 | ### put 198 | 199 | 使用方法:hadoop fs -put ... 200 | 201 | 从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。 202 | 203 | - hadoop fs -put localfile /user/hadoop/hadoopfile 204 | - hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir 205 | - hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile 206 | - hadoop fs -put - hdfs://host:port/hadoop/hadoopfile 207 | 从标准输入中读取输入。 208 | 209 | 返回值: 210 | 211 | 成功返回0,失败返回-1。 212 | 213 | 214 | 215 | ### rm 216 | 217 | 使用方法:hadoop fs -rm URI [URI …] 218 | 219 | 删除指定的文件。只删除非空目录和文件。请参考rmr命令了解递归删除。 220 | 示例: 221 | 222 | - hadoop fs -rm hdfs://host:port/file /user/hadoop/emptydir 223 | 224 | 返回值: 225 | 226 | 成功返回0,失败返回-1。 227 | 228 | 229 | 230 | ### rmr 231 | 232 | 使用方法:hadoop fs -rmr URI [URI …] 233 | 234 | delete的递归版本。 235 | 示例: 236 | 237 | - hadoop fs -rmr /user/hadoop/dir 238 | - hadoop fs -rmr hdfs://host:port/user/hadoop/dir 239 | 240 | 返回值: 241 | 242 | 成功返回0,失败返回-1。 243 | 244 | 245 | 246 | ### setrep 247 | 248 | 使用方法:hadoop fs -setrep [-R] 249 | 250 | 改变一个文件的副本系数。-R选项用于递归改变目录下所有文件的副本系数。 251 | 252 | 示例: 253 | 254 | - hadoop fs -setrep -w 3 -R /user/hadoop/dir1 255 | 256 | 返回值: 257 | 258 | 成功返回0,失败返回-1。 259 | 260 | 261 | 262 | ### stat 263 | 264 | 使用方法:hadoop fs -stat URI [URI …] 265 | 266 | 返回指定路径的统计信息。 267 | 268 | 示例: 269 | 270 | - hadoop fs -stat path 271 | 272 | 返回值: 273 | 成功返回0,失败返回-1。 274 | 275 | 276 | 277 | ### tail 278 | 279 | 使用方法:hadoop fs -tail [-f] URI 280 | 281 | 将文件尾部1K字节的内容输出到stdout。支持-f选项,行为和Unix中一致。 282 | 283 | 示例: 284 | 285 | - hadoop fs -tail pathname 286 | 287 | 返回值: 288 | 成功返回0,失败返回-1。 289 | 290 | 291 | 292 | ### test 293 | 294 | 使用方法:hadoop fs -test -[ezd] URI 295 | 296 | 选项: 297 | -e 检查文件是否存在。如果存在则返回0。 298 | -z 检查文件是否是0字节。如果是则返回0。 299 | -d 如果路径是个目录,则返回1,否则返回0。 300 | 301 | 示例: 302 | 303 | - hadoop fs -test -e filename 304 | 305 | 306 | 307 | ### text 308 | 309 | 使用方法:hadoop fs -text 310 | 311 | 将源文件输出为文本格式。允许的格式是zip和TextRecordInputStream。 312 | 313 | 314 | 315 | ### touchz 316 | 317 | 使用方法:hadoop fs -touchz URI [URI …] 318 | 319 | 创建一个0字节的空文件。 320 | 321 | 示例: 322 | 323 | - hadoop -touchz pathname 324 | 325 | 返回值: 326 | 成功返回0,失败返回-1。 327 | 328 | 329 | 330 | ##### 参考: 331 | 332 | [官方]([http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html)) -------------------------------------------------------------------------------- /hadoop/配置挖掘.md: -------------------------------------------------------------------------------- 1 | ## 配置挖掘 2 | 3 | ### HDFS: 4 | 5 | 文件目录: 6 | 7 | > - DataNode directories 8 | > - /hadoop/hdfs/data 9 | > - NameNode directories 10 | > - /hadoop/hdfs/namenode 11 | > - SecondaryNameNode Checkpoint directories 12 | > - /hadoop/hdfs/namesecondary 13 | > - NFSGateway dump directory 14 | > - /tmp/.hdfs-nfs 15 | > - NameNode Backup directory 16 | > - /tmp/upgrades 17 | > - JournalNode Edits directory 18 | > - /hadoop/hdfs/journalnode 19 | > - NameNode Checkpoint Edits directory 20 | > - ${dfs.namenode.checkpoint.dir} 21 | > - Hadoop Log Dir Prefix 22 | > - /var/log/hadoop 23 | > - Hadoop PID Dir Prefix 24 | > - /var/run/hadoop 25 | 26 | 配置: 27 | 28 | > * NameNode Java heap size: NameNode堆栈大小 29 | > * NameNode Server threads: NameNode线程数 30 | > * Minimum replicated blocks %: NameNode最小复制块% 31 | > * DataNode failed disk tolerance: DataNode磁盘容差失败 32 | > * DataNode maximum Java heap size: DataNode最大堆栈 33 | > * DataNode max data transfer threads:DataNode最大数据传输线程 34 | > * NameNode new generation size: NameNode新生代大小 35 | > * NameNode maximum new generation size: NameNode新生代最大值 36 | > * NameNode permanent generation size: NameNode持久代大小 37 | > * NameNode maximum permanent generation size: NameNode持久代最大值 38 | > * Hadoop maximum Java heap size: Hadoop最大Java堆栈大小 39 | > * HDFS Maximum Checkpoint Delay:HDFS最大检查点延迟 40 | > * Reserved space for HDFS:HDFS的预留空间 41 | > * Block replication:Block副本数,默认3 42 | > * NFSGateway maximum Java heap size:NFSGateway最大Java堆大小 43 | > 44 | > core-site配置项 45 | > 46 | > 缓冲区大小;rpc端口; 47 | 48 | 49 | 50 | ### YARN: 51 | 52 | 文件目录: 53 | 54 | > - YARN NodeManager Local directories 55 | > - /hadoop/yarn/local 56 | > - YARN Timeline Service Entity Group FS Store Active directory 57 | > - /ats/active/ 58 | > - YARN Node Labels FS Store Root directory 59 | > - /system/yarn/node-labels 60 | > - YARN NodeManager Recovery directory 61 | > - {{yarn_log_dir_prefix}}/nodemanager/recovery-state 62 | > - YARN Timeline Service Entity Group FS Store Done directory 63 | > - /ats/done/ 64 | > - YARN NodeManager Log directories 65 | > - /hadoop/yarn/log 66 | > - YARN NodeManager Remote App Log directory 67 | > - /app-logs 68 | > - YARN Log Dir Prefix 69 | > - /var/log/hadoop-yarn 70 | > - YARN PID Dir Prefix 71 | > - /var/run/hadoop-yarn 72 | 73 | 配置: 74 | 75 | > * Memory allocated for all YARN containers on a node:为节点上的所有YARN容器分配的内存 76 | > * Minimum Container Size (Memory):容器最小内存 77 | > * Maximum Container Size (Memory):容器最大内存 78 | > * Node Labels:true/false 节点标签 参考:基于节点标签的调度(Hadoop大数据.md) 79 | > * Pre-emption:true/false 资源抢占模式 80 | > * CPU Scheduling and Isolation:true/false CPU调度与隔离 81 | > * Number of virtual cores:虚拟核心数量 82 | > * Minimum/Maximum Container Size (VCores):容器最小/最大虚拟核心数据 83 | > * GPU Scheduling and Isolation:true/false GPU调度与隔离 84 | > * Maximum Container Size (GPU): 最大容器GPU大小 85 | > * ResourceManager Java heap size:ResourceManager堆栈大小 86 | > * yarn.acl.enable:true/false 访问控制 87 | > * yarn.admin.acl:activity_analyzer,yarn 访问控制 88 | > * NodeManager Java heap size:NodeManager堆栈大小 89 | > 90 | > Application Timeline Server: **TODO查询如何配置** 91 | > 92 | > - AppTimelineServer Java heap size 93 | > 94 | > Fault Tolerance: 95 | > 96 | > - yarn.resourcemanager.ha.enabled 97 | > - yarn.nodemanager.recovery.enabled 98 | > - yarn.resourcemanager.recovery.enabled 99 | > - yarn.resourcemanager.zk-address 100 | > 101 | > Advanced yarn-hbase-env: 102 | > 103 | > - yarn_hbase_client_memory 104 | > - yarn_hbase_master_memory 105 | > - yarn_hbase_regionserver_memory 106 | 107 | 108 | 109 | ### MapReduce2: 110 | 111 | 文件目录: 112 | 113 | > * Mapreduce JobHistory Done directory 114 | > * /mr-history/done 115 | > * Mapreduce JobHistory Intermediate Done directory 116 | > * /mr-history/tmp 117 | > * YARN App Mapreduce AM Staging directory 118 | > * /user 119 | > * Mapreduce Log Dir Prefix 120 | > * /var/log/hadoop-mapreduce 121 | > * Mapreduce PID Dir Prefix 122 | > * /var/run/hadoop-mapreduce 123 | > * mapred.local.dir 124 | > * /hadoop/mapred 125 | 126 | 127 | 128 | ### Tez 129 | 130 | > * tez.am.resource.memory.mb 131 | > * tez.task.resource.memory.mb 132 | > * tez.grouping.max-size 133 | > * tez.grouping.min-size 134 | > * tez.runtime.compress.codec: org.apache.hadoop.io.compress.SnappyCodec 135 | 136 | 137 | 138 | ### Hive: 139 | 140 | 文件目录: 141 | 142 | > * Hive Metastore Warehouse directory 143 | > * /warehouse/tablespace/managed/hive 144 | > * Hive Exec Scratchdir 145 | > * /tmp/hive 146 | > * Hive User Install directory 147 | > * /user/ 148 | > * TEZ Lib URIs 149 | > * /hdp/apps/${hdp.version}/tez/tez.tar.gz 150 | > * Hive Log Dir 151 | > * /var/log/hive 152 | > * HiveServer2 Logging Operation Log Location 153 | > * /tmp/hive/operation_logs 154 | > * Hive PID Dir 155 | > * /var/run/hive 156 | 157 | 配置: 158 | 159 | > * Enable Interactive Query (requires YARN pre-emption) 160 | > * Interactive Query Queue: 默认 llap 161 | > * Number of nodes used by Hive's LLAP 162 | 163 | 164 | 165 | ### HBase: 166 | 167 | 文件目录: 168 | 169 | > * HBase Java IO Tmpdir 170 | > * /tmp 171 | > * HBase Bulkload Staging directory 172 | > * /apps/hbase/staging 173 | > * HBase Local directory 174 | > * ${hbase.tmp.dir}/local 175 | > * HBase root directory 176 | > * /apps/hbase/data 177 | > * HBase tmp directory 178 | > * /tmp/hbase-${user.name} 179 | > * ZooKeeper Znode Parent 180 | > * /hbase-unsecure 181 | > * HBase Log Dir Prefix 182 | > * /var/log/hbase 183 | > * HBase PID Dir 184 | > * /var/run/hbase 185 | 186 | 配置: 187 | 188 | > * HBase Master Maximum Memory 189 | > * HBase RegionServer Maximum Memory 190 | > * HBase Region Block Multiplier 191 | > * Number of Handlers per RegionServer 192 | > * Maximum Client Retries 193 | > * Maximum Record Size 194 | > * Maximum Region File Size 195 | > * Major Compaction Interval 主要压实间隔(合并) 196 | > * Maximum Files for Compaction 最大压缩文件数 197 | > * Enable Phoenix 198 | > * Number of Phoenix Index Handlers per RegionServer 199 | 200 | RowKey设计 201 | 202 | > * Rowkey由用户自定义的一串不重复的字符串 203 | > * Rowkey排序:按字典排序 204 | > * 如果用到之前使用过的Rowkey,则会更新对应的Rowkey的数据,之前的数据不会删除,只是变成了低版本 205 | 206 | Column Family设计 207 | 208 | > * 官方建议列簇尽量少:可保证同一列簇数据尽量放在同一节点,提高性能 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | ### Oozie: 217 | 218 | 文件目录 219 | 220 | > * Oozie Data Dir 221 | > * /hadoop/oozie/data 222 | > * Oozie Tmp Dir 223 | > * /var/tmp/oozie 224 | > * Oozie Log Dir 225 | > * /var/log/oozie 226 | > * Oozie PID Dir 227 | > * /var/run/oozie 228 | 229 | 230 | 231 | ### Zookeeper: 232 | 233 | 文件目录: 234 | 235 | > * ZooKeeper directory 236 | > * /hadoop/zookeeper 237 | > * ZooKeeper Log Dir 238 | > * /var/log/zookeeper 239 | > * ZooKeeper PID Dir 240 | > * /var/run/zookeeper 241 | 242 | 243 | 244 | ### Spark2: 245 | 246 | 文件目录: 247 | 248 | > * Livy2 Log directory 249 | > * /var/log/livy2 250 | > * Spark Eventlog directory 251 | > * hdfs:///spark2-history/ 252 | > * Spark History FS Log directory 253 | > * hdfs:///spark2-history/ 254 | > * Spark Log directory 255 | > * /var/log/spark2 256 | > * Livy2 PID directory 257 | > * /var/run/livy2 258 | > * Spark PID directory 259 | > * /var/run/spark2 260 | > * spark.history.store.path 261 | > * /var/lib/spark2/shs_db 262 | 263 | 配置: 264 | 265 | > * spark.yarn.queue : 指定spark的队列资源, 默认为default 266 | > * spark.master: yarn 267 | > * spark.shuffle.file.buffer 268 | > * spark.shuffle.io.backLog 269 | > * spark.shuffle.io.serverThreads 270 | > * spark.shuffle.unsafe.file.output.buffer 271 | > * spark.sql.autoBroadcastJoinThreshold 272 | > * spark.sql.hive.convertMetastoreOrc 273 | > * spark.sql.warehouse.dir : /apps/spark/warehouse 274 | 275 | 276 | 277 | 第二次安装提示信息: 278 | 279 | ![image-20190409154317920](assets/image-20190409154317920.png) 280 | 281 | 282 | 283 | ### 注意点: 284 | 285 | > * RegionServer 需安装在DataNode上,优化本地查询 -------------------------------------------------------------------------------- /hive/Hive_SQL优化经典案例_01.txt: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------------------------------------------------------------------- 2 | ------------------------------------------------------------------------------------------------------------------------------- 3 | -- Hive SQL 优化案例一: 4 | ------------------------------------------------------------------------------------------------------------------------------- 5 | -- 1.1 将要执行的查询(执行了 1个多小时才出结果): 6 | SELECT dt as DATA_DATE,STRATEGY,AB_GROUP,SOURCE, 7 | count(distinct case when lower(event) not like '%push%' and event!='corner_mark_show' then udid else null end) as DAU, 8 | count(case when event='client_show' then 1 else null end) as TOTAL_VSHOW, 9 | count(distinct case when event='client_show' then vid else null end) as TOTAL_VIDEO_VSHOW, 10 | count(case when event='video_play' then 1 else null end) as TOTAL_VV_VP, 11 | count(distinct case when event='video_play' then udid else null end) as TOTAL_USERS_VP, 12 | count(case when event='effective_play' then 1 else null end) as TOTAL_VV_EP, 13 | count(distinct case when event='effective_play' then udid else null end) as TOTAL_USERS_EP, 14 | sum(case when event='video_over' then duration else 0 end) as TOTAL_DURATION, 15 | count(case when event='video_over' then 1 else null end) as TOTAL_VOVER, 16 | sum(case when event='video_over' then play_cnts else 0 end) as TOTAL_VOVER_PCNTS, 17 | count(case when event='push_video_clk' then 1 else null end) as TOTAL_PUSH_VC, 18 | count(distinct case when event='app_start' and body_source = 'push' then udid else null end) as TOTAL_PUSH_START, 19 | count(case when event='post_comment' then 1 else null end) as TOTAL_REPLY, 20 | count(distinct case when event='post_comment' then udid else null end) as TOTAL_USERS_REPLY 21 | FROM dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_zkl 22 | group by dt,strategy,ab_group,source; 23 | 24 | ------------------------------------------------------------------------------------------------------------------------------- 25 | -- 1.2 查询语句涉及到的表有 7.7亿+ 数据。(查询如下) 26 | 0: jdbc:hive2://ks-hdp-master-01.dns.rightpad (default)> select count(*) from dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_zkl; 27 | +------------+ 28 | | _c0 | 29 | +------------+ 30 | | 773366039 | 31 | +------------+ 32 | 33 | ------------------------------------------------------------------------------------------------------------------------------- 34 | -- 1.3 35 | -- 优化思路:既然将要执行的查询是按照 dt, strategy, ab_group, source 这4个字段分组, 那么在建表的时候,就按这四个字段中的N个(1 或 2 或 3 或 4)个字段组合分区, 36 | -- 直接让 count(distinct xx) 之类的查询定位到“更少的数据子集”,其执行效率就应该更高了(不需要每个子任务均从 7.7亿+ 的数据中(去重)统计)。 37 | 38 | ------------------------------------------------------------------------------------------------------------------------------- 39 | -- 1.4 先看每个字段将会有多少分区(因为 Hive 表分区也不宜过多,一般一个查询语句涉及到的 hive分区 应该控制在2K内) 40 | 41 | 0: jdbc:hive2://ks-hdp-master-01.dns.rightpad (default)> select count(distinct dt) as dis_dt, count(distinct strategy) as dis_strategy, 42 | . . . . . . . . . . . . . . . . . . . . . . . . . . . .> count(distinct ab_group) as dis_ab_group, count(distinct source) as dis_source 43 | . . . . . . . . . . . . . . . . . . . . . . . . . . . .> from dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_zkl; 44 | +---------+---------------+---------------+-------------+ 45 | | dis_dt | dis_strategy | dis_ab_group | dis_source | 46 | +---------+---------------+---------------+-------------+ 47 | | 1 | 14 | 72 | 2 | 48 | +---------+---------------+---------------+-------------+ 49 | 50 | [hue@ks-hdp-client-v02 10:55:08 /usr/local/hue]$ python 51 | Python 2.7.12 (default, Dec 4 2017, 14:50:18) 52 | [GCC 5.4.0 20160609] on linux2 53 | Type "help", "copyright", "credits" or "license" for more information. 54 | >>> 2*14*72 55 | 2016 56 | 57 | -- 2016 个分区还可以接受。 58 | 59 | ------------------------------------------------------------------------------------------------------------------------------- 60 | -- 1.5 根据原表,新建分区表,并将原表数据插入新表: 61 | 62 | show create table dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_zkl; 63 | 64 | 0: jdbc:hive2://ks-hdp-master-01.dns.rightpad (default)> show create table dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_zkl; 65 | +----------------------------------------------------+ 66 | | createtab_stmt | 67 | +----------------------------------------------------+ 68 | | CREATE TABLE `dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_zkl`( | 69 | | `dt` string, | 70 | | `strategy` string, | 71 | | `ab_group` string, | 72 | | `source` string, | 73 | | `event` string, | 74 | | `udid` string, | 75 | | `vid` string, | 76 | | `duration` string, | 77 | | `body_source` string, | 78 | | `play_cnts` string) | 79 | | ROW FORMAT SERDE | 80 | | 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' | 81 | | STORED AS INPUTFORMAT | 82 | | 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' | 83 | | OUTPUTFORMAT | 84 | | 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' | 85 | | LOCATION | 86 | | 'hdfs://uhcluster/warehouse/tablespace/managed/hive/dwb_v8sp_tmp.db/base_report_bystrategy_byab_source_column_zkl' | 87 | | TBLPROPERTIES ( | 88 | | 'bucketing_version'='2', | 89 | | 'transactional'='true', | 90 | | 'transactional_properties'='default', | 91 | | 'transient_lastDdlTime'='1550649105') | 92 | +----------------------------------------------------+ 93 | 24 rows selected (0.103 seconds) 94 | 95 | -- 创建新表:按 dt,source,stragegy,ab_group 分区(注意先后顺序,一般习惯分区数越少的越靠前,根据1.5的查询可知:dt=1,source=2,strategy=14,ab_group=72) 96 | create external table `dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_lym`( 97 | event string, 98 | udid string, 99 | vid string, 100 | duration string, 101 | body_source string, 102 | play_cnts string 103 | ) 104 | PARTITIONED BY ( 105 | dt string, 106 | source string, 107 | strategy string, 108 | ab_group string 109 | ); 110 | 111 | -- 将原表数据插入新表: 112 | insert into `dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_lym` partition(dt,source,strategy,ab_group) 113 | select event,udid,vid,duration,body_source,play_cnts,dt,source,strategy,ab_group 114 | from `dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_zkl`; 115 | 116 | -- 核对两表的数据是否一致: 117 | 0: jdbc:hive2://ks-hdp-master-01.dns.rightpad (default)> select count(*) from dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_lym; 118 | +------------+ 119 | | _c0 | 120 | +------------+ 121 | | 773366039 | 122 | +------------+ 123 | 1 row selected (35.903 seconds) 124 | 0: jdbc:hive2://ks-hdp-master-01.dns.rightpad (default)> select count(*) from dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_zkl; 125 | +------------+ 126 | | _c0 | 127 | +------------+ 128 | | 773366039 | 129 | +------------+ 130 | 131 | ------------------------------------------------------------------------------------------------------------------------------- 132 | -- 1.6 基于新表执行查询(执行5分钟出结果): 133 | 134 | SELECT dt as DATA_DATE,source,strategy,ab_group, 135 | count(distinct case when lower(event) not like '%push%' and event!='corner_mark_show' then udid else null end) as DAU, 136 | count(case when event='client_show' then 1 else null end) as TOTAL_VSHOW, 137 | count(distinct case when event='client_show' then vid else null end) as TOTAL_VIDEO_VSHOW, 138 | count(case when event='video_play' then 1 else null end) as TOTAL_VV_VP, 139 | count(distinct case when event='video_play' then udid else null end) as TOTAL_USERS_VP, 140 | count(case when event='effective_play' then 1 else null end) as TOTAL_VV_EP, 141 | count(distinct case when event='effective_play' then udid else null end) as TOTAL_USERS_EP, 142 | sum(case when event='video_over' then duration else 0 end) as TOTAL_DURATION, 143 | count(case when event='video_over' then 1 else null end) as TOTAL_VOVER, 144 | sum(case when event='video_over' then play_cnts else 0 end) as TOTAL_VOVER_PCNTS, 145 | count(case when event='push_video_clk' then 1 else null end) as TOTAL_PUSH_VC, 146 | count(distinct case when event='app_start' and body_source = 'push' then udid else null end) as TOTAL_PUSH_START, 147 | count(case when event='post_comment' then 1 else null end) as TOTAL_REPLY, 148 | count(distinct case when event='post_comment' then udid else null end) as TOTAL_USERS_REPLY 149 | FROM dwb_v8sp_tmp.base_report_bystrategy_byab_source_column_lym 150 | group by dt,source,strategy,ab_group; 151 | 152 | -- 注意:查询结果中,有些字段有 "__HIVE_DEFAULT_PARTITION__" 应该是该字段的“空值”(待验证)。 -------------------------------------------------------------------------------- /kafka/Kafka的分区算法.md: -------------------------------------------------------------------------------- 1 | ## Kafka分区算法 2 | 3 | 具体算法实现函数: 4 | 5 | 类:AdminUtils: 6 | 7 | 方法: assignReplicasToBrokers(...) 8 | 9 | 10 | 11 | ```scala 12 | def assignReplicasToBrokers(brokerMetadatas: Seq[BrokerMetadata], 13 | nPartitions: Int, 14 | replicationFactor: Int, 15 | fixedStartIndex: Int = -1, 16 | startPartitionId: Int = -1): Map[Int, Seq[Int]] = { 17 | if (nPartitions <= 0) 18 | throw new InvalidPartitionsException("Number of partitions must be larger than 0.") 19 | if (replicationFactor <= 0) 20 | throw new InvalidReplicationFactorException("Replication factor must be larger than 0.") 21 | if (replicationFactor > brokerMetadatas.size) // 副本因子不能大于Broker个数 22 | throw new InvalidReplicationFactorException(s"Replication factor: $replicationFactor larger than available brokers: ${brokerMetadatas.size}.") 23 | if (brokerMetadatas.forall(_.rack.isEmpty)) 24 | assignReplicasToBrokersRackUnaware(nPartitions, replicationFactor, brokerMetadatas.map(_.id), fixedStartIndex, 25 | startPartitionId) // 无机柜处理逻辑 26 | else { 27 | if (brokerMetadatas.exists(_.rack.isEmpty)) 28 | throw new AdminOperationException("Not all brokers have rack information for replica rack aware assignment.") 29 | assignReplicasToBrokersRackAware(nPartitions, replicationFactor, brokerMetadatas, fixedStartIndex, 30 | startPartitionId) // 有机柜处理逻辑 31 | } 32 | } 33 | 34 | private def assignReplicasToBrokersRackUnaware(nPartitions: Int, 35 | replicationFactor: Int, 36 | brokerList: Seq[Int], 37 | fixedStartIndex: Int, 38 | startPartitionId: Int): Map[Int, Seq[Int]] = { 39 | val ret = mutable.Map[Int, Seq[Int]]() 40 | val brokerArray = brokerList.toArray 41 | val startIndex = if (fixedStartIndex >= 0) fixedStartIndex else rand.nextInt(brokerArray.length) // 第一个分区(编号为0)的第一个副本放置位置是随机从 brokerList 选择的 42 | var currentPartitionId = math.max(0, startPartitionId) 43 | var nextReplicaShift = if (fixedStartIndex >= 0) fixedStartIndex else rand.nextInt(brokerArray.length) // 剩余的副本相对于第一个副本放置位置其实是由 nextReplicaShift 决定的,而这个数也是随机产生的 44 | for (_ <- 0 until nPartitions) { 45 | if (currentPartitionId > 0 && (currentPartitionId % brokerArray.length == 0)) 46 | nextReplicaShift += 1 47 | // 每个分区 第一副本真正的生成地方 48 | val firstReplicaIndex = (currentPartitionId + startIndex) % brokerArray.length // 其他分区的第一个副本放置位置相对于第0个分区依次往后移 49 | val replicaBuffer = mutable.ArrayBuffer(brokerArray(firstReplicaIndex)) 50 | for (j <- 0 until replicationFactor - 1) 51 | replicaBuffer += brokerArray(replicaIndex(firstReplicaIndex, nextReplicaShift, j, brokerArray.length)) // 剩余的副本真正处理的地方 52 | ret.put(currentPartitionId, replicaBuffer) 53 | currentPartitionId += 1 54 | } 55 | ret 56 | } 57 | 58 | private def replicaIndex(firstReplicaIndex: Int, secondReplicaShift: Int, replicaIndex: Int, nBrokers: Int): Int = { 59 | val shift = 1 + (secondReplicaShift + replicaIndex) % (nBrokers - 1) 60 | (firstReplicaIndex + shift) % nBrokers 61 | } 62 | 63 | private def assignReplicasToBrokersRackAware(nPartitions: Int, 64 | replicationFactor: Int, 65 | brokerMetadatas: Seq[BrokerMetadata], 66 | fixedStartIndex: Int, 67 | startPartitionId: Int): Map[Int, Seq[Int]] = { 68 | val brokerRackMap = brokerMetadatas.collect { case BrokerMetadata(id, Some(rack)) => 69 | id -> rack 70 | }.toMap 71 | val numRacks = brokerRackMap.values.toSet.size 72 | val arrangedBrokerList = getRackAlternatedBrokerList(brokerRackMap) 73 | val numBrokers = arrangedBrokerList.size 74 | val ret = mutable.Map[Int, Seq[Int]]() 75 | val startIndex = if (fixedStartIndex >= 0) fixedStartIndex else rand.nextInt(arrangedBrokerList.size) 76 | var currentPartitionId = math.max(0, startPartitionId) 77 | var nextReplicaShift = if (fixedStartIndex >= 0) fixedStartIndex else rand.nextInt(arrangedBrokerList.size) 78 | for (_ <- 0 until nPartitions) { 79 | if (currentPartitionId > 0 && (currentPartitionId % arrangedBrokerList.size == 0)) 80 | nextReplicaShift += 1 81 | val firstReplicaIndex = (currentPartitionId + startIndex) % arrangedBrokerList.size 82 | val leader = arrangedBrokerList(firstReplicaIndex) 83 | val replicaBuffer = mutable.ArrayBuffer(leader) 84 | val racksWithReplicas = mutable.Set(brokerRackMap(leader)) 85 | val brokersWithReplicas = mutable.Set(leader) 86 | var k = 0 87 | for (_ <- 0 until replicationFactor - 1) { 88 | var done = false 89 | while (!done) { 90 | val broker = arrangedBrokerList(replicaIndex(firstReplicaIndex, nextReplicaShift * numRacks, k, arrangedBrokerList.size)) 91 | val rack = brokerRackMap(broker) 92 | // Skip this broker if 93 | // 1. there is already a broker in the same rack that has assigned a replica AND there is one or more racks 94 | // that do not have any replica, or 95 | // 2. the broker has already assigned a replica AND there is one or more brokers that do not have replica assigned 96 | if ((!racksWithReplicas.contains(rack) || racksWithReplicas.size == numRacks) 97 | && (!brokersWithReplicas.contains(broker) || brokersWithReplicas.size == numBrokers)) { 98 | replicaBuffer += broker 99 | racksWithReplicas += rack 100 | brokersWithReplicas += broker 101 | done = true 102 | } 103 | k += 1 104 | } 105 | } 106 | ret.put(currentPartitionId, replicaBuffer) 107 | currentPartitionId += 1 108 | } 109 | ret 110 | } 111 | ``` 112 | 113 | 114 | 115 | - 副本因子不能大于Broker个数 116 | - 第一个分区(编号为0)的第一个副本放置位置是随机从 brokerList 选择的 117 | - 其他分区的第一个副本放置位置相对于第0个分区依次往后移 118 | - 剩余的副本相对于第一个副本放置位置其实是由 nextReplicaShift 决定的,而这个数也是随机产生的 119 | 120 | 121 | 122 | 运行效果: 123 | 124 | ``` 125 | assignReplicasToBrokers(Seq(0, 1, 2, 3), 3, 3) // 机器信息、分区数、副本数 126 | (0,List(3, 2, 0)) 127 | (1,List(0, 3, 1)) 128 | (2,List(1, 0, 2)) 129 | 130 | assignReplicasToBrokers(Seq(0, 1, 2, 3), 5, 3) 131 | (0,List(3, 1, 2)) 132 | (1,List(0, 2, 3)) 133 | (2,List(1, 3, 0)) 134 | (3,List(2, 0, 1)) 135 | (4,List(3, 2, 0)) 136 | 137 | assignReplicasToBrokers(Seq(0, 1, 2, 3), 9, 3) 138 | (0,List(1, 0, 2)) 139 | (1,List(2, 1, 3)) 140 | (2,List(3, 2, 0)) 141 | (3,List(0, 3, 1)) 142 | (4,List(1, 2, 3)) 143 | (5,List(2, 3, 0)) 144 | (6,List(3, 0, 1)) 145 | (7,List(0, 1, 2)) 146 | (8,List(1, 3, 0)) 147 | ``` 148 | 149 | 150 | 151 | To achieve this goal for replica assignment without considering racks, we: (无机柜情况下的分区规则) 152 | 153 | - 1. Assign the first replica of each partition by round-robin, starting from a random position in the broker list. (第一个 replica 随机) 154 | - 2. Assign the remaining replicas of each partition with an increasing shift.(后续 replicas 在第一个位置渐增移位) 155 | 156 | - Here is an example of assigning 157 | - broker-0 broker-1 broker-2 broker-3 broker-4 158 | - p0 p1 p2 p3 p4 (1st replica) 159 | - p5 p6 p7 p8 p9 (1st replica) 160 | - p4 p0 p1 p2 p3 (2nd replica) 161 | - p8 p9 p5 p6 p7 (2nd replica) 162 | - p3 p4 p0 p1 p2 (3nd replica) 163 | - p7 p8 p9 p5 p6 (3nd replica) 164 | 165 | 166 | 167 | ![F1E3C6D3-2FAB-4CC4-9CF4-B7DDB455F236](assets/F1E3C6D3-2FAB-4CC4-9CF4-B7DDB455F236.png) 168 | 169 | 170 | 171 | Java实现: 172 | 173 | ```java 174 | private static final Random RANDOM = new Random(); 175 | 176 | private Map> assignReplicasToBrokersRackUnaware(int nPartitions, int replicationFactor, Integer[] brokerList, int fixedStartIndex, int startPartitionId) { 177 | 178 | Map> rs = Maps.newHashMap(); 179 | 180 | List brokerArray = Arrays.asList(brokerList); 181 | int startIndex; 182 | 183 | if (fixedStartIndex >= 0) { 184 | startIndex = fixedStartIndex; 185 | } else { 186 | startIndex = RANDOM.nextInt(brokerArray.size()); 187 | } 188 | int currentPartitionId = Math.max(0, startPartitionId); 189 | int nextReplicaShift; 190 | if (fixedStartIndex >= 0) { 191 | nextReplicaShift = fixedStartIndex; 192 | } else { 193 | nextReplicaShift = RANDOM.nextInt(brokerArray.size()); 194 | } 195 | 196 | for (int i = 0; i < nPartitions; i++) { 197 | if (currentPartitionId > 0 && (currentPartitionId % brokerArray.size() == 0)) 198 | nextReplicaShift += 1; 199 | int firstReplicaIndex = (currentPartitionId + startIndex) % brokerArray.size(); 200 | 201 | List replicaBuffer = new ArrayList<>(); 202 | replicaBuffer.add(brokerArray.get(firstReplicaIndex)); 203 | 204 | for (int j = 0; j < replicationFactor - 1; j++) { 205 | replicaBuffer.add(brokerArray.get(replicaIndex(firstReplicaIndex, nextReplicaShift, j, brokerArray.size()))); 206 | } 207 | rs.put(currentPartitionId, replicaBuffer); 208 | currentPartitionId += 1; 209 | } 210 | return rs; 211 | } 212 | 213 | private int replicaIndex(int firstReplicaIndex, int secondReplicaShift, int replicaIndex, int nBrokers) { 214 | int shift = 1 + (secondReplicaShift + replicaIndex) % (nBrokers - 1); // 计算偏移 | 计算方式非常巧妙,它保证了shift的取值范围:[1,nBrokers-1] 215 | System.out.println("----: shift:" + shift); 216 | return (firstReplicaIndex + shift) % nBrokers; 217 | } 218 | 219 | public static void main(String[] args) { 220 | kafkaBrokerTest kafkaBrokerTest = new kafkaBrokerTest(); 221 | 222 | Map> integerListMap = kafkaBrokerTest.assignReplicasToBrokersRackUnaware(9, 3, new Integer[]{0, 1, 2, 3}, -1, -1); 223 | 224 | integerListMap.forEach((a,b) -> { 225 | System.out.println("P" + a + " -> " + b); 226 | }); 227 | } 228 | ``` 229 | 230 | -------------------------------------------------------------------------------- /HDP/HDPS安装/HDP-Search安装.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | HDP-Search安装
官方repo
OS
Format
URL
RedHat or CentOS 7 4 |
Repo File
 
Tarball
(md5asc) 5 |

自作本地
  1. 下载tar包
  2. 解压到http服务器
    1. tar -zxvf HDP-SOLR-4.0.0-400-centos7.tar.gz  
  3. 修改repo的地址为本地
[HDP-SOLR-4.0.0-400]                                                                                                                                                                                              
name=Hortonworks Data Platform Version - HDP-SOLR-4.0.0-400                                                                                                                                                      
# baseurl=http://public-repo-1.hortonworks.com/HDP-SOLR-4.0.0-400/repos/centos7
baseurl=http://192.168.20.65:8900/hdps/centos7                                                                                                                                  
gpgcheck=0                                                                                                                                                                                                        
enabled=1                                                                                                                                                                                                        
priority=1
  1. yum repolist
  2. 安装 mpack  https://docs.hortonworks.com/HDPDocuments/HDPS/HDPS-4.0.0/bk_solr-search-installation/content/hdp-search40-install-mpack.html
cd /tmp
wget http://public-repo-1.hortonworks.com/HDP-SOLR/hdp-solr-ambari-mp/solr-service-mpack-4.0.0.tar.gz

ambari-server install-mpack --mpack=/tmp/solr-service-mpack-4.0.0.tar.gz

ambari-server restart

Connector
需要手动配置
  • 参考 9.配置solr

重点:
  1. HDFS配置
           Delete write.lock files on HDFS    true
           推荐开启该配置:有利于Ambari启动Solr时自动删除write.lock文件,避免特殊意外宕机场景下,solr无法启动




















-------------------------------------------------------------------------------- /hive/HELP.md: -------------------------------------------------------------------------------- 1 | # Getting Started 2 | 3 | 4 | 5 | ![image-20190611193250747](assets/image-20190611193250747.png) 6 | 7 | ### 数据类型 8 | 9 | #### 基本数据类型 10 | 11 | ##### Numeric Types 12 | 13 | > - TINYINT (1-byte signed integer, from -128 to 127) 14 | > - SMALLINT (2-byte signed integer, from -32,768 to 32,767) 15 | > - INT/INTEGER (4-byte signed integer, from -2,147,483,648 to 2,147,483,647) 16 | > - `INTEGER` is introduced as a synonym for `INT` in Hive 2.2.0 ([HIVE-14950](https://issues.apache.org/jira/browse/HIVE-14950)). 17 | > - BIGINT (8-byte signed integer, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807) 18 | > - FLOAT (4-byte single precision floating point number) 19 | > - DOUBLE (8-byte double precision floating point number) 20 | > - DOUBLE PRECISION (alias for DOUBLE, only available starting with Hive 2.2.0) 21 | > - DECIMAL 22 | > - Introduced in Hive 0.11.0 with a precision of 38 digits 23 | > - Hive 0.13.0 introduced user-definable precision and scale 24 | > - based on Java's BigDecimal 25 | > - NUMERIC (same as DECIMAL, starting with Hive 3.0.0) 26 | 27 | ##### Date/Time Types 28 | 29 | > - TIMESTAMP (Note: Only available starting with Hive 0.8.0) 30 | > - from_utc_timestamp 31 | > - to_utc_timestamp 32 | > - SerDe property "timestamp.formats" 例子:yyyy-MM-dd'T'HH:mm:ss 33 | > - DATE (Note: Only available starting with Hive 0.12.0) 34 | > - in the form `YYYY-­MM-­DD` 35 | > - INTERVAL (Note: Only available starting with Hive 1.2.0) 36 | 37 | ##### String Types 38 | 39 | > - STRING 40 | > - VARCHAR (Note: Only available starting with Hive 0.12.0) 41 | > - between 1 and 65535 42 | > - CHAR (Note: Only available starting with Hive 0.13.0) 43 | > - The maximum length is fixed at 255. 44 | 45 | ##### Misc Types 46 | 47 | > - BOOLEAN 48 | > - BINARY (Note: Only available starting with Hive 0.8.0) 49 | 50 | 51 | 52 | #### 复杂数据类型 53 | 54 | > - arrays: ARRAY (Note: negative values and non-constant expressions are allowed as of Hive 0.14.) 55 | > - maps: MAP (Note: negative values and non-constant expressions are allowed as of Hive 0.14.) 56 | > - structs: STRUCT 57 | > - union: UNIONTYPE (Note: Only available starting with Hive 0.7.0.) 58 | > - 不完备,不建议使用 59 | > - Queries that reference UNIONTYPE fields in JOIN ([HIVE-2508](https://issues.apache.org/jira/browse/HIVE-2508)), WHERE, and GROUP BY clauses will fail 60 | > - 如果你不care这个字段,使用这种类型 61 | 62 | 63 | 64 | ##### 强制指定Int类型 65 | 66 | 默认情况下,整型文字被假定为int,除非数字超过int的范围,在这种情况下,它被解释为bigint,或者如果数字上存在以下某个后缀。 67 | 68 | | Type | Postfix | Example | 69 | | -------- | ------- | ------- | 70 | | TINYINT | Y | 100Y | 71 | | SMALLINT | S | 100S | 72 | | BIGINT | L | 100L | 73 | 74 | 75 | 76 | ### DDL 77 | 78 | ##### 建库 79 | 80 | > CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name 81 | > 82 | > [COMMENT database_comment] 83 | > 84 | > [LOCATION hdfs_path] 85 | > 86 | > [WITH DBPROPERTIES(property_name=property_value,...)] 87 | 88 | ##### D删库 89 | 90 | > DROP DATABASE database_name [RESTRICT|CASCADE] 91 | > 92 | > - RESTRICT 默认;如果库中存在表,则删除失败 93 | > - CASCADE 可选;删除库时同时删除所有内部表和外部表 94 | 95 | > SHOW (DATABASES|SCHEMA)[LIKE 'identifier_with_wildcards'] 96 | > 97 | > 98 | 99 | ##### 建表(外部表) 100 | 101 | > CREATE EXTERNAL TABLE database_name.table_name ( 102 | > 103 | > ​ name STRING, 104 | > 105 | > ​ age INT 106 | > 107 | > ​ ct TIMESTAMP 108 | > 109 | > ) 110 | > 111 | > LOCATION '/user/demo/table_name' 112 | > 113 | > TBLPROPERTIES("skip.header.line.count"="2") 114 | > 115 | > PATTITIONED BY (city STRING); 116 | > 117 | > CLUSTERED BY (age) INTO 11 BUCKETS 118 | > 119 | > 120 | > 121 | > - 不指定位置,将在Hive默认的目录下存放该表信息 122 | > - TBLPROPERTIES 用于指定表的属性 123 | > - Hive中的一些重要表层级的属性 124 | > - last_modified_user 125 | > - last_modified_time 126 | > - immutable 不变的表,为true时,将无法再插入数据 127 | > - orc.compress 128 | > - skip.header.line.count 跳过文件的标题行 129 | > - 可自定义一些属性,存储一些额外信息 130 | > - PATTITIONED BY 131 | > - 指定分区字段 不需要包含在建表声明里 132 | > - CLUSTERED BY 133 | > - 按age进行分桶 分为11个桶 134 | > - hive.enforce.bucketing=TRUE 135 | 136 | > SHOW TABLES [IN database_name] [identifier_with_wildcards]; // 该语句列出当前数据库中所有的表和视图,可添加正则过滤 137 | > 138 | > DESCRIBE FORMATTED table_name; // show 表定义信息 139 | > 140 | > DESCRIBE EXTENDED table_name; // 如果使用了extended关键字,则以Thrift序列化形式显示表的元数据,如果使用formatted关键字,则以表格形式显示元数据 141 | > 142 | > SHOW CREATE TABLE table_name; // 展示表的创建语句 143 | > 144 | > DROP TABLE table_name; 145 | > 146 | > SHOW PARTITIONS table_name [PARTITION(partition_desc)] 147 | > 148 | > SHOW [FORMATTED] (INDEX|INDEXES) ON table_with_index [(FROM|IN) db_name] 149 | > 150 | > - show index on table_name; 151 | > - show formatted index on table_name; 152 | > 153 | > SHOW COLUMNS(FROM|IN) table_name [(FROM|IN) db_name] 154 | > 155 | > SHOW COMPACTIONS:该语句显示当Hive事务被使用时,所有正在被压缩或者预定压缩的表和分区 参见参考 156 | 157 | ##### 内部表 158 | 159 | > - 一般不用 160 | > - 使用场景 161 | > - 数据是临时存储的 162 | > - 访问数据的唯一方式是Hive,需要用Hive来完全管理表和数据的生命周期 163 | 164 | ##### 修改表的存储属性 165 | 166 | > - 可以使用ALTER TABLE 修改,但推荐 167 | > - 拉取上一版本的建表语句,然后修改建表语句的存储属性,然后重新创建表 168 | > - modify the CREATE TABLE with new storage attributes, and recreate it 169 | 170 | ##### 合并表文件 171 | 172 | > ALTERE TABLE table_name CONCATENATE; 173 | > 174 | > 该命令可将多个数据文件合并成大较大文件,但速度慢 175 | > 176 | > 最佳的方式是在数据进去Hadoop前就合并成集群数据块数倍大小的文件,通常为几GB或更大 177 | 178 | 179 | 180 | 视图View,只有逻辑视图,无物理视图 181 | 182 | ### DML 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | ### High 191 | 192 | hive 不支持删除更新 193 | 194 | orc文件、parquet文件 195 | 196 | Hive索引 197 | 198 | "\n"需要清洗掉,不然hive会默认识别为另一个字段 199 | 200 | ##### 内部表、外部表 201 | 202 | > 区别在于是否删除真实的表数据 on hdfs 203 | > 204 | > 多用外部表 205 | 206 | ##### 分区和分桶 207 | 208 | > - 分区 209 | > - 优化查询 210 | > - 分区键:数据按分区键被分割成若干个逻辑块,并存放在单独的路径中 211 | > - 一般以时间为分区规则:例如每天生成一个路径 212 | > - 不要过度分区:会增加数据加载和数据检索的开销 213 | > - 问题:如何安装时间天进行分区? 214 | > - 规则 215 | > - 分区键的唯一值应该在较低到中间值之间??? 216 | > - 避免分区小于1G (越大越好) 217 | > - 当分区较多时,调整HiveServer2和Hive Metastore的内存 218 | > - 可以修改一个已分区表的Schema,但是一旦结构发生改变,你就无法在已有分区中修改数据了??? TODO check 219 | > - 分桶 220 | > - 优化Join 221 | > - 分桶键:给分桶键定义最大分桶数目,数据基于Hash散列算法进行分割,每个桶内存储的是全字段的数据 222 | > - 非倾斜的键,数据将均匀分布,可实现高效的数据抽样 223 | > - 规则 224 | > - 选择唯一值多的键为桶键 225 | > - 桶个数设置为质数(定义为在大于1的自然数中,除了1和它本身以外不再有其他因数) 226 | > - 2 3 5 7 11 13 17 19 23 29 31 37 41 43 227 | > - 桶键的数据是倾斜时:为倾斜的值单独创建桶,借助列表分桶(list bucketing)可实现 ??? 228 | > - **需要连接的表,其桶的数目必须相同**,或者一个表的桶数是另一个表的桶数的因子 229 | > - 假如整数n除以m,结果是无余数的整数,那么我们称*m*就是*n*的因子 230 | > - 质数没有其他因子,只有自己或1 231 | > - 设置桶数,要考虑整个集群的CPU,每个CPU只会对一个桶进行写入操作,大集群可设置大桶数以充分利用资源 232 | > - **表创建好之后,桶的个数不能改变** ??? TODO check new version 233 | > - 桶的大小至少1G,不然没必要分桶 234 | > - 设置 hive.enforce.bucketing=TRUE 强制分桶 235 | 236 | ![image-20190516112327768](assets/image-20190516112327768.png) 237 | 238 | SerDe 239 | 240 | 数据倾斜 241 | 242 | Hive Streaming 243 | 244 | 245 | 246 | ##### 排序 247 | 248 | - Order by 和 Sort by 249 | - Order by只启动一个reduceTask,Sort by 启动多个reduceTask 250 | - Distribute by 和 Cluster by 251 | - distribute by 按指定字段或表达式对数据进行拆分 252 | - Cluster by等价于 Distribute by 和 Sort by的结合 253 | - SELECT col1, col2 FROM t1 CLUSTER BY col1 同比 SELECT col1,col2 FROM t1 DISTRIBUTE BY col1 SORT B Y col1 254 | - 数据量大时,推荐使用 distribute by + sort by 的方案 255 | 256 | 257 | 258 | ##### 如何确认一个Parquet文件是否被压缩 259 | 260 | https://mp.weixin.qq.com/s/bjv6VccWdW5GLcdmR1tcyg 261 | 262 | 263 | 264 | ##### 内嵌查询统计 265 | 266 | https://blog.csdn.net/gamer_gyt/article/details/52169441 267 | 268 | ##### Array: 269 | 270 | ```sql 271 | # 数据 272 | 0001,爱丽丝,尼克/亚当,尼克,剧情/奇幻/爱情,马丁/艾德琳,2009,12,120,5000,8.9 273 | 274 | # 建表 275 | create table movie_message( 276 | id int, 277 | title string, 278 | daoyan array, 279 | bianju array, 280 | leixing array, 281 | zhuyan array, 282 | year int, 283 | month int, 284 | shichang int, 285 | disnum int, 286 | score float 287 | ) 288 | comment "this table about movie's message" 289 | row format delimited fields terminated by "," 290 | collection items terminated by '/'; // 重要 291 | 292 | # 方案: 293 | # 使用explode和lateral view关键字 294 | 295 | # 查询 296 | select lx,count(*) from movie_message lateral view explode(leixing) leixing as lx group by lx; 297 | 298 | # 存储查询 299 | insert overwrite local directory "/home/master/mycode/movie_leixing" 300 | row format delimited fields terminated by "\t" 301 | select lx,count(*) from movie_message lateral view explode(leixing) leixing as lx group by lx; 302 | ``` 303 | 304 | ##### Map 305 | 306 | ```sql 307 | # 数据 假设我们有这样格式的数据人物A,主演了BCD电影,将于2016-05上映 308 | A ABC:2016-05,EFG:2016-09 309 | B OPQ:2015-06,XYZ:2016-04 310 | 311 | # 建表 312 | create table people_movie( 313 | name string, 314 | movie map ) 315 | row format delimited fields terminated by "\t" 316 | collection items terminated by "," 317 | map keys terminated by ":"; // 重要 318 | 319 | # 查询1 320 | select explode(movie) as (m_name,m_time) from people_movie; 321 | # 查询2 322 | select name,mo,time from people_movie lateral view explode(movie) movie as mo,time; 323 | ``` 324 | 325 | ##### Structs 326 | 327 | ``` 328 | # 数据 假设我们的数据格式是这样的,电影ABC,有1254人评价过,打分为7.4分 329 | ABC 1254:7.4 330 | DEF 256:4.9 331 | XYZ 456:5.4 332 | 333 | # 建表 334 | create table movie_score( 335 | name string, 336 | info struct 337 | )row format delimited fields terminated by "\t" 338 | collection items terminated by ":"; 339 | 340 | # 查询 341 | select * from movie_score; 342 | select info.number,info.score from movie_score; 343 | ``` 344 | 345 | ##### collect_set函数 346 | 347 | ``` 348 | # 数据 假设 349 | select * from test; 350 | OK 351 | 1 A 352 | 1 C 353 | 1 B 354 | 2 B 355 | 2 C 356 | 2 D 357 | 3 B 358 | 3 C 359 | 3 D 360 | 361 | # 统计 现在要统计每个id得到的等级 362 | select id,collect_set(name) from test group by id; 363 | 364 | # 结果 365 | OK 366 | 1 ["A","C","B"] 367 | 2 ["B","C","D"] 368 | 3 ["B","C","D"] 369 | ``` 370 | 371 | 372 | 373 | ### 参考: 374 | 375 | [博客:基本操作,性能优化](https://yq.aliyun.com/articles/33700) 376 | 377 | [基本操作](https://zhuanlan.zhihu.com/p/36744886) 378 | 379 | 交互式处理:运行时间在两秒左右的处理 380 | 381 | [DDL&DML](https://blog.csdn.net/skywalker_only/article/details/32709777) 382 | 383 | [测试性能](https://my.oschina.net/u/3115904/blog/839486) 384 | 385 | [hive2.0](https://blog.csdn.net/lvguichen88/article/details/70225719) 386 | 387 | -------------------------------------------------------------------------------- /kafka/Kafka运维与调优.md: -------------------------------------------------------------------------------- 1 | ## Kafka调优 2 | 3 | - 基于Key来生产消息的业务,不可动态调整分区数量,这将打破其原有hash算法的结果,导致消息顺序无法保证(当然业务场景可以的话,是没关系的) 4 | 5 | - 同一Partition,如果存在未ACK的offset,在消费者未重启的情况下,消费者不会自动重新消费未提交ACK的offset; 6 | 7 | 如果消费者重启了,那么会从未ACK的offset处继续往后执行,但是这里一个问题,如果在该Partition上后续有一个高于这个未ACK的offset的偏移量成功ACK, 8 | 9 | 那么该Partition之前未ACK的所有记录都会丢失,已这次成功ACK的offset为最新偏移量,意味着未ACK的部分数据丢失 10 | 11 | 12 | 13 | 14 | 15 | ##### 估算Kafka分区数 16 | 17 | 一般根据未来1到2年的目标吞吐量来设计kafka的分区数量 18 | 19 | - 基于生产消费的吞吐量进行估算 20 | - 假设对于单个partition,producer端的可达吞吐量为p,Consumer端的可达吞吐量为c,期望的目标吞吐量为t,那么集群所需要的partition数量至少为max(t/p,t/c) 21 | - 在producer端,单个分区的吞吐量大小会受到批量大小、数据压缩方法、 确认类型(同步/异步)、复制因子等配置参数的影响 22 | 23 | 24 | 25 | 业务初期,可以多配置分区数,少部署Broker数量,这样后续业务增长,我们只需添加Broker数量,然后以**在线方式**将适当比例的partition转移到新增加的broker中去 26 | 27 | 28 | 29 | **越多的分区需要打开更多地文件句柄** 30 | 31 | - 每个分区都会对照着文件系统的一个目录 32 | - 每个日志数据段都会分配两个文件,一个索引文件和一个数据文件 33 | - 机器的文件句柄可配置依据机器性能,**配置十万、百万级别**(ulimit -n) 34 | - 文件系统类型:官网的测试报告,XFS的性能要强于ext4 35 | - swap的调优:禁用或者设置很小的值(能够观测到Broker性能开始出现急剧下降) 36 | 37 | 38 | 39 | ##### 规划磁盘容量 40 | 41 | - 新增消息数 : 每天1亿 42 | - 消息留存时间 : 14天 43 | - 平均消息大小 : 1KB 44 | - 备份数 : 共2份数据 45 | - 是否启用压缩 :假设压缩比是0.75 46 | 47 | 1亿 * 1KB * 2 / 1000 / 1000 = 200GB 48 | 49 | 索引存储等其他数据存储,故再为这些数据预留出10%的磁盘空间,所以总容量为220GB 50 | 51 | 保存两周:220GB * 14,大约3TB左右 52 | 53 | 压缩后:0.75 * 3 = 2.25TB。 54 | 55 | **kafka-log-dirs脚本是比较新的脚本,可以帮助查询各个Broker上的各个日志路径的磁盘占用情况。** 56 | 57 | 58 | 59 | ##### 带宽(评估机器数量) 60 | 61 | - 1Gbps的千兆网络 62 | - 10Gbps的万兆网络 63 | - 目标:在1小时内处理1TB的业务数据, 需要多少台Kafka服务器来完成(假设带宽是1Gbps, 即每秒处理1Gb的数据,注意是小b) 64 | - kafka独占一台机器 65 | - 最大带宽:单个kafka只能占用机器的70%带宽资源(超过70%的阈值就有网络丢包的可能性):单台Kafka服务器最多也就能使用大约700Mb的带宽资源 66 | - 保留带宽:(不能让Kafka服务器常规性使用这么多资源) 67 | - 额外预留出2/3(保守值)的资源,单台服务器使用带宽700Mb / 3 ≈ 240Mbps 68 | - 1小时内处理1TB:1024 * 1024 * 8 Mb / (60 * 60) s ≈ 2336Mbps 69 | - 2336Mbps / 240Mbps ≈ 10台 70 | 71 | 72 | 73 | ##### Rebalance触发条件 74 | 75 | - 组成员数量发生变化 76 | 77 | - session.timeout.ms 78 | 79 | - heartbeat.interval.ms 80 | 81 | - max.poll.interval.ms 82 | 83 | - GC参数 84 | 85 | - 当Consumer Group完成Rebalance之后,每个Consumer实例都会定期地向Coordinator发送心跳请求,表明它还存活着。如果某个Consumer实例不能及时地发送这些心跳请求,Coordinator就会认为该Consumer已经“死”了,从而将其从Group中移除,然后开启新一轮Rebalance。Consumer端有个参数,叫session.timeout.ms,就是被用来表征此事的。该参数的默认值是10秒,即如果Coordinator在10秒之内没有收到Group下某Consumer实例的心跳,它就会认为这个Consumer实例已经挂了。可以这么说,session.timout.ms决定了Consumer存活性的时间间隔。 86 | 87 | 除了这个参数,Consumer还提供了一个允许你控制发送心跳请求频率的参数,就是heartbeat.interval.ms。这个值设置得越小,Consumer实例发送心跳请求的频率就越高。频繁地发送心跳请求会额外消耗带宽资源,但好处是能够更加快速地知晓当前是否开启Rebalance,因为,目前Coordinator通知各个Consumer实例开启Rebalance的方法,就是将REBALANCE_NEEDED标志封装进心跳请求的响应体中。 88 | 89 | 除了以上两个参数,Consumer端还有一个参数,用于控制Consumer实际消费能力对Rebalance的影响,即max.poll.interval.ms参数。它限定了Consumer端应用程序两次调用poll方法的最大时间间隔。它的默认值是5分钟,表示你的Consumer程序如果在5分钟之内无法消费完poll方法返回的消息,那么Consumer会主动发起“离开组”的请求,Coordinator也会开启新一轮Rebalance。 90 | 91 | - 订阅主题数量发生变化 92 | 93 | - 订阅主题的分区数发生变化 94 | 95 | 96 | 97 | ##### auto.offset.reset 98 | 99 | 当consumer启动后它会从Kafka读取它上次消费的位移。 100 | 101 | - 情况1: 如果 Kafka broker端没有保存这个位移值,那么consumer会看auto.offset.reset的脸色 102 | 103 | - 情况2:consumer拿到位移值开始消费,如果后面发现它要读取消息的位移在Kafka中不存在(可能对应的消息已经被删除了),那么它也会看auto.offset.reset的脸色 104 | 105 | - 情况3:除以上这两种情况之外consumer不会再顾忌auto.offset.reset的值 106 | 107 | 怎么看auto.offset.reset的脸色呢?简单说就是earliest从头消息;latest从当前新位移处消费。 108 | 109 | 110 | 111 | ##### 位移提交 112 | 113 | 位移提交的语义保障是由你来负责的,Kafka只会“无脑”地接受你提交的位移 114 | 115 | 从用户的角度来说,位移提交分为自动提交和手动提交;从Consumer端的角度来说,位移提交分为同步提交和异步提交 116 | 117 | 使用KafkaConsumer.seek可以精确控制你要开始消费的位移 118 | 119 | standalone consumer没有rebalance,也没有group提供的负载均衡,你需要自己实现。其他方面(比如位移提交)和group没有太大的不同 120 | 121 | 122 | 123 | ##### 预防CommitFailedException 124 | 125 | - 缩短单条消息处理时间 - 优化业务代码 126 | - 增加Consumer端允许下游系统消费一批消息的最大时长(max.poll.interval.ms:默认值是5分钟) 127 | - 减少下游系统一次消费的消息总数(max.poll.records) 128 | - 下游系统使用多线程加速消费 129 | 130 | 131 | 132 | ##### 消费者TCP连接 133 | 134 | - 第一类连接:确定协调者和获取集群元数据。 135 | - 一个,初期的时候建立,当第三类连接建立起来之后,这个连接会被关闭。 136 | 137 | - 第二类连接:连接协调者,令其执行组成员管理操作。 138 | - 一个 139 | 140 | - 第三类连接:执行实际的消息获取。 141 | - 两个分别会跟两台broker机器建立一个连接,总共两个TCP连接,同一个broker机器的不同分区可以复用一个socket。 142 | 143 | 144 | 145 | ##### 消费者监控指标 146 | 147 | - Lag:指消费者当前落后于生产者的程度 148 | - Kafka监控Lag的层级是在分区上的。如果要计算主题级别的,你需要手动汇总所有主题分区的Lag,将它们累加起来,合并成最终的Lag值。 149 | - 监控到Lag越来越大,那就是消费者程序变得越来越慢了,或者生产速度变快了 150 | - Lead:指消费者最新消费消息的位移与分区当前第一条消息位移的差值 151 | - 一旦你监测到Lead越来越小,甚至是快接近于0了,你就一定要小心了,这可能预示着消费者端要丢消息了。 152 | 153 | 154 | 155 | ##### 位移删除 156 | 157 | Empty状态(消费者组状态机)下的组Kafka才会执行过期位移删除的操作 158 | 159 | 160 | 161 | ##### 消费者组状态机 162 | 163 | 5种状态: Empty、Dead、PreparingRebalance、CompletingRebalance和Stable 164 | 165 | ![image-20200818180124497](assets/image-20200818180124497.png) 166 | 167 | 168 | 169 | ##### Kafka控制器 170 | 171 | 控制器组件(Controller):主要作用是在Apache ZooKeeper的帮助下管理和协调整个Kafka集群 172 | 173 | - 控制器选主:基于Zookeepr进行leader选举 174 | - 功能: 175 | - 主题管理(创建、删除、增加分区) - 当我们执行kafka-topics脚本时,大部分的后台工作都是控制器来完成的 176 | - 分区重分配 - kafka-reassign-partitions脚本 177 | - Preferred领导者选举 - 为了避免部分Broker负载过重而提供的一种换Leader的方案 178 | - 集群成员管理(新增Broker、Broker主动关闭、Broker宕机) - 监听Watch检测zookeeper的/brokers/ids节点下的子节点数量变更 179 | - 数据服务 - 向其他Broker提供数据服务(。控制器上保存了最全的集群元数据信息) 180 | 181 | 182 | 183 | 184 | 185 | ##### Kafka动态配置 186 | 187 | - 动态调整Broker端各种线程池大小,实时应对突发流量。 188 | - 动态调整Broker端连接信息或安全配置信息。 189 | - 动态更新SSL Keystore有效期。 190 | - 动态调整Broker端Compact操作性能。 191 | - 实时变更JMX指标收集器(JMX Metrics Reporter)。 192 | 193 | 194 | 195 | ##### 重置消费者位移 196 | 197 | 1. 位移维度。这是指根据位移值来重设。也就是说,直接把消费者的位移值重设成我们给定的位移值。 198 | 2. 时间维度。我们可以给定一个时间,让消费者把位移调整成大于该时间的最小位移;也可以给出一段时间间隔,比如30分钟前,然后让消费者直接将位移调回30分钟之前的位移值。 199 | 200 | ![image-20200819002600829](assets/image-20200819002600829.png) 201 | 202 | 可通过Api或命令行方式设置: 203 | 204 | - 消费者Api:比较复杂 205 | - 命令行方式:简单便捷 206 | 207 | 208 | 209 | ##### 客户端与Kafka版本是否适配 210 | 211 | kafka-broker-api-versions脚本。**这个脚本的主要目的是验证不同Kafka版本之间服务器和客户端的适配性** 212 | 213 | 结果中:*Produce(0): 0 to 7 [usable: 7]* 214 | 215 | - “Produce”表示Produce请求 216 | 217 | - “0 to 7”表示Produce请求在Kafka 2.2中总共有8个版本,序号分别是0到7 218 | - “usable:7”表示当前连入这个Broker的客户端API能够使用的版本号是7,即最新的版本。 219 | - **自0.10.2.0版本开始,Kafka正式支持双向兼容,也就是说,低版本的Broker也能处理高版本Client的请求了** 220 | 221 | 222 | 223 | ##### 查看Kafka日志文件数据长什么样 224 | 225 | ```shell 226 | bin/kafka-dump-log.sh --files ../data_dir/kafka_1/test-topic-1/00000000000000000000.log --deep-iteration --print-data-log 227 | ``` 228 | 229 | 230 | 231 | ##### 生产者性能测试(kafka-producer-perf-test.sh) 232 | 233 | ```shell 234 | # 发送一千万数据,每个数据大小是1KB 235 | $ bin/kafka-producer-perf-test.sh --topic test-topic --num-records 10000000 --throughput -1 --record-size 1024 --producer-props bootstrap.servers=kafka-host:port acks=-1 linger.ms=2000 compression.type=lz4 236 | 237 | # 生产者吞吐量、消息发送延时、各种分位数下的延时(SLA : 604 ms 99th : 有99%消息的延时都在604ms以内) 238 | 2175479 records sent, 435095.8 records/sec (424.90 MB/sec), 131.1 ms avg latency, 681.0 ms max latency. 239 | 4190124 records sent, 838024.8 records/sec (818.38 MB/sec), 4.4 ms avg latency, 73.0 ms max latency. 240 | 10000000 records sent, 737463.126844 records/sec (720.18 MB/sec), 31.81 ms avg latency, 681.00 ms max latency, 4 ms 50th, 126 ms 95th, 604 ms 99th, 672 ms 99.9th. 241 | ``` 242 | 243 | 244 | 245 | ##### 消费者性能测试(kafka-consumer-perf-test.sh) 246 | 247 | ```shell 248 | $ bin/kafka-consumer-perf-test.sh --broker-list kafka-host:port --messages 10000000 --topic test-topic 249 | 250 | # 消费者吞吐量 251 | start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec 252 | 2019-06-26 15:24:18:138, 2019-06-26 15:24:23:805, 9765.6202, 1723.2434, 10000000, 1764602.0822, 16, 5651, 1728.1225, 1769598.3012 253 | ``` 254 | 255 | 256 | 257 | ##### 分区副本迁移(kafka-reassign-partitions.sh) 258 | 259 | 260 | 261 | ##### Kafka集群间的数据同步(kafka-mirror-maker.sh) 262 | 263 | MirrorMaker就是一个消费者+生产者的程序。消费者负责从源集群(Source Cluster)消费数据,生产者负责向目标集群(Target Cluster)发送消息 264 | 265 | ```shell 266 | # 它的常见用法是指定生产者配置文件、消费者配置文件、线程数(消费者个数)以及要执行数据镜像的主题正则表达式 267 | $ bin/kafka-mirror-maker.sh --consumer.config ./config/consumer.properties --producer.config ./config/producer.properties --num.streams 8 --whitelist ".*" 268 | ``` 269 | 270 | **注意点:MirrorMaker在执行消息镜像的过程中,如果发现要同步的主题在目标集群上不存在的话,它就会根据Broker端参数num.partitions和default.replication.factor的默认值,自动将主题创建出来,在实际使用场景中,我推荐你提前把要同步的所有主题按照源集群上的规格在目标集群上等价地创建出来。** 271 | 272 | 除了常规的Kafka主题之外,MirrorMaker默认还会同步内部主题。 273 | 274 | 其他开源方案: 275 | 276 | - [Uber的uReplicator工具](https://github.com/uber/uReplicator) 277 | - LinkedIn开发的Brooklin Mirror Maker工具 278 | - Confluent公司研发的Replicator工具(收费) 279 | 280 | MirrorMaker本身功能简单,应用灵活,但也有运维成本高、性能差等劣势,因此业界有厂商研发了自己的镜像工具。你可以根据自身的业务需求,选择合适的工具来帮助你完成跨集群的数据备份。 281 | 282 | 283 | 284 | ##### Kafka监控 285 | 286 | - 主机监控(机器性能) 287 | 288 | - 机器负载(Load) 289 | - CPU使用率 290 | - 内存使用率,包括空闲内存(Free Memory)和已使用内存(Used Memory) 291 | - 磁盘I/O使用率,包括读使用率和写使用率 292 | - 网络I/O使用率 293 | - TCP连接数 294 | - 打开文件数 295 | - inode使用情况 296 | 297 | - JVM监控 298 | 299 | - Full GC发生频率和时长。这个指标帮助你评估Full GC对Broker进程的影响。长时间的停顿会令Broker端抛出各种超时异常。 300 | - 活跃对象大小。这个指标是你设定堆大小的重要依据,同时它还能帮助你细粒度地调优JVM各个代的堆大小。 301 | - 应用线程总数。这个指标帮助你了解Broker进程对CPU的使用情况。 302 | - 具体:**你一定要监控你的Broker GC日志,即以kafkaServer-gc.log开头的文件**,注意不要出现Full GC的字样。一旦你发现Broker进程频繁Full GC,可以开启G1的-XX:+PrintAdaptiveSizePolicy开关,让JVM告诉你到底是谁引发了Full GC。 303 | 304 | - 集群监控 305 | 306 | - 查看Broker进程是否启动,端口是否建立 307 | - 在很多容器化的Kafka环境中,比如使用Docker启动Kafka Broker时,容器虽然成功启动了,但是里面的网络设置如果配置有误,就可能会出现进程已经启动但端口未成功建立监听的情形 308 | - 查看Broker端关键日志 309 | - 服务器日志server.log(最重要的:严重错误都会在这个文件中被展示出来) 310 | - 控制器日志controller.log 311 | - 主题分区状态变更日志state-change.log 312 | - 查看Broker端关键线程的运行状态 313 | - Log Compaction线程,这类线程是以kafka-log-cleaner-thread开头的 314 | - 副本拉取消息的线程,通常以ReplicaFetcherThread开头 315 | - 查看Broker端的关键JMX指标(Kafka提供了超多的JMX指标供用户实时监测) 316 | - **BytesIn/BytesOut**:即Broker端每秒入站和出站字节数。你要确保这组值不要接近你的网络带宽,**否则这通常都表示网卡已被“打满”,很容易出现网络丢包的情形。** 317 | - **NetworkProcessorAvgIdlePercent**:即网络线程池线程平均的空闲比例。通常来说,你应该确保这个JMX值长期大于30%。如果小于这个值,就表明你的网络线程池非常繁忙,你需要通过增加网络线程数或将负载转移给其他服务器的方式,来给该Broker减负。 318 | - **RequestHandlerAvgIdlePercent**:即I/O线程池线程平均的空闲比例。同样地,如果该值长期小于30%,你需要调整I/O线程池的数量,或者减少Broker端的负载。 319 | - **UnderReplicatedPartitions**:即未充分备份的分区数。所谓未充分备份,是指并非所有的Follower副本都和Leader副本保持同步。一旦出现了这种情况,通常都表明该分区有可能会出现数据丢失。因此,这是一个非常重要的JMX指标。 320 | - **ActiveControllerCount**:即当前处于激活状态的控制器的数量。正常情况下,Controller所在Broker上的这个JMX指标值应该是1,其他Broker上的这个值是0。如果你发现存在多台Broker上该值都是1的情况,一定要赶快处理,处理方式主要是查看网络连通性。这种情况通常表明集群出现了脑裂。脑裂问题是非常严重的分布式故障,Kafka目前依托ZooKeeper来防止脑裂。但一旦出现脑裂,Kafka是无法保证正常工作的。 321 | - 还可以根据自己业务的需要,去官网查看其他JMX指标,把它们集成进你的监控框架 322 | - 监控Kafka客户端 323 | 324 | - 监控框架: 325 | 326 | - JMXTool 327 | 328 | - ```shell 329 | # 查看使用方法 330 | $ bin/kafka-run-class.sh kafka.tools.JmxTool 331 | ``` 332 | 333 | - --attributes:指定要查询的JMX属性名称,以逗号分割的csv格式 334 | 335 | - --date-format:指定显示的日期格式 336 | 337 | - --jmx-url:指定要连接的jmx接口,默认格式为:service:jmx:rmi:///jndi/rmi:/jmxrmi 338 | 339 | - --object-name:指定要查询的JMX MBean的名称 340 | 341 | - --reporting-interval:指定实时查询的时间间隔,默认2秒查询一次 342 | 343 | - ```shell 344 | # Demo:每5秒查询一次过去1分钟的BytesInPerSec均值(Broker端每秒入站的流量) 345 | $ bin/kafka-run-class.sh kafka.tools.JmxTool --object-name kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec --jmx-url service:jmx:rmi:///jndi/rmi://:9997/jmxrmi --date-format "YYYY-MM-dd HH:mm:ss" --attributes OneMinuteRate --reporting-interval 1000 346 | ``` 347 | 348 | - Kafka Manager 349 | 350 | - Burrow 351 | 352 | - JMXTrans + InfluxDB + Grafana(流行) 353 | 354 | - Kafka Eagle 355 | 356 | 357 | 358 | ##### Kafka调优 359 | 360 | 高吞吐量、低延时是我们调优Kafka集群的主要目标 361 | 362 | - vm.max_map_count=655360:避免**OutOfMemoryError:Map failed** 363 | - 操作系统页缓存大小:给Kafka预留的页缓存越大越好,最小值至少要容纳一个日志段的大小,也就是Broker端参数log.segment.bytes的值,该参数的默认值是1GB 364 | - 设置堆大小:你可以查看GC log,特别是关注Full GC之后堆上存活对象的总大小,然后把堆大小设置为该值的1.5~2倍,如果你发现Full GC没有被执行过,手动运行jmap -histo:live < pid >就能人为触发Full GC。 365 | - 调节吞吐量 366 | - 调节延时 --------------------------------------------------------------------------------