本周主要讲大数据分析和处理,包含:
- hadoop 使用,map-reduce概念和使用
- spark与大数据处理
下面详细记录一下知识点:
hadoop
- HDFS 分布式文件系统
a. 主从结构,一个namenoe和多个datanode, 分别对应独立的物理机器
b. NameNode是主服务器,管理文件系统的命名空间和客户端对文件的访问操作。NameNode执行文件系统的命名空间操作,比如打开关闭重命名文件或者目录等,它也负责数据块到具体DataNode的映射
c. 集群中的DataNode管理存储的数据。负责处理文件系统客户端的文件读写请求,并在NameNode的统一调度下进行数据块的创建删除和复制工作。
d. NameNode是所有HDFS元数据的管理者,用户数据永远不会经过NameNode - MapReduce 并行计算框架
a. 主从结构,一个JobTracker和多个TaskTracker
b. MapReduce是由一个单独运行在主节点上的JobTacker和运行在每个集群从节点上的TaskTracker共同组成的。JobTacker负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上。
c. MapReduce模型原理是利用一个输入的key/value对集合来产生一个输出的key/value队集合,使用Map和Reduce函数来计算
d. MapReduce将大数据分解为成百上千小数据集,每个数据集分别由集群中的一个节点(一般是一台计算机)并行处理生成中间结果,后然这些中间结果又由大量的节点合并,形成最终结果 - echo "hello world">test1.txt
a. echo是指回显示,可以理解为print, 大于符(>)为重定向,正常echo是显示在屏幕上,而用了重定向后,即内容显示在了text1.txt文件里。那这句话意思是,创建一个test1.txt文件,其内容是"hello world"。 - 移动计算:
a. 程序自动分发到各hadoop结点上进行计算,然后通过一定机制把结果进行汇总最后返回出来,这称之为移动计算。显然,移动计算要比移动数据成本要低得多。 - google三驾马车:
a. 也就是在google在2003年到2004年公布了关于GFS、MapReduce和BigTable三篇技术论文,即google的三驾马车。
b. Hadoop的HDFS对就google的GFS,MapReduce对就google的MapReduce,Hadoop的HBase对应google的BigTable。
c. (注:HBase是其于hadoop开发的类似数据操作的软件)。 - 到现在hadoop的核心价值总算摸清了,一是分布式存储,二是移动计算。
spark :
- RDD:(非常适合机器学习)
a. 在Spark里,所有的处理和计算任务都会被组织成一系列Resilient Distributed Dataset(弹性分布式数据集,简称RDD)上的transformations(转换) 和 actions(动作)。
b. RDD是一个包含诸多元素、被划分到不同节点上进行并行处理的数据集合,可以将RDD持久化到内存中,这样就可以有效地在并行操作中复用(在机器学习这种需要反复迭代的任务中非常有效)。在节点发生错误时RDD也可以自动恢复。 - SparkContext是用来链接
- 使用sc.parallelize,你可以把Python list,NumPy array或者Pandas Series、Pandas DataFrame转成Spark RDD
- 初始化RDD方法2
a. 第2种方式当然是直接把文本读到RDD了
b. 你的每一行都会被当做一个item,不过需要注意的一点是,Spark一般默认你的路径是指向HDFS的,如果你要从本地读取文件的话,给一个file://开头的全局路径。(服务器的本地) - RDD transformation的那些事
a. map() 对RDD的每一个item都执行同一个操作
b. flatMap() 对RDD中的item执行同一个操作以后得到一个list,然后以平铺的方式把这些list里所有的结果组成新的list
c. filter() 筛选出来满足条件的item
d. distinct() 对RDD中的item去重
e. sample() 从RDD中的item中采样一部分出来,有放回或者无放回
f. sortBy() 对RDD中的item进行排序 - 比较炫酷的是,前面提到的Transformation,可以一个接一个地串联,
a. resultRDD = (numbersRDD # In parentheses so we can write each
b. .map(doubleIfOdd) # transformation in one line
c. .filter(lambda x: x > 6)
d. .distinct())
e. 要结果的话调用 resultRDD.collect() ---确认量级是否会爆掉 - RDD间的操作
a. rdd1.union(rdd2): 所有rdd1和rdd2中的item组合
b. rdd1.intersection(rdd2): rdd1 和 rdd2的交集
c. rdd1.substract(rdd2): 所有在rdd1中但不在rdd2中的item(差集)
d. rdd1.cartesian(rdd2): rdd1 和 rdd2中所有的元素笛卡尔乘积 - 特别注意:
a. Spark的一个核心概念是惰性计算。当你把一个RDD转换成另一个的时候,这个转换不会立即生效执行!!!
b. Spark会把它先记在心里,等到真的需要拿到转换结果的时候,才会重新组织你的transformations(因为可能有一连串的变换)
c. 这样可以避免不必要的中间结果存储和通信。
- RDD Actions
a. collect(): 计算所有的items并返回所有的结果到driver端,接着 collect()会以Python list的形式返回结果
b. first(): 和上面是类似的,不过只返回第1个item
c. take(n): 类似,但是返回n个item
d. count(): 计算RDD中item的个数
e. top(n): 返回头n个items,按照自然结果排序
f. reduce(): 对RDD中的items做聚合 - 有一个很有用的操作,我们试想一下,有时候我们需要重复用到某个transform序列得到的RDD结果。但是一遍遍重复计算显然是要开销的,所以我们可以通过一个叫做cache()的操作把它暂时地存储在内存中:
- 针对更复杂结构的transform和action
a. reduceByKey(): 对所有有着相同key的items执行reduce操作
b. groupByKey(): 返回类似(key, listOfValues)元组的RDD,后面的value List 是同一个key下面的
c. sortByKey(): 按照key排序
d. countByKey(): 按照key去对item个数进行统计
e. collectAsMap(): 和collect有些类似,但是返回的是k-v的字典
个人感悟:
本周进入hard模式,至少对我来说是。但同样也发现了很多有趣的东西,像map-reduce和HDFS,以前只是听过,但这次是详细的学习,发现分布式存储和分布式计算优势很大,而且以后互联网的发展,数据量会越来越大,能发现大数据背后的价值变得很重要,毕竟现在还有很多公司做的一些决策都是凭个人感觉来做的,如果换成base on data,进步空间会很大。
现在看来之前学的课程分成三个部分,都可以单独找工作了:
- python 爬虫工程师
- python 数据分析工程师
- hadoop ,spark大数据工程师
但是我的定位是机器学习中的图像处理领域,而且要成为图像处理领域的专才。上面列出这些也要会,同时了解它们原理和能使用。我也非常了解自己的能力范围,所以目前的原则就是“专注自己热爱的领域,同时严格按照老师的课程安排去学习和做练习,但不能太在意细节和钻牛角尖,跟上课程进度”
网友评论