課程簡介
本課程首先從全局的視角,全面介紹了未來技術(shù)發(fā)展的趨勢,以及大數(shù)據(jù)在整個(gè)技術(shù)架構(gòu)中所處的位置。大數(shù)據(jù)的應(yīng)用場景、設(shè)計(jì)思想,以及如何開發(fā)大數(shù)據(jù)的商業(yè)價(jià)值。
接著,課程由淺入深地介紹了Hadoop及其核心組件、Spark分布式計(jì)算框架與Scala語言。在此基礎(chǔ)上,課程詳細(xì)講解了建設(shè)大數(shù)據(jù)分析系統(tǒng)所需的各類系統(tǒng)及其開發(fā)實(shí)戰(zhàn),包括Sqoop, Hive, HBase, Kylin, ElasticSearch, Kafka, Flink以及Zookeeper。
課程最后,站在實(shí)戰(zhàn)的角度,講解了一個(gè)傳統(tǒng)分析型系統(tǒng)的大數(shù)據(jù)轉(zhuǎn)型過程:期初遇到哪些難題,解決的思路,以及整個(gè)轉(zhuǎn)型的過程。
目標(biāo)收益
培訓(xùn)對象
1、系統(tǒng)架構(gòu)師、系統(tǒng)分析師、高級程序員、資深開發(fā)人員。
2、牽涉到海量數(shù)據(jù)處理的機(jī)構(gòu)數(shù)據(jù)中心運(yùn)行、規(guī)劃、設(shè)計(jì)負(fù)責(zé)人。
3、云服務(wù)運(yùn)營服務(wù)提供商規(guī)劃負(fù)責(zé)人。
4、高校、科研院所牽涉到大數(shù)據(jù)與分布式數(shù)據(jù)處理的項(xiàng)目負(fù)責(zé)人。
課程大綱
第一單元 大數(shù)據(jù)分析處理技術(shù)與商業(yè)價(jià)值 |
什么是大數(shù)據(jù) 1.傳統(tǒng)的軟件架構(gòu) 1)傳統(tǒng)架構(gòu)的設(shè)計(jì)局限 2)用戶操作的三種類型 3)針對三種操作的優(yōu)化策略 4)基于讀寫分離的架構(gòu)設(shè)計(jì) 應(yīng)用案例:淘寶網(wǎng)的架構(gòu)設(shè)計(jì) 2.BI分析系統(tǒng) 1)OLTP vs. OLAP 2)面向主題的設(shè)計(jì)思想 3)數(shù)據(jù)倉庫與BI分析系統(tǒng) 4)基于傳統(tǒng)架構(gòu)的BI系統(tǒng)建設(shè) 5)基于大數(shù)據(jù)的BI系統(tǒng)建設(shè) 應(yīng)用案例:宏觀經(jīng)濟(jì)分析系統(tǒng)與中美貿(mào)易摩擦的分析 3.大數(shù)據(jù)分析系統(tǒng) 1)解決大并發(fā)問題的方案→讀寫分離→NoSQL數(shù)據(jù)庫 應(yīng)用案例:12306網(wǎng)站的余票查詢 2)解決海量數(shù)據(jù)收集與存儲→收集日志文件→分布式文件系統(tǒng) 應(yīng)用案例:用戶推薦系統(tǒng)的建設(shè) 3)數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)→豐富的分析工具→組建數(shù)據(jù)分析團(tuán)隊(duì) 應(yīng)用案例:企業(yè)征信平臺 大數(shù)據(jù)時(shí)代思維的變革 1.不是隨機(jī)樣本,而是全體數(shù)據(jù) 2.不是精確性,而是混雜性 3.不是因果關(guān)系,而是相關(guān)關(guān)系 大數(shù)據(jù)時(shí)代的商業(yè)價(jià)值 1.從最不可能的地方獲取數(shù)據(jù) 2.不再是數(shù)字化,而是數(shù)據(jù)化 1)文字變?yōu)閿?shù)據(jù) 2)方位變?yōu)閿?shù)據(jù) 3)溝通變?yōu)閿?shù)據(jù) 3.數(shù)據(jù)的思維創(chuàng)新 1)數(shù)據(jù)的再利用 2)數(shù)據(jù)的可擴(kuò)展 3)數(shù)據(jù)的折舊值 4)數(shù)據(jù)的開放性 4.大數(shù)據(jù)的商業(yè)應(yīng)用 1)大數(shù)據(jù)運(yùn)營 2)用戶行為分析 3)精準(zhǔn)營銷與推薦系統(tǒng) 4)風(fēng)險(xiǎn)控制與反欺詐 5)實(shí)時(shí)分析系統(tǒng) |
第二單元 Hadoop技術(shù)框架 |
Hadoop的發(fā)展歷程 1.Google的MapReduce 2.Google的Bigtable 3.Facebook的Cassandra 結(jié)論:Hadoop有效地降低了大數(shù)據(jù)門檻 Hadoop的設(shè)計(jì)理念 1.分布式并行計(jì)算 2.移動(dòng)計(jì)算而不是移動(dòng)數(shù)據(jù) 3.單點(diǎn)故障可容忍 Hadoop的生態(tài)圈 1.Hadoop核心組件:MapReduce,HDFS 2.Hadoop2.0 1)Yarn與Hue 2)Cloudera vs. Hortonworks 3.并行計(jì)算框架:Spark vs. MapReduce 4.在線查詢:HBase與Impala 5.流式計(jì)算:Storm vs. Spark Stream 6.文本索引:Solr vs. ElasticSearch 7.Zookeeper與高可靠架構(gòu) 8.Kafka分布式隊(duì)列與日志收集 9.數(shù)據(jù)挖掘工具:Mahout、SparkR與Spark ML |
第三單元 Hadoop核心組件 |
工作原理 1.HDFS的工作原理 2.MapReduce的工作原理 3.對工作原理的深度解讀 1)深度理解“移動(dòng)計(jì)算” 2)Hadoop的性能問題 3)Hadoop的優(yōu)勢與劣勢 MapReduce實(shí)戰(zhàn) 實(shí)戰(zhàn):編寫WordCount程序 實(shí)戰(zhàn):實(shí)現(xiàn)日志分析程序(Map only) 實(shí)戰(zhàn):實(shí)現(xiàn)數(shù)據(jù)關(guān)聯(lián)查詢 MapReduce的性能調(diào)優(yōu) 1.使用分布式緩存 2.處理文件的讀寫 3.Combiner, partitioner與order 4.重復(fù)使用變量原則 |
第四單元 Spark技術(shù) |
工作原理 1.Spark在Hadoop生態(tài)圈中的位置 2.Spark vs. MapReduce 3.Spark系統(tǒng)架構(gòu)與RDD 1)RDD的運(yùn)行原理 2)轉(zhuǎn)換/行動(dòng) 命令 3)名-值對RDD 案例:WordCount在Spark中的實(shí)現(xiàn) Spark編程 1.對RDD編程 1)轉(zhuǎn)換命令 2)行動(dòng)命令 2.對名-值對RDD編程 1)聚合/分組/連接/排序 2)優(yōu)化 3.數(shù)據(jù)裝載與保存 4.SparkSQL 案例:運(yùn)用Spark實(shí)現(xiàn)用戶資料的采集與展現(xiàn) Scala編程語言 1.Scala語言的編程特點(diǎn) 1)函數(shù)式編程風(fēng)格 2)交互式解釋器 2.Scala編程基礎(chǔ) 1)定義變量、函數(shù)、類與對象 2)定義數(shù)組、list、set、map、元組與循環(huán)體 3)If, switch及基本操作 4)異常處理及類的層次關(guān)系 3.函數(shù)式編程 1)類成員函數(shù)、局部函數(shù) 2)函數(shù)的簡化寫法與閉包 3)可變參數(shù)、命名參數(shù)、缺省參數(shù) 4)尾遞歸 4.組合與繼承 1)抽象類與抽象方法 2)重載成員函數(shù)與方法 Spark的測試與發(fā)布 1.Spark-shell 2.本地運(yùn)行調(diào)試 3.部署運(yùn)行分布式系統(tǒng) |
第五單元 大數(shù)據(jù)系統(tǒng)轉(zhuǎn)型 |
傳統(tǒng)分析系統(tǒng)向大數(shù)據(jù)轉(zhuǎn)型 1.傳統(tǒng)BI系統(tǒng)面臨的難題 1)團(tuán)隊(duì)大數(shù)據(jù)0基礎(chǔ) 2)要快速進(jìn)入市場 解決方案: 1)正確的技術(shù)選型降低門檻 2)演化式技術(shù)轉(zhuǎn)型 2.案例:一次稅務(wù)數(shù)據(jù)分析的演化式BI轉(zhuǎn)型過程 1)項(xiàng)目背景介紹 2)革命式大數(shù)據(jù)轉(zhuǎn)型的風(fēng)險(xiǎn) 3)漸進(jìn)式大數(shù)據(jù)轉(zhuǎn)型的思路 4)轉(zhuǎn)型過程中的技術(shù)選型思路 第一階段轉(zhuǎn)型:ETL過程的大數(shù)據(jù)轉(zhuǎn)型 大數(shù)據(jù)分析系統(tǒng)的整體架構(gòu) 1.傳統(tǒng)BI分析系統(tǒng)的設(shè)計(jì)套路 1)多維建模與數(shù)據(jù)倉庫 2)數(shù)據(jù)治理與ETL過程 2.大數(shù)據(jù)分析系統(tǒng)的架構(gòu)設(shè)計(jì) 1)大數(shù)據(jù)分析系統(tǒng)的技術(shù)選型 2)大數(shù)據(jù)分析系統(tǒng)的硬件配置 數(shù)據(jù)導(dǎo)入導(dǎo)出 1.sqoop工作原理 2.數(shù)據(jù)導(dǎo)入功能 1)導(dǎo)入成HDFS、Hive、HBase 2)增量導(dǎo)入 實(shí)戰(zhàn):數(shù)據(jù)導(dǎo)入的實(shí)戰(zhàn)應(yīng)用 3.數(shù)據(jù)導(dǎo)出功能 1)導(dǎo)出成HDFS、Hive、HBase 2)增量導(dǎo)出 實(shí)戰(zhàn):數(shù)據(jù)導(dǎo)出的實(shí)戰(zhàn)應(yīng)用 ETL過程 1.ETL的概念 2.Hive工作原理 3.Hive命令:創(chuàng)建表、導(dǎo)入數(shù)據(jù)、查詢數(shù)據(jù)、分區(qū) 4.Hive+SparkSQL的開發(fā)實(shí)戰(zhàn) 5.清洗、轉(zhuǎn)換、集成、裝載的應(yīng)用案例 數(shù)據(jù)查詢 1.離線分析、在線查詢與近線分析 2.NoSQL數(shù)據(jù)庫 1)分布式架構(gòu)CAP理論 2)BASE原則與弱一致性 3)NoSQL數(shù)據(jù)庫的特點(diǎn)與優(yōu)勢 3.HBase的工作原理 1)HBase的概念模型 2)HBase的物理模型 3)HBase的列式存儲 4)HBase的系統(tǒng)架構(gòu) 5)HBase存儲數(shù)據(jù)的特點(diǎn) 4.HBase的開發(fā)實(shí)戰(zhàn) 高可靠的架構(gòu)設(shè)計(jì) 1.Zookeeper的運(yùn)行原理 2.實(shí)戰(zhàn):Zookeeper實(shí)現(xiàn)高可靠的軟件架構(gòu) 第二階段轉(zhuǎn)型:建立ElasticSearch數(shù)據(jù)索引 數(shù)據(jù)索引 1.ElasticSearch的性能分析與特點(diǎn) 2.ElasticSearch的應(yīng)用實(shí)戰(zhàn) 1)建立ElasticSearch的Hive映射表 2)往ElasticSearch中寫入數(shù)據(jù) 3)用REST接口進(jìn)行海量數(shù)據(jù)秒級查詢 3.ElasticSearch應(yīng)用開發(fā)應(yīng)注意的問題 第三階段轉(zhuǎn)型:引入Kylin大數(shù)據(jù)多維建模 數(shù)據(jù)分析 1.多維數(shù)據(jù)建模 2.Kylin的工作原理 3.Kylin的開發(fā)實(shí)戰(zhàn) 1)Kylin的數(shù)據(jù)導(dǎo)入 2)建立數(shù)據(jù)模型 3)建立Cube 4)使用jdbc進(jìn)行數(shù)據(jù)查詢 4.Kylin的性能優(yōu)化 1)Kylin的數(shù)據(jù)膨脹率 2)強(qiáng)制索引、層級索引與組合索引 3)Kylin的增量導(dǎo)入腳本 第四階段轉(zhuǎn)型:深度大數(shù)據(jù)應(yīng)用 實(shí)時(shí)數(shù)據(jù)分析 1.批處理 vs. 實(shí)時(shí)分析 2.實(shí)時(shí)分析系統(tǒng)應(yīng)用實(shí)戰(zhàn) 1)Flink及其原理 2)Kafka及其原理 3)Kafka+Flink的應(yīng)用實(shí)戰(zhàn) 案例:用戶行為分析應(yīng)用舉例 數(shù)據(jù)挖掘與人工智能 1.數(shù)據(jù)挖掘算法及其原理 2.數(shù)據(jù)挖掘過程及其人員配置 3.SparkML簡介 案例:遠(yuǎn)程智慧醫(yī)療平臺的人工智能建設(shè)過程 |
第一單元 大數(shù)據(jù)分析處理技術(shù)與商業(yè)價(jià)值 什么是大數(shù)據(jù) 1.傳統(tǒng)的軟件架構(gòu) 1)傳統(tǒng)架構(gòu)的設(shè)計(jì)局限 2)用戶操作的三種類型 3)針對三種操作的優(yōu)化策略 4)基于讀寫分離的架構(gòu)設(shè)計(jì) 應(yīng)用案例:淘寶網(wǎng)的架構(gòu)設(shè)計(jì) 2.BI分析系統(tǒng) 1)OLTP vs. OLAP 2)面向主題的設(shè)計(jì)思想 3)數(shù)據(jù)倉庫與BI分析系統(tǒng) 4)基于傳統(tǒng)架構(gòu)的BI系統(tǒng)建設(shè) 5)基于大數(shù)據(jù)的BI系統(tǒng)建設(shè) 應(yīng)用案例:宏觀經(jīng)濟(jì)分析系統(tǒng)與中美貿(mào)易摩擦的分析 3.大數(shù)據(jù)分析系統(tǒng) 1)解決大并發(fā)問題的方案→讀寫分離→NoSQL數(shù)據(jù)庫 應(yīng)用案例:12306網(wǎng)站的余票查詢 2)解決海量數(shù)據(jù)收集與存儲→收集日志文件→分布式文件系統(tǒng) 應(yīng)用案例:用戶推薦系統(tǒng)的建設(shè) 3)數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)→豐富的分析工具→組建數(shù)據(jù)分析團(tuán)隊(duì) 應(yīng)用案例:企業(yè)征信平臺 大數(shù)據(jù)時(shí)代思維的變革 1.不是隨機(jī)樣本,而是全體數(shù)據(jù) 2.不是精確性,而是混雜性 3.不是因果關(guān)系,而是相關(guān)關(guān)系 大數(shù)據(jù)時(shí)代的商業(yè)價(jià)值 1.從最不可能的地方獲取數(shù)據(jù) 2.不再是數(shù)字化,而是數(shù)據(jù)化 1)文字變?yōu)閿?shù)據(jù) 2)方位變?yōu)閿?shù)據(jù) 3)溝通變?yōu)閿?shù)據(jù) 3.數(shù)據(jù)的思維創(chuàng)新 1)數(shù)據(jù)的再利用 2)數(shù)據(jù)的可擴(kuò)展 3)數(shù)據(jù)的折舊值 4)數(shù)據(jù)的開放性 4.大數(shù)據(jù)的商業(yè)應(yīng)用 1)大數(shù)據(jù)運(yùn)營 2)用戶行為分析 3)精準(zhǔn)營銷與推薦系統(tǒng) 4)風(fēng)險(xiǎn)控制與反欺詐 5)實(shí)時(shí)分析系統(tǒng) |
第二單元 Hadoop技術(shù)框架 Hadoop的發(fā)展歷程 1.Google的MapReduce 2.Google的Bigtable 3.Facebook的Cassandra 結(jié)論:Hadoop有效地降低了大數(shù)據(jù)門檻 Hadoop的設(shè)計(jì)理念 1.分布式并行計(jì)算 2.移動(dòng)計(jì)算而不是移動(dòng)數(shù)據(jù) 3.單點(diǎn)故障可容忍 Hadoop的生態(tài)圈 1.Hadoop核心組件:MapReduce,HDFS 2.Hadoop2.0 1)Yarn與Hue 2)Cloudera vs. Hortonworks 3.并行計(jì)算框架:Spark vs. MapReduce 4.在線查詢:HBase與Impala 5.流式計(jì)算:Storm vs. Spark Stream 6.文本索引:Solr vs. ElasticSearch 7.Zookeeper與高可靠架構(gòu) 8.Kafka分布式隊(duì)列與日志收集 9.數(shù)據(jù)挖掘工具:Mahout、SparkR與Spark ML |
第三單元 Hadoop核心組件 工作原理 1.HDFS的工作原理 2.MapReduce的工作原理 3.對工作原理的深度解讀 1)深度理解“移動(dòng)計(jì)算” 2)Hadoop的性能問題 3)Hadoop的優(yōu)勢與劣勢 MapReduce實(shí)戰(zhàn) 實(shí)戰(zhàn):編寫WordCount程序 實(shí)戰(zhàn):實(shí)現(xiàn)日志分析程序(Map only) 實(shí)戰(zhàn):實(shí)現(xiàn)數(shù)據(jù)關(guān)聯(lián)查詢 MapReduce的性能調(diào)優(yōu) 1.使用分布式緩存 2.處理文件的讀寫 3.Combiner, partitioner與order 4.重復(fù)使用變量原則 |
第四單元 Spark技術(shù) 工作原理 1.Spark在Hadoop生態(tài)圈中的位置 2.Spark vs. MapReduce 3.Spark系統(tǒng)架構(gòu)與RDD 1)RDD的運(yùn)行原理 2)轉(zhuǎn)換/行動(dòng) 命令 3)名-值對RDD 案例:WordCount在Spark中的實(shí)現(xiàn) Spark編程 1.對RDD編程 1)轉(zhuǎn)換命令 2)行動(dòng)命令 2.對名-值對RDD編程 1)聚合/分組/連接/排序 2)優(yōu)化 3.數(shù)據(jù)裝載與保存 4.SparkSQL 案例:運(yùn)用Spark實(shí)現(xiàn)用戶資料的采集與展現(xiàn) Scala編程語言 1.Scala語言的編程特點(diǎn) 1)函數(shù)式編程風(fēng)格 2)交互式解釋器 2.Scala編程基礎(chǔ) 1)定義變量、函數(shù)、類與對象 2)定義數(shù)組、list、set、map、元組與循環(huán)體 3)If, switch及基本操作 4)異常處理及類的層次關(guān)系 3.函數(shù)式編程 1)類成員函數(shù)、局部函數(shù) 2)函數(shù)的簡化寫法與閉包 3)可變參數(shù)、命名參數(shù)、缺省參數(shù) 4)尾遞歸 4.組合與繼承 1)抽象類與抽象方法 2)重載成員函數(shù)與方法 Spark的測試與發(fā)布 1.Spark-shell 2.本地運(yùn)行調(diào)試 3.部署運(yùn)行分布式系統(tǒng) |
第五單元 大數(shù)據(jù)系統(tǒng)轉(zhuǎn)型 傳統(tǒng)分析系統(tǒng)向大數(shù)據(jù)轉(zhuǎn)型 1.傳統(tǒng)BI系統(tǒng)面臨的難題 1)團(tuán)隊(duì)大數(shù)據(jù)0基礎(chǔ) 2)要快速進(jìn)入市場 解決方案: 1)正確的技術(shù)選型降低門檻 2)演化式技術(shù)轉(zhuǎn)型 2.案例:一次稅務(wù)數(shù)據(jù)分析的演化式BI轉(zhuǎn)型過程 1)項(xiàng)目背景介紹 2)革命式大數(shù)據(jù)轉(zhuǎn)型的風(fēng)險(xiǎn) 3)漸進(jìn)式大數(shù)據(jù)轉(zhuǎn)型的思路 4)轉(zhuǎn)型過程中的技術(shù)選型思路 第一階段轉(zhuǎn)型:ETL過程的大數(shù)據(jù)轉(zhuǎn)型 大數(shù)據(jù)分析系統(tǒng)的整體架構(gòu) 1.傳統(tǒng)BI分析系統(tǒng)的設(shè)計(jì)套路 1)多維建模與數(shù)據(jù)倉庫 2)數(shù)據(jù)治理與ETL過程 2.大數(shù)據(jù)分析系統(tǒng)的架構(gòu)設(shè)計(jì) 1)大數(shù)據(jù)分析系統(tǒng)的技術(shù)選型 2)大數(shù)據(jù)分析系統(tǒng)的硬件配置 數(shù)據(jù)導(dǎo)入導(dǎo)出 1.sqoop工作原理 2.數(shù)據(jù)導(dǎo)入功能 1)導(dǎo)入成HDFS、Hive、HBase 2)增量導(dǎo)入 實(shí)戰(zhàn):數(shù)據(jù)導(dǎo)入的實(shí)戰(zhàn)應(yīng)用 3.數(shù)據(jù)導(dǎo)出功能 1)導(dǎo)出成HDFS、Hive、HBase 2)增量導(dǎo)出 實(shí)戰(zhàn):數(shù)據(jù)導(dǎo)出的實(shí)戰(zhàn)應(yīng)用 ETL過程 1.ETL的概念 2.Hive工作原理 3.Hive命令:創(chuàng)建表、導(dǎo)入數(shù)據(jù)、查詢數(shù)據(jù)、分區(qū) 4.Hive+SparkSQL的開發(fā)實(shí)戰(zhàn) 5.清洗、轉(zhuǎn)換、集成、裝載的應(yīng)用案例 數(shù)據(jù)查詢 1.離線分析、在線查詢與近線分析 2.NoSQL數(shù)據(jù)庫 1)分布式架構(gòu)CAP理論 2)BASE原則與弱一致性 3)NoSQL數(shù)據(jù)庫的特點(diǎn)與優(yōu)勢 3.HBase的工作原理 1)HBase的概念模型 2)HBase的物理模型 3)HBase的列式存儲 4)HBase的系統(tǒng)架構(gòu) 5)HBase存儲數(shù)據(jù)的特點(diǎn) 4.HBase的開發(fā)實(shí)戰(zhàn) 高可靠的架構(gòu)設(shè)計(jì) 1.Zookeeper的運(yùn)行原理 2.實(shí)戰(zhàn):Zookeeper實(shí)現(xiàn)高可靠的軟件架構(gòu) 第二階段轉(zhuǎn)型:建立ElasticSearch數(shù)據(jù)索引 數(shù)據(jù)索引 1.ElasticSearch的性能分析與特點(diǎn) 2.ElasticSearch的應(yīng)用實(shí)戰(zhàn) 1)建立ElasticSearch的Hive映射表 2)往ElasticSearch中寫入數(shù)據(jù) 3)用REST接口進(jìn)行海量數(shù)據(jù)秒級查詢 3.ElasticSearch應(yīng)用開發(fā)應(yīng)注意的問題 第三階段轉(zhuǎn)型:引入Kylin大數(shù)據(jù)多維建模 數(shù)據(jù)分析 1.多維數(shù)據(jù)建模 2.Kylin的工作原理 3.Kylin的開發(fā)實(shí)戰(zhàn) 1)Kylin的數(shù)據(jù)導(dǎo)入 2)建立數(shù)據(jù)模型 3)建立Cube 4)使用jdbc進(jìn)行數(shù)據(jù)查詢 4.Kylin的性能優(yōu)化 1)Kylin的數(shù)據(jù)膨脹率 2)強(qiáng)制索引、層級索引與組合索引 3)Kylin的增量導(dǎo)入腳本 第四階段轉(zhuǎn)型:深度大數(shù)據(jù)應(yīng)用 實(shí)時(shí)數(shù)據(jù)分析 1.批處理 vs. 實(shí)時(shí)分析 2.實(shí)時(shí)分析系統(tǒng)應(yīng)用實(shí)戰(zhàn) 1)Flink及其原理 2)Kafka及其原理 3)Kafka+Flink的應(yīng)用實(shí)戰(zhàn) 案例:用戶行為分析應(yīng)用舉例 數(shù)據(jù)挖掘與人工智能 1.數(shù)據(jù)挖掘算法及其原理 2.數(shù)據(jù)挖掘過程及其人員配置 3.SparkML簡介 案例:遠(yuǎn)程智慧醫(yī)療平臺的人工智能建設(shè)過程 |