什么是數(shù)據(jù)
大數(shù)據(jù)(big data),指無(wú)法在一定時(shí)間范圍內(nèi)用常規(guī)軟件工具進(jìn)行捕捉、管理和處理的數(shù)據(jù)集合毅臊,
是需要新處理模式才能具有更強(qiáng)的決策力榕吼、洞察發(fā)現(xiàn)力和流程優(yōu)化能力的海量饿序、高增長(zhǎng)率和多樣化的信息資產(chǎn)
這里我們來(lái)認(rèn)真的看看數(shù)據(jù),什么是數(shù)據(jù)呢?
多維數(shù)據(jù)模型是為了滿足用戶從多角度多層次進(jìn)行數(shù)據(jù)查詢和分析的需要而建立起來(lái)的基于事實(shí)和維的數(shù)據(jù)庫(kù)模型羹蚣,其基本的應(yīng)用是為了實(shí)現(xiàn)OLAP(Online Analytical Processing)
- 數(shù)據(jù)立方體(data cube):
我們來(lái)看看什么是經(jīng)典書籍《數(shù)據(jù)挖掘:概念與技術(shù)》的相關(guān)介紹:
我想大家都或多或少了解過(guò)數(shù)據(jù)庫(kù)吧原探,傳統(tǒng)的mysql,postgresql顽素,sql server等咽弦。
大家可以想想這個(gè)立方體以傳統(tǒng)的sql語(yǔ)句建表會(huì)是怎么樣的呢?
CREATE TABLE `NewTable` (
`id` int(12) NOT NULL AUTO_INCREMENT ,
`address_id` int(12) NULL COMMENT '城市地址的id' ,
`Qtime` enum('4','3','2','1') NULL COMMENT '季度' ,
`item_id` int(5) NULL COMMENT '領(lǐng)域的id' ,
`val` int(10) NULL COMMENT '值' ,
PRIMARY KEY (`id`),
INDEX `address_id` (`address_id`) ,
INDEX `item_id` (`item_id`)
)
;
然后我們還要分別建立城市地址的id和領(lǐng)域的id的表胁出,是不很繁瑣~
然而我們?nèi)绻胢ongodb呢型型?
我們一條語(yǔ)句是不是就是
["address":"溫哥華","Qtime":"Q1","item":"安全","val":400]
這是典型的文檔存儲(chǔ),一般是json格式
對(duì)于這種 data cube還有key-value和xml和列儲(chǔ)存
前兩者大家肯定接觸過(guò)全蝶,對(duì)于列存儲(chǔ)我這里已hbase來(lái)大概寫一下建表語(yǔ)句:
hbase(main):001:0>create 'address-value','Qtime','item',{VERSIONS=>1,BLOCKCACHE=>true,BLOOMFILTER=>'ROW',COMPRESSION=>'SNAPPY'}
hbase(main):002:0>put 'address-value','溫哥華','Qtime:','Q1'
hbase(main):003:0>put 'address-value','溫哥華','item:safe','400'
hbase(main):004:0>put 'address-value','溫哥華','item:phone','14'
這個(gè)圖只展示了基本的兩種OLAP操作還有其他操作有時(shí)間大家研究下
- 上卷(roll-up):匯總數(shù)據(jù)
通過(guò)一個(gè)維的概念分層向上攀升或者通過(guò)維規(guī)約 - 下鉆(drill-down):上卷的逆操作
由不太詳細(xì)的數(shù)據(jù)到更詳細(xì)的數(shù)據(jù)闹蒜,可以通過(guò)沿維的概念分層向下或引入新的維來(lái)實(shí)現(xiàn)
上卷和下鉆如圖所示。 - 切片和切塊(slice and dice)
投影和選擇操作 - 轉(zhuǎn)軸(pivot)
立方體的重定位抑淫,可視化绷落,或?qū)⒁粋€(gè)3維立方體轉(zhuǎn)化為一個(gè)2維平面序列 - 鉆過(guò)(drill_across):執(zhí)行涉及多個(gè)事實(shí)表的查詢
- 鉆透(drill_through):鉆到數(shù)據(jù)立方體的底層,到后端關(guān)系表
標(biāo)準(zhǔn)的sql語(yǔ)句是入門大數(shù)據(jù)的必修課始苇,好多常用的架構(gòu)也是以sql作為主的砌烁,比如hive
可能有點(diǎn)夸張,對(duì)于一個(gè)sql的掌握的熟練程度決定于我們的起薪催式,但sql的確重要往弓,這里分享一個(gè)sql語(yǔ)句的執(zhí)行順序
sql的執(zhí)行順序:
(8)SELECT(9)DISTINCT(11)<top_num><select_list>
(1)FROM[left_table]
(3)<join_type>JOIN<right_table>
(2)ON<join_condition>
(4)WHERE<where_condition>
(5)GROUP BY<group_by_list>
(6)WITH<CUBE|RollUP>
(7)HAVING<having_condition>
(10)ORDER BY<order_by_list>
具體的大數(shù)據(jù)工具選擇
這里我們要做的事就是所有剛?cè)肼毜拇髷?shù)據(jù)rd為之奮斗的ETL
ETL(ETL,是英文 Extract-Transform-Load 的縮寫蓄氧,用來(lái)描述將數(shù)據(jù)從來(lái)源端經(jīng)過(guò)抽群啤(extract)、轉(zhuǎn)換(transform)喉童、加載(load)至目的端的過(guò)程)
恩撇寞,剛才我們提到hive,我們先說(shuō)說(shuō)這個(gè)
hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具堂氯,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表蔑担,并提供完整的sql查詢功能,可以將sql語(yǔ)句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行咽白。其優(yōu)點(diǎn)是學(xué)習(xí)成本低啤握,可以通過(guò)類SQL語(yǔ)句快速實(shí)現(xiàn)簡(jiǎn)單的MapReduce統(tǒng)計(jì),不必開(kāi)發(fā)專門的MapReduce應(yīng)用晶框,十分適合數(shù)據(jù)倉(cāng)庫(kù)的統(tǒng)計(jì)分析
hive -e "select * from XXX "這樣一句sql排抬,在后端轉(zhuǎn)換為MR程序懂从,使用起來(lái)極為方便的
對(duì)于具體的架構(gòu)選擇其實(shí)選擇很多,spark蹲蒲,hadoop等(后面進(jìn)階的還有storm等)
這里我們來(lái)實(shí)現(xiàn)下hello番甩,world級(jí)的程序Wordcount,就是統(tǒng)計(jì)一個(gè)文件中的單詞數(shù)届搁,十分經(jīng)典缘薛,我們用py,mapreduce,spark來(lái)分別實(shí)現(xiàn)。
- py
# -*- coding: utf-8 -*-
import sys
import os
from collections import Counter
from hdfs.hfile import Hfile
hfile = Hfile(hostname, port, path, mode='r')
try:
all_the_text = hfile.read()
finally:
exit(1)
count = Counter(word.lower()
for line in all_the_text
for word in line.strip().split()
if word)
for word,count in count.items():
sys.stdout.write(word)
sys.stdout.write("\t")
sys.stdout.write(str(count))
sys.stdout.write("\n")
py處理簡(jiǎn)單的ETL顯得游刃有余卡睦,配合supervise和crontab宴胧,也可以基本實(shí)現(xiàn)各種任務(wù)(同理其他腳本語(yǔ)言)
- mapreduce:
import .....
public class WordCount
{
public static class Map extends MapReduceBase implements
Mapper<LongWritable, Text, Text, IntWritable>
{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value,
OutputCollector<Text, IntWritable> output, Reporter reporter)
throws IOException
{
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens())
{
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
}
public static class Reduce extends MapReduceBase implements
Reducer<Text, IntWritable, Text, IntWritable>
{
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output, Reporter reporter)
throws IOException
{
int sum = 0;
while (values.hasNext())
{
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception
{
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount"); //設(shè)置一個(gè)用戶定義的job名稱
conf.setOutputKeyClass(Text.class); //為job的輸出數(shù)據(jù)設(shè)置Key類
conf.setOutputValueClass(IntWritable.class); //為job輸出設(shè)置value類
conf.setMapperClass(Map.class); //為job設(shè)置Mapper類
conf.setCombinerClass(Reduce.class); //為job設(shè)置Combiner類
conf.setReducerClass(Reduce.class); //為job設(shè)置Reduce類
conf.setInputFormat(TextInputFormat.class); //為map-reduce任務(wù)設(shè)置InputFormat實(shí)現(xiàn)類
conf.setOutputFormat(TextOutputFormat.class); //為map-reduce任務(wù)設(shè)置OutputFormat實(shí)現(xiàn)類
/**
* InputFormat描述map-reduce中對(duì)job的輸入定義
* setInputPaths():為map-reduce job設(shè)置路徑數(shù)組作為輸入列表
* setInputPath():為map-reduce job設(shè)置路徑數(shù)組作為輸出列表
*/
FileInputFormat.setInputPaths(conf, hdfs://XXX/XXX);
FileOutputFormat.setOutputPath(conf, new Path(hdfs://XXX/XXX));
JobClient.runJob(conf);
}
}
我在百度實(shí)習(xí)的時(shí)候,Hadoop在百度主要用于如下場(chǎng)景:
- 搜索日志的存儲(chǔ)和統(tǒng)計(jì)(如百度自身視屏的點(diǎn)擊量表锻,阿拉丁的和普通結(jié)果的分布);
- 分行業(yè)業(yè)務(wù)的維度聚合和分析;
- 用戶網(wǎng)頁(yè)的聚類牺汤,分析用戶的推薦度及用戶之間的關(guān)聯(lián)度。
大家總說(shuō)spark是未來(lái)浩嫌,但百度還是以hadoop為主,說(shuō)明hadoop還是有一定的市場(chǎng)
hadoop適用于
數(shù)據(jù)密集型并行計(jì)算:數(shù)據(jù)量極大补胚,但是計(jì)算相對(duì)簡(jiǎn)單的并行處理
如:大規(guī)模Web信息搜索
計(jì)算密集型并行計(jì)算:數(shù)據(jù)量相對(duì)不是很大码耐,但是計(jì)算較為復(fù)雜的并行計(jì)算
如:3-D建模與渲染,氣象預(yù)報(bào)溶其,科學(xué)計(jì)算
但hadoop不適用于流式數(shù)據(jù)的計(jì)算骚腥,也不適用于小而重復(fù)的數(shù)據(jù)(需要狀態(tài)緩存等)
- spark
spark:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object WordCount {
def main(args: Array[String]) {
//載入sparkconf
val conf = new SparkConf().setAppName("WordCount")
val sc = new SparkContext(conf)
val inputFile = "hdfs://XXX/XXX"
val textFile = sc.textFile(inputFile)
//讀取文件
val result = textFile.flatMap(line => line.split(",")).map(word => (word,1)).reduceByKey(_+_)
result.collect().foreach(println)
sc.stop()
}
}
可以看到我們的spark的代碼十分簡(jiǎn)單。由于scala是函數(shù)試編程的語(yǔ)言(當(dāng)然也是OOP的),
saprk的核心是rdd瓶逃,可以說(shuō)所有的操作都基于rdd(Resilient Distributed Datasets,彈性分布式數(shù)據(jù)集)分為transformations 和 actions兩類操作
當(dāng)用戶對(duì)一個(gè)RDD執(zhí)行action(如count 或save)操作時(shí)束铭, 調(diào)度器會(huì)根據(jù)該RDD的lineage,來(lái)構(gòu)建一個(gè)由若干階段(stage) 組成的一個(gè)DAG(有向無(wú)環(huán)圖)以執(zhí)行程序
在配著spark強(qiáng)大的模塊厢绝,如spark sql契沫,spark streaming,MLlib昔汉,graphX等懈万,spark如虎添翼
大家有興趣想真正了解spark,我這有個(gè)pdf靶病,講的十分詳細(xì)会通,也比較適合入門,下來(lái)記得向我要哈
可以看到一個(gè)需求是有很多種解決方案的呢娄周,那么我們接到一個(gè)需求我們應(yīng)該怎樣選擇一個(gè)合適的架構(gòu)來(lái)實(shí)現(xiàn)呢涕侈?
這個(gè)講起來(lái)太復(fù)雜,我推薦兩篇文章
http://blog.csdn.net/poisions/article/details/51120172
http://developer.51cto.com/art/201601/504722.htm
我這里再介紹下ELK:
- ELK:
E:Elasticsearch是一個(gè)實(shí)時(shí)的分布式搜索和分析引擎煤辨,它可以用于全文搜索裳涛,結(jié)構(gòu)化搜索以及分析,java語(yǔ)言編寫
L:Logstash 是一個(gè)具有實(shí)時(shí)渠道能力的數(shù)據(jù)收集引擎木张。使用 Ruby 語(yǔ)言編寫
K:Kibana 是一款基于 Apache 開(kāi)源協(xié)議,使用 JavaScript 語(yǔ)言編寫调违,為 Elasticsearch 提供分析和可視化的 Web 平臺(tái)
大家可以看看我的另一篇blog窟哺,這是我簡(jiǎn)單在自己PC上搭建的,開(kāi)箱即用技肩,搭建十分簡(jiǎn)單且轨,目前這個(gè)美團(tuán)酒店,機(jī)票監(jiān)控虚婿,360手游大廳監(jiān)控旋奢,stackoverflow基礎(chǔ)服務(wù)監(jiān)控,facebook等中外公司監(jiān)控都在使用哦
我再推薦自然語(yǔ)言處理最基本的分詞工具
對(duì)于中文的分詞然痊,我還是推薦py的jieba
- 模式多至朗,全模式,精確模式剧浸,搜索引擎模式锹引,新詞模式
- 添加自定義詞典
- 詞性標(biāo)注
- 并行分詞
- 等等。唆香。
當(dāng)然分布式的架構(gòu)還原不止這些嫌变,我們要做的就是找符合公司,業(yè)務(wù)需求的就好~
機(jī)器學(xué)習(xí)
下面我們進(jìn)行一個(gè)比較燒腦的話題躬它,機(jī)器學(xué)習(xí)腾啥,深度學(xué)習(xí),神經(jīng)網(wǎng)絡(luò)(主要介紹機(jī)器學(xué)習(xí))這個(gè)現(xiàn)在是互聯(lián)網(wǎng)后半場(chǎng)的靈魂所在冯吓,好不夸張的說(shuō)這是互聯(lián)網(wǎng)的核心競(jìng)爭(zhēng)力,這個(gè)我也是摸著石頭過(guò)河倘待,各位我們一起討論下,作為學(xué)弟學(xué)妹组贺,你們的概率論凸舵,線性代數(shù),高等數(shù)學(xué)一定比我好的多失尖,恭喜你們成功了一半
那個(gè)我們來(lái)看個(gè)大家最關(guān)心的東西:
https://m.lagou.com/jobs/2805052.html
這個(gè)是騰訊OMG的spark工程師招聘贞间,我們看看這段話
精通Scala語(yǔ)言,對(duì)Scala原理雹仿、底層技術(shù)有深入研究者優(yōu)先增热; 有MLlib/mahout開(kāi)發(fā)經(jīng)驗(yàn)者優(yōu)先; 熟悉聚類胧辽、分類峻仇、回歸,LR邑商,SVM等機(jī)器學(xué)習(xí)算法者優(yōu)先
這里的聚類摄咆、分類凡蚜、回歸,LR吭从,SVM都是機(jī)器學(xué)習(xí)的不同分類
為什么說(shuō)這個(gè)燒腦呢朝蜘,我們先講講machine learning的基礎(chǔ),最小二乘法涩金,這里基本是數(shù)學(xué)的世界了谱醇,由于實(shí)在不好寫公式,我們分享一篇文章
http://blog.csdn.net/lotus___/article/details/20546259
這篇文章講的還比較通俗易懂步做,真心的副渴,這個(gè)的確抽象,不過(guò)代碼是c++全度,對(duì)于ML煮剧,我還是極力推薦py(當(dāng)然spark的MLlib還是要用scala)因?yàn)槭裁茨兀琾y中的scipy和numpy不吹不黑将鸵,可以和matlab一戰(zhàn),最小二乘法最簡(jiǎn)單粗暴的應(yīng)用就是線性回歸曲線的擬合了勉盅,下面我給出一段(數(shù)據(jù)來(lái)源高中女生的身高和體重,別問(wèn)我怎么來(lái)的)
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from scipy.optimize import leastsq
from sklearn.linear_model import LinearRegression
from scipy import sparse
import numpy as np
def func(a, x):
k, b = a
return k * x + b
# 殘差
def err(a, x, y,s):
print s
return func(a, x) - y
font = FontProperties()
plt.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問(wèn)題
plt.figure()
plt.title(u' the girls data ')
plt.xlabel(u'wight')
plt.ylabel(u'height ')
plt.axis([40, 80, 140, 200])
plt.grid(True)
x = np.array([48.0, 57.0, 50.0,54.0, 64.0, 61.0, 43.0, 59.0])
y = np.array([165.0, 165.0,157.0, 170.0, 175.0, 165.0, 155.0, 170.0])
plt.plot(x, y, 'k.')
param = [0, 0]
s = "the number of use function err "
var= leastsq(err, param, args=(x, y,s))
k, b = var[0]
print k, b
plt.plot(x, k*x+b, 'o-')
plt.show()
這段代碼安裝過(guò)import的所有依賴即可直接執(zhí)行顶掉,效果一目了然草娜,這里我給出結(jié)果吧
linear_regression.png
這里重點(diǎn)來(lái)了(敲黑板~),機(jī)器學(xué)習(xí)的架構(gòu),框架很多如
python :sklearn
spark :MLlib
google:TensoFlow等
但這些框架都是高度封裝一喘,上面代碼就一句話管用
var= leastsq(err, param, args=(x, y,s))
還有一個(gè)py代碼是不借助sklearn.linear_model import LinearRegression的,感興趣的記得下來(lái)向我要嗜暴,是我自己摸著石頭過(guò)河寫的~但不一定直觀凸克,代碼也不優(yōu)雅。
這是二階的闷沥,往往現(xiàn)實(shí)數(shù)據(jù)都是多階的萎战,這里我們就要搬出來(lái)矩陣了
我們分享一個(gè)這個(gè)blog,講的比較好~
http://blog.csdn.net/jairuschan/article/details/7517773/
所以我們要做的絕對(duì)不是套框架舆逃,而是了解這個(gè)模型蚂维,理解其中的核心算法和數(shù)學(xué)原理,這還是很難度的
我們?cè)诜窒硪粋€(gè)樸素貝葉斯的spark MLlib實(shí)現(xiàn)路狮,看看概率論的重要性
在我的blog中:
http://www.reibang.com/p/f73286b2e7f0
還有很多算法虫啥,聚類,SVM奄妨,決策樹等涂籽,這里時(shí)間關(guān)系,等我研究差不多我們?cè)儆懻摴接下來(lái)我們補(bǔ)補(bǔ)理論砸抛,究竟機(jī)器學(xué)習(xí)是什么
機(jī)器學(xué)習(xí)分為兩種
監(jiān)督學(xué)習(xí):
再利用這個(gè)模型將所有的輸入映射為相應(yīng)的輸出评雌,對(duì)輸出進(jìn)行簡(jiǎn)單的判斷從而實(shí)現(xiàn)分類的目的树枫,
也就具有了對(duì)未知數(shù)據(jù)進(jìn)行分類的能力。
在人對(duì)事物的認(rèn)識(shí)中景东,我們從孩子開(kāi)始就被大人們教授這是鳥啊砂轻、那是貓啊、那是房子啊等等斤吐。
我們所見(jiàn)到的景物就是輸入數(shù)據(jù)搔涝,而大人們對(duì)這些景物的判斷結(jié)果(是房子還是鳥啊)就是相應(yīng)的輸出。
當(dāng)我們見(jiàn)識(shí)多了以后啸蜜,腦子里就慢慢地得到了一些泛化的模型窘问,這就是訓(xùn)練得到的那個(gè)(或者那些)函數(shù),
從而不需要大人在旁邊指點(diǎn)的時(shí)候抒痒,我們也能分辨的出來(lái)哪些是房子,哪些是鳥颁褂。
而無(wú)監(jiān)督學(xué)習(xí):
在于我們事先沒(méi)有任何訓(xùn)練樣本故响,而需要直接對(duì)數(shù)據(jù)進(jìn)行建模,
比如我們?nèi)⒂^一個(gè)畫展颁独,我們完全對(duì)藝術(shù)一無(wú)所知彩届,但是欣賞完多幅作品之后,
我們也能把它們分成不同的派別(比如哪些更朦朧一點(diǎn)誓酒,哪些更寫實(shí)一些樟蠕,即使我們不知道什么叫做朦朧派,
什么叫做寫實(shí)派靠柑,但是至少我們能把他們分為兩個(gè)類)寨辩。
還有半監(jiān)督學(xué)習(xí):
半監(jiān)督學(xué)習(xí)的基本設(shè)置是給定一個(gè)來(lái)自某未知分布的有標(biāo)記示例集 L={(x1, y1), (x2, y2), ..., (x|L|,y|L|)}以及一個(gè)未標(biāo)記示例集U = {x1’, x2’, ... , x |U|’},期望學(xué)得函數(shù)f: X→Y可以準(zhǔn)確地對(duì)示例x 預(yù)測(cè)其標(biāo)記y
無(wú)監(jiān)督學(xué)習(xí)里典型的例子就是聚類了。聚類的目的在于把相似的東西聚在一起歼冰,而我們并不關(guān)心這一類是什么靡狞。
因此,一個(gè)聚類算法通常只需要知道如何計(jì)算相似度就可以開(kāi)始工作了
監(jiān)督學(xué)習(xí)中隔嫡,如果預(yù)測(cè)的變量是離散的甸怕,我們稱其為分類(如決策樹,支持向量機(jī)等)腮恩,
如果預(yù)測(cè)的變量是連續(xù)的梢杭,我們稱其為回歸(線性回歸,邏輯回歸等)
深度學(xué)習(xí):
sigmoid函數(shù)秸滴,
f(z) = 1/1+exp(-z);
這是深度學(xué)習(xí)的基礎(chǔ)式曲。具體讓大家頭疼數(shù)學(xué)推導(dǎo),理論什么的我這里不展開(kāi)了(關(guān)鍵我也不熟,計(jì)算機(jī)中深度學(xué)習(xí)的工資最高吝羞,難度也隨之上來(lái)了)
大家可以參考http://www.cnblogs.com/cherler/p/3604720.html
機(jī)器學(xué)習(xí)能做什么
- 預(yù)測(cè)一封郵件是否是垃圾郵件
- 預(yù)測(cè)一筆信用卡交易是否是欺詐行為
- 預(yù)測(cè)哪種廣告最有可能被購(gòu)物者點(diǎn)擊
- 預(yù)測(cè)哪支球隊(duì)會(huì)贏得NBA大賽總冠軍
好多人問(wèn)機(jī)器學(xué)習(xí)究竟是在公司中如何應(yīng)用的呢兰伤,我說(shuō)句實(shí)話,在剛?cè)肼?,2年的階段钧排,敦腔,沒(méi)用,恨溜,但我們慢慢發(fā)現(xiàn)有些事情是我們的PM一開(kāi)始想不到的符衔,比如如何判斷一個(gè)用戶玩游戲是小號(hào)刷機(jī)還是普通用戶,這個(gè)是一般的邏輯程序無(wú)法判斷的糟袁,這是機(jī)器學(xué)習(xí)登場(chǎng)的時(shí)候了
還有個(gè)例子就是Alpha go的圍棋奇跡了判族,它本身并不懂圍棋規(guī)則,也并沒(méi)有輸入圍棋的規(guī)則(比如打吃项戴,托退定式等)形帮,它做的就是先學(xué)習(xí)200w份高手棋譜,然后自己和自己對(duì)決7000w盤(以上數(shù)據(jù)是google的一篇對(duì)外文章)周叮,然后你們說(shuō)它誰(shuí)下不過(guò)呢~
然后我想給出兩個(gè)大數(shù)據(jù)中經(jīng)典的問(wèn)題(有的依然待解決)
- 數(shù)據(jù)傾斜
數(shù)據(jù)傾斜帶來(lái)的直接后果就是
1.OOM(內(nèi)存溢出)
2.運(yùn)行速度慢,特別慢辩撑,非常慢,極端的慢
數(shù)據(jù)傾斜的原理很簡(jiǎn)單:在進(jìn)行shuffle的時(shí)候仿耽,必須將各個(gè)節(jié)點(diǎn)上相同的key拉取到某個(gè)節(jié)點(diǎn)上的一個(gè)task來(lái)進(jìn)行處理合冀,比如按照key進(jìn)行聚合或join等操作。此時(shí)如果某個(gè)key對(duì)應(yīng)的數(shù)據(jù)量特別大的話项贺,就會(huì)發(fā)生數(shù)據(jù)傾斜
數(shù)據(jù)傾斜分為兩種
1.一些null 和沒(méi)有用的數(shù)據(jù)君躺,直接過(guò)濾就行
2.有效數(shù)據(jù),業(yè)務(wù)導(dǎo)致的正常數(shù)據(jù)分布
- 隔離執(zhí)行开缎,將異常的key過(guò)濾出來(lái)單獨(dú)處理棕叫,最后與正常數(shù)據(jù)的處理結(jié)果進(jìn)行union操作。
- 對(duì)key先添加隨機(jī)值啥箭,進(jìn)行操作后谍珊,去掉隨機(jī)值治宣,再進(jìn)行一次操作急侥。
- 使用reduceByKey 代替 groupByKey
-
使用map join。
這就看出來(lái)groupByKey會(huì)導(dǎo)致一個(gè)task有過(guò)多的相同的key需要處理侮邀,因?yàn)間roupByKey接口不接收自定義函數(shù)坏怪,所以無(wú)法在第一個(gè)rdd上做action操作,導(dǎo)致只能全部到下一個(gè)stage處理
在機(jī)器學(xué)習(xí)中也存在一個(gè)頭疼的問(wèn)題(主要是在深度學(xué)習(xí)中)绊茧,梯度消失問(wèn)題铝宵,這個(gè)太深了,這里我就不展開(kāi)說(shuō)了,有興趣的同學(xué)可以看看這個(gè)
http://www.cnblogs.com/tsiangleo/p/6151560.html
然后有興趣深挖下
這里我再分享下前10大數(shù)據(jù)挖掘算法
- C4.5算法是機(jī)器學(xué)習(xí)算法中的一種分類決策樹算法,其核心算法是ID3算法
- k-means algorithm算法是一個(gè)聚類算法鹏秋,把n的對(duì)象根據(jù)他們的屬性分為k個(gè)分割k < n尊蚁。它與處理混合正態(tài)分布的最大期望算法很相似,因?yàn)樗麄兌荚噲D找到數(shù)據(jù)中自然聚類的中心侣夷。它假設(shè)對(duì)象屬性來(lái)自于空間向量横朋,并且目標(biāo)是使各個(gè)群組內(nèi)部的均 方誤差總和最小。
- SVM(Support Vector Machine)支持向量機(jī)
- priori算法是一種最有影響的挖掘布爾關(guān)聯(lián)規(guī)則頻繁項(xiàng)集的算法百拓。其核心是基于兩階段頻集思想的遞推算法
- EM:在統(tǒng)計(jì)計(jì)算中琴锭,最大期望(EM)算法是在概率模型中尋找參數(shù)最大似然 估計(jì)的算法
- PageRank這里的page不是網(wǎng)頁(yè)是拉里·佩奇,google的專利算法衙传,具體可以搜一下
- Adaboost是一種迭代算法决帖,其核心思想是針對(duì)同一個(gè)訓(xùn)練集訓(xùn)練不同的分類器(弱分類器),然后把這些弱分類器集合起來(lái)蓖捶,構(gòu)成一個(gè)更強(qiáng)的最終分類器 (強(qiáng)分類器)
- K最近鄰(KNN算法)分類算法地回,是一個(gè)理論上比較成熟的方法,也是最簡(jiǎn)單的機(jī)器學(xué)習(xí)算法之一
- NBC(樸素貝葉斯模型)是一種決策樹算法腺阳,發(fā)源于古典數(shù)學(xué)理論落君,對(duì)缺失數(shù)據(jù)不太敏感
- CART: 分類與回歸樹,在分類樹下面有兩個(gè)關(guān)鍵的思想亭引。第一個(gè)是關(guān)于遞歸地劃分自變量空間的想法绎速;第二個(gè)想法是用驗(yàn)證數(shù)據(jù)進(jìn)行剪枝
這里好多算法是值得我們好好研究的,說(shuō)實(shí)話這些算法你們要我詳細(xì)講解還是力不從心的焙蚓,留給大家自己研究
這天也不早了纹冤,下面說(shuō)說(shuō)我在"自學(xué)"大數(shù)據(jù)的心得吧
首先我們給出一個(gè)技術(shù)棧,我是從PHP起步的购公,所以我們的root節(jié)點(diǎn)是PHP萌京,左邊的為找工作或者說(shuō)是PHP rd的基本素養(yǎng),右邊為不同方向的拓展
由于本人是從PHPrd(rd即研發(fā))起步宏浩,所以py知残,java等后端語(yǔ)言同理
http://naotu.baidu.com/file/b6dad81eac8e0856ac251cf482b2a38e?token=04e85fa9c42d0ae8
大數(shù)據(jù)我自己把它分為兩種,ETL和Machine Learning
前者我推薦大家的學(xué)習(xí)方法是比庄,搞個(gè)spark求妹,hadoop(偽分布式)懶得話,里面有demo程序佳窑,勤快的話多看看別人blog制恍,這里書沒(méi)什么用。