大数据学习笔记1000条

  1. Zookeeper用于集群主备切换。
  2. YARN让集群具备更好的扩展性。
  3. Spark没有存储能力。
  4. Spark的Master负责集群的资源管理,Slave用于执行计算任务。
  5. Hadoop从2.x开始,把存储和计算分离开来,形成两个相对独立的子集群:HDFS和YARN,MapReduce依附于YARN来运行。
  6. YARN可以为符合YARN编程接口需求的集群提供调度服务。
  7. YARN:
    ResourceManager 一主多备
    NodeManager 一般与DataNode部署在一起。
  8. 单机硬件配置会严重影响集群的性能。
  9. 初始化集群机器环境:创建账号、安装JDK、设置时间同步。
  10. Zookeeper的部署最简单,其节点数必为奇数。
  11. ZK两个端口,前者是链接Leader后者是用于竞选。
  12. 部署Spark StandLone集群:
    1. SSH无密码登录
    2. 复制解压Spark
    3. 编写配置文件分发到所有节点
  13. Hadoop2.x以上支持双机热备。
  14. Standlone模式只支持简单的固定资源分配策略。
  15. YARN统一为集群上的所有计算负载分配资源,可以避免资源分配的混乱无序。
  16. Spark程序由Master还是YARN来调度执行,是由Spark程序在提交时决定的。
  17. YARN两种调度模式:
    Yarn-cluster 模式,用于生产
    Yarn-client 模式,用于交互
  18. Spark计算都是围绕RDD进行的。
  19. Spark在运行时,一般RDD操作会为每个RDD分区运行一个job。
  20. Job最简单的理解,它对应一个java线程。
  21. Spark所有基于文件的生产RDD方法,都支持目录、压缩文件和通配符。
  22. RDD是Spark的核心抽象,所有计算都围绕RDD进行。
  23. RDD操作分为两类:
    Transformation 转换
    Action 动作
  24. 所有Transformation都是Lazy模式,先记录计算方式,Driver返回结果时开始计算。
  25. RDD的Transformation实际计算只在Action返回结果时才进行,或者持久化。
  26. Spark严重依赖传递函数类型的参数。
  27. 从Driver分发各个节点过程:
    Job执行:
    1. 在Driver节点上序列化代码
    2. 传送至各个计算节点
    3. 在计算节点上反序列化
    4. 执行
  28. Scala function支持序列化。
  29. Spark的核心是RDD,而RDD是分布式计算的。
  30. Spark会将Job运行所有依赖的变量、方法、(闭包)全部打包在一起序列化。
  31. RDD操作的禁忌,不能嵌套调用。
  32. Action操作输出不再是RDD,返回值Driver程序。
  33. Spark集群上的资源主要是CPU core数量和物理内存。
  34. 在程序运行时,每个core对应一个线程。
  35. Standlone模式下由Spark集群中的master节点进行资源调度。
  36. Spark调度两类:
    1. spark程序见的调度(主)
    2. spark程序内部的调度
  37. 用户编写的spark程序称为Driver程序。
  38. 每个驱动程序都有一个SparkContext对象,担负着与集群沟通的职责。
  39. 集群管理器负责集群的资源调度。
  40. 执行器,每个spark程序在每个节点上启动的一个进程。
  41. 一次RDD Action对应一次job。
  42. Stage,job在执行过程中被分为多个阶段。
  43. Task,在执行器上执行的最小单位。
  44. Spark程序间的调度:
    静态分配 (主)
    动态分配
  45. 所有集群管理器都支持静态资源分配。
  46. 当spark为多用户服务时,需要配置spark程序内部的调度。
  47. 不同线程提交的job可以并行执行。
  48. 默认spark的调度器以FIFO方式运行Job。
  49. 公平调度还支持对多个Job进行分组,分组称为调度池。
  50. Spark性能优势,很大一部分原因是内存和缓存。
  51. RDD持久化可以多次利用,性能提高10倍以上。
  52. Spark提供两类共享变量——广播变量和计数器。
  53. 广播变量是一个只读变量,在所有节点上都是一份缓存。
  54. 计数器只能增加,用于技术和求和。
  55. 容错机制是分布式系统的一个重要能力。
  56. DAG:有向无环图的计算任务集合。
  57. 分布式系统经常需要做检查点。
  58. RDD也是一个DAG,每一个RDD都会记住创建该数据需要哪些操作——血统。
  59. RDD依赖:
    窄依赖 —— 父分区对应一个子分区
    宽依赖 —— 父分区对应多个子分区
  60. Spark提供了预写日志(journal),先将数据写入支持容错的文件系统中。
  61. Spark master容错:
    Standalone ——Zookeeper
    单点 ——本地重启
  62. Slave节点失效:
    1. Work异常停止
    2. 执行器异常停止
    3. Driver异常退出
  63. 监控管理:
    1. Web界面
    2. Metrics
    3. 外部系统
  64. Web界面:
    1. 调度器stage,Task列表
    2. RDD大小和内存文件统计情况
    3. 环境信息
    4. 正在执行的执行器信息
  65. Standlone模式的集群管理器有自己的web界面。
  66. Web界面表格的头部都支持点击排序。
  67. Spark程序一般都是由脚本bin/spark-submit来提交的。
  68. RDD特点:
    1. RDD是只读的
    2. RDD可指定缓存在内存中
    3. RDD可以通过重新计算得到
  69. RDD核心属性:
    1. 一个分区列表
    2. 一个依赖列表
    3. 一个名为compute的计算函数
    4. 分区器
    5. 计算各分区是优先的位置列表
  70. Action不可以在RDD Tranformation内部调用。
  71. Transformation只是建立在计算关系,而action才是实际的执行者——触发者
  72. Spark.local.dir用于shuffle。
  73. SparkContext是spark程序最主要的入口。
  74. 每个jvm只允许启动一个sparkContext。
  75. DAG是最高层级的调度,每个job对应一个DAG。
  76. RunJob,提交RDD Action 操作,是所有调度执行的入口。
  77. sparkContext在初始化时,创建了DAG调度与task调度来负责RDD Action操作的调度执行。
  78. 任务提交时,不是按Job的先后顺序提交的,而是倒序的。
  79. 仅对依赖类型是shuffle Dependency的RDD操作创建Stage。
  80. DAG在调度室,对于在相同节点上进行的Task计算会合并为一个Stage。
  81. 各stage之间以shuffle为分界线。
  82. Spark SQL是spark的一个子模块,专门用于处理结构化数据。
  83. Spark SQL的最大优势是性能非常高。
  84. Spark SQL与Apache Hive基本完全兼容。
  85. Spark SQL提供领域API,并且提供专门的数据结构抽象DataFrame。
  86. Spark SQL支持非常多的数据源:Hive、Avro、Jdbc、Json等,而且统一访问。
  87. Spark SQL两种使用:
    1. SQL引擎
    2. API 操作
  88. 分布式SQL引擎,两种运行方式:
    1. JDBC/ODBC Server
    2. Spark SQL 命令行
  89. Spark SQL相关的所有函数,都在SqlContext或它子类中。
  90. DataFrame创建:
    1. 使用反射的方法从RDD创建DataFrame
    2. 使用程序动态从RDD创建DataFrame
    3. 从其他数据源生产DataFrame
  91. DataFrame支持许多特殊的操作,称为领域编程语言或领域API。
  92. DataFrame注册成表,然后使用纯SQL来访问。
  93. Parquet是一种大数据计算中最常用的列式存储格式。
  94. 数据源类型的名称一般是全称。
  95. 优化是非常重要的环节,需要不断积累经验。
  96. Catalyst(催化剂)是Spark SQL执行有限优化器的代号,最核心部分。
  97. Catalyst最主要的数据结构是树。
  98. 所有优化都是基于规则的。
  99. Catalyst优化:
    1. 分析阶段
    2. 逻辑优化阶段
    3. 物理优化阶段
    4. 代码优化阶段
  100. Spark的性能基本上与数量大小保持线性关系。
  101. Spark Streaming接收实时数据,按日期将数据划分为成多批次(Batch),按批次提交个核心计算。
  102. Spark Streaming使用的数据抽象是DStream。
  103. DStream内部是连续的RDD序列。
  104. Sprak Streaming 3种输入DStream:
  105. 基本型
  106. 高级型
  107. 自定义
  108. 高级类型的输入DStream并不是由Spark提供。
  109. 使用数据源时,要注意可靠性。
  110. DStream操作:
  111. Transformation操作
  112. Output操作类似RDD Action
  113. Transform提供直接操作DStream内部RDD的方法。
  114. Spark Streaming提供专门的状态更新方法。
  115. 设置数据的滑动窗口,将数个原始DStream合并成一个窗口DStream。
  116. 窗口(Window)通过连个参数确定:1)窗口长度、2)滑动区间。
  117. Output操作将DStream结果输出到外部系统。
  118. DStream可以序列化到内存。
  119. 窗口函数和updateStateBykey默认会自动持久化。
  120. 网络按收数据,默认持久化两个节点上,保证容错。
  121. DStream基础属性:
  122. 依赖的在DStream列表
  123. 生产RDD的时间
  124. Complete计算函数
  125. RDD是只读的,可重复计算的分布式数据集。
  126. SparkStreaming大部分数据来自网络。
  127. 流式计算过程:
    输入数据流>>数据接收>>数据计算>>结果输出。
  128. 结果输出操作本身提供至少一次级别的容错性能。
  129. Spark提供了检查点功能,用户定期记录中间状态。
  130. 检查点是有代价的,需要存储数据至存储系统。
  131. Spark性能调优两个方向:
  132. 每个批次的处理时间尽可能短
  133. 收到数据后,尽可能快地处理
  134. Storm是开源免费的分布式实时计算系统。
  135. Storm的核心数据抽象是tuple,是命名的值列表。
  136. Spark Streaming粗粒度,storm更细粒度些。
  137. 核心数据抽象的不同导致计算模式上的本质却别。
  138. Weblog分析的典型的流式实时应用场景。
  139. ZK以Fast Paxos算法为基础。
  140. ZK在分布式系统中协作多任务。
  141. Hbase是一个通常与Hadoop一起使用的数据库。
  142. Kafka是一个基于发布-订阅模型的消息系统。
  143. Solr是一个企业级的搜索平台。
  144. ZK不适合用作海量数据存储。
  145. 分布式系统中的进程通信有两种选择:直接通过网络进行信息交换,或读写某些共享存储。
  146. ZK使用共享存储模型来实现应用间的协作和同步原语。
  147. 网络通信是分布式系统中并发设计的基础。
  148. 分布式系统需注意:
  149. 消息延迟 ——传输
  150. 处理器性能——计算
  151. 时钟偏移 ——时钟
  152. 数据中心通常使用大量统一的硬件。
  153. 主-从架构:主节点负责跟踪从节点状态和任务的有效性,并分配任务到节点。
  154. 主-从模式必解决三个关键问题:
  155. 主节点崩溃
  156. 从节点崩溃
  157. 通信故障
  158. ZK因故障出现连个及以上主节点称为脑裂(split-brain)。
  159. 主-从架构的需求:
  160. 主节点选举
  161. 崩溃检测
  162. 组成员关系管理
  163. 元数据管理
  164. ZK:Paxos算法和虚拟同步技术。
  165. Znode Zookeeper 操作和维护一个小型的数据节点。
  166. Znode类型决定了znode节点的行为方式。
  167. Znode节点分持久节点和临时节点。
  168. Znode4中类型:
  169. 持久化(persist)
  170. 临时的
  171. 持久有序的
  172. 临时有序的
  173. 通知机制是单次触发的操作。
  174. 每一个znode都有一个版本号,它随着每次数据变化而自增。
  175. ZK服务器端两种模式:1)独立模式、2)仲裁模式。
  176. 对ZK集合执行请求需要建立会话。
  177. 会话请求以FIFO顺序执行。
  178. 会话状态:
  179. Connecting
  180. Connected
  181. Closed
  182. Not connected
  183. Server两个端口,第一个用作通讯,第二个用于选举。
  184. ZK的API围绕ZK的句柄(handle)而构建。
  185. 为了从ZK接收通知,我们需要实现监视点(watcher)。
  186. 监视点和通知形成了一个通用机制。
  187. 当一个监视点被一个事件触发时,就会产生一个通知。
  188. Redis是一个内存数据库,基于键值对存储。
  189. Redis是REmoteDictionaryServer(远程字典服务器)简写。
  190. Redis支持键值数据类型:
  191. 字符串类型
  192. 散列类型
  193. 列表类型
  194. 集合类型
  195. 有序集合类型
  196. 数据在Redis和程序中存储类似。
  197. Redis数据库中的所有数据都存储在内存中。
  198. Redis可以在一秒中读写上十万个键值(普通自己本)。
  199. Redis提供数据持久化到硬盘。
  200. Redis可用做缓存、队列系统。
  201. Redis可以为每个键设置生存时间,过时自动删除。
  202. Redis可以限定数据占用的最大内存空间。
  203. Redis还支持“发布/订阅”的消息模式。
  204. Redis支持阻塞式读取。
  205. Kill Redis 进程的PID也可正常退出,Redis有处理。
  206. 每个数据类型Redis-cli的展现结果都不同。
  207. Redis默认支持16个数据库,以数字命令。
  208. Redis不支持自定义数据库的名字,每个数据库以编号命名。
  209. Redis密码只有一个。
  210. FLUSH ALL 命令清空Redis所有数据。
  211. 一个Redis最好对应一个程序。
  212. Redis 0号数据库用于生产,1号数据库用于测试。
  213. Select n 切换数据库。
  214. Keys命令需要遍历Redis中的所有键,不建议生产用。
  215. Exict key 返回 1/0。
  216. Del key返回键值个数,不支持通配符。
  217. Type命名用来获取键值的数据类型。
  218. LPOSH命令的作用是指定列表型键中增加一个元素。
  219. Redis能存储任何形式的字符串。
  220. Redis INCR命令让当前键值递增。
  221. 原子操作取“原子”的“不可拆分”的意思,最下执行单元。
  222. Redis数据类型不支持数据类型嵌套。
  223. 散列类型适合存储:使用对象类别和ID构成键名,使用字段表示对象属性。
  224. Redis不要求每个键都依据此结构存储。
  225. Hset命令用来赋值,Hget用于取值。
  226. Hset插入返回1,更新返回0。
  227. Hset命令用于散列类型,set用于字符串类型。
  228. Hmset处理多个字段。
  229. HgetAll所有字段和字段值。
  230. Hexists用于判断一字段是否存在。
  231. HsetNX key field value 当字段不存在时赋值。
  232. Hinrby key field increment 增加数字。
  233. Hdel key field 删除字段。
  234. 列表类型(List)可以存储一个有序的字符串列表。
  235. 列表类型内部是使用双向链表实现的。
  236. 借助列表类型,Redis还可以作为队列使用。
  237. 向列表两端增加元素:
    LPUSH KEY VALUE [. . .]
    PPUSH KEY VALUE[. . .]
    返回长度
  238. 从列表两端弹出元素:
    LPOP KEY
    RPOP KEY
  239. 获取列表中元素的个数 llen key。
  240. 获取列表中指定值:LREM KEY count value。
  241. Redis集合类型内部使用散列表实现的。
  242. 增加和删除元素:
    Sadd key member [. . .]]
    Srem key member [. . .]]
  243. Smembers命令返回集合中所有元素。
  244. 集合间运算:
  245. Sdiff key [key . . .] ——差集
  246. Sinter key [. . . ] ——交集
  247. Sunion . . . ——并集
  248. 有序集合是Redis最高级的类型。
  249. Redis中的事务是一组命令的集合。
  250. 事务:要么全执行,要么全不执行。
  251. Redis不支持回滚功能。
  252. Watch命令可以监控一个或多个键。
  253. Redis可以用expire命令设置一个键的过期时间。
  254. TTL命令查看剩余时间-2删除,-1永久。
  255. Persist取消过期。
  256. Redis可限制最大内存。
  257. LRU算法即“最近最少使用”。
  258. 有序集合常见的使用场景是大数据排序。
  259. 对有序集合类型排序是会忽略元素的分类。
  260. Sort默认按照从下到大排序,用desc逆序。
  261. Sort通过alpha参数实现按照字典,顺序排序非数字元素。
  262. Sort支持limit返回指定参数。
  263. 参考键值相同时,Redis会按照元素本身大小排序。
  264. 有个N个Get参数,每个元素返回的结果就有N行。
  265. Get会返回元素本身的值。
  266. Store参数常用来结合expire缓存排序结果。
  267. Sort是Redis中最强大最复杂的命令之一。
  268. 通知的过程可以借助任务队列来实现。
  269. 任务队列好处:1)松耦合,2)易于扩展。
  270. 当列表中没有元素BRPOP会一直阻塞住连接。
  271. BRPOP命令按收两个参数键名,超时时间,单位秒。
  272. 如果多个键都有元素则从左向右顺序取实现优先。
  273. 发布者发布消息的命令是PUBLISH。
  274. 订阅频道的命令是SUBSCRIBE,可用的多个订阅。
  275. 进入订阅状态后客户端可能收到了3种类型的恢复。
  276. PUSH SCRIBE命令订阅指定的规则。
  277. 客户端和Redis使用TCP协议连接。
  278. Redis的底层通信协议对管道提供了支持。
  279. 精简键名和键值是最直观的减少内存暂用的方式。
  280. 允许开发者使用LUA语言编写脚本传到Redis中执行。
  281. LUA脚本好处:1)减少网络开销、2)原子操作、3)复用。
  282. ——eval参数是告诉Redis-clli读取并运行后面的LUA脚本。
  283. LUA号称性能最高的脚本。
  284. LUA脚本很容易和C/C++交互。
  285. LUA是一个动态类型语言。
  286. 表类型是LUA语言中唯一的数据结构。
  287. 函数在LUA中是一等值。
  288. 全局变量只有Nil和非Nil的区别。
  289. 在Redis脚本中不能使用全局变量。
  290. 声明局部变量的方法为local变量。
  291. 多行注释:——[[ ]]。
  292. LUA支持多重赋值。
  293. LUA有5类操作符:
  294. 数学操作符
  295. 比较操作符
  296. 逻辑操作符
  297. 链接操作符
  298. 取长度操作符
  299. LUA if 语句 if .. then .. elseif ..then..else..end。
  300. LUA支持while,repeat和for循环语句。
  301. For语句中的循环变量是局部变量。
  302. LUA约定数组的索引从1开始。
  303. Paris是LUA内置的函数,实现类似迭代器的功能。
  304. Pairs用来遍历非数组的表。
  305. 函数的定义为:function(参数列表) 函数体 end。
  306. …实现可变参数。
  307. LUA中return和break用于跳出循环。
  308. 编写Redis脚本的目的就是读写Redis的数据。
  309. LUA脚本使用Redis,call函数调用Redis命令。
  310. EVALHA命令允许开发者通过脚本。
  311. Script kill命令可以终止当前脚本的运行。
  312. Redis支持两种方式的持久化,一种是RDB方式,另一种是AOF方式。
  313. Redis提供了复制(replication)功能,自动同步数据库。
  314. 在复制概念中,数据库分为两类:master/slave。
  315. Slave of 参数指向主数据库,进行同步数据。
  316. 通过复制可以实现读写分离,以提高服务器的负载能力。
  317. Master用于写,slave用于读,适合读多写收的场景。
  318. 哨兵的作用就是监控Redis系统的运行状态:
  319. 监控主/从是否正常
  320. 当出现故障时,从升为主
  321. 哨兵是一个独立的进程。
  322. 哨兵从独立进程的方式对一个主从系统进行监控。
  323. Redis 3.0版本支持集群。
  324. 生产环境运行时不能运行外界直连Redis。
  325. Bing 127.0.0.1只运行本机访问。
  326. Redis支持在配置文件中奖命令重命名。
  327. 如果希望直接禁用某个命令可以将命令重命名成XXX。
  328. Redis通信协议是Redis客户端与Redis间交流的语言。
  329. Redis两种通信协议:
  330. 二进制安全的统一请求协议
  331. telnet程序中输入的简单协议
  332. 哨兵提供了命令可以通过主数据库的名字获取当前系统的主数据库的地址和端口号。
  333. 一个哨兵可以同时监控多个Redis主从系统。
  334. 多个哨兵也可以同时监控同一个Redis主从系统。
  335. MapReduce两阶段:Map阶段和Reduce阶段。
  336. 每个阶段都以键值对作为输入和输出。
  337. Map阶段的输入时NCDN原始数据。
  338. 键是相对稳健起始位置的偏移量。
  339. Mapper类是一个泛型,四个参数:
  340. 输入键
  341. 输入值
  342. 输出键
  343. 输出值
  344. Hadoop本身提供了一套可优化网络序列化传输的基本类型:
    LongWritable 相对于 Java 的Long
    Text 相对于String
    IntWritable相对于Integer
  345. Map()方法提供了context实例用于输出内容的写入。
  346. Job对象指定作业执行规范。
  347. 构造Job对象后,需要指定输入和输出数据的路径。
  348. 在调试MapReduce作业时,知道作业ID和任务ID是非常有用的。
  349. 虚类相对接口更有利于扩展。
  350. MapReduce作业(Job)是客户端要执行的一个工作单元:它包括输入数据,MapReduce程序和配置信息。
  351. Hadoop将作业分成若干个小任务(Task)来执行,器中包括两类任务:Map和Reduce。
  352. 作业(Job)由一个Jobtracker及一系列tasktracker控制执行过程。
  353. Hadoop将MapReduce的输入数据划分成等长的小数据块称为“切片”。
  354. Hadoop为每一个切片构建一个map任务。
  355. 切片越细,负载平衡越好。
  356. HDFS的块大小默认是64MB。
  357. 数据本地化优化——输入数据在本地节点运行map。
  358. 数据通过网络传输到map任务节点,效率明显降低。
  359. Map任务将其输出写入本地硬盘,而非HDFS,因为map的输出是中间结果,Job完成自动删除。
  360. 单个reduce任务的输入通常来自于所有map的输出。
  361. 每个reduce任务的输入来自多个mao任务,所以中间过程称为shuffle(混洗)。
  362. Shuffle对总执行时间的影响非常大。
  363. 集群上的可用带宽限制了MapReduce作业的数量。
  364. Hadoop允许用户针对map任务的输出指定一个combiner。
  365. Combiner的规则制约值可用的函数类型。
  366. Combiner是通过Reducer类来定义的。
  367. Hadoop Streaming 使用Unix标准流作为Hadoop和应用程序之间的接口。
  368. Streaming天生适合用于文件处理。
  369. HDFS以流式数据访问模式来存储超大文件。
  370. 一次写入,多次读取是高效的访问模式。
  371. HDFS中的文件可能只有一个writer。
  372. HDFS的块大,目的为最小化寻址开销。
  373. HDFS集群有两类节点:管理者-工作者模式运行。
  374. Namenode管理文件系统的命名空间。
  375. 客户端代表用户通过与namenode和datanode交互。
  376. Datanode是文件系统的工作节点。
  377. 在联邦环境下每个namenode维护一个命名空间卷。
  378. HDFS的权限模式与POSIX非常相似。
  379. 用户空间文件系统允许整合式一个Unix系统。
  380. 从Hadoop文件系统读取文件,最简单使用Java.net.url。
  381. Filesystem是一个通用的文件系统API。
  382. Seek()方法是一个相对高开销的操作,需要慎重使用。
  383. Filestatus封装了文件系统中文件和目录的元数据。
  384. Hadoop通配符与Unix bach的相同。
  385. Hadoop无法自行定义网络拓扑结构。
  386. 文件系统的一致模型描述了文件读/写的数据可见性。
  387. HDFS提供了一个方法来使所有缓存与数据节点强行同步。
  388. HDFS中关闭文件其实还隐含执行syn()方法。
  389. Flume是一个将大规模数据导入HDFS的工具——典型应用从另外一个系统收集日志数据。
  390. Flume提供了不同数据级别的数据投递可靠性。
  391. Sqoop是将数据从结构化存储批量导入HDFS。——数据库。
  392. Distcp是作为一个MapReduce作业来实现的。
  393. 每个文件均按块方式存储,每个块的元数据存储在namenode的内存中。
  394. Hadoop存储小文件效率非常低。
  395. Hadoop存档文件可以使用MapReduce的输入。
  396. Hadoop自带一套原子操作用于数据I/O操作。
  397. HDFS会对写入的存储数据计算校验和,并在读取数据时验证校验和。
  398. Datanode负责在收到数据后存储该数据及其验证校验和。
  399. 客户端成功验证一个数据块后,datanode更新日志。
  400. Datanode定期验证所有数据块。
  401. Hadoop的LocalFile Systen执行客户端的校验和验证。
  402. 校验的计算代价是相当低的。
  403. LocalFileSystem通过checksumFileSystem来完成自己的任务。
  404. 文件压缩两大好处:存储和传输。
  405. 序列化两大领域常见:进程间通信和存储。
  406. Writable两个方法:dataoutput/datainput。
  407. RawComParator允许其实现直接比较数据流中的记录。
  408. Writable类对java基本类型提供封装。
  409. Text是针对URT-8序列的writable类。
  410. Text类的find()方法返回字节偏移量。
  411. 多数情况下需要将Text对象换成String对象。
  412. BytesWritable是对二进制数据数组的封装。
  413. NullWritable是writable的特殊类型,序列化长度为0.
  414. Nulwritable不读也不写,只当占位符。
  415. NullWritable可以用作在SequenceFile中的键。
  416. ObjectWritable是对Java基本类型的一个通用封装。
  417. 由于writable是MapReduce数据路径的核心,所有调整二进制表示对性能产生显著效果。
  418. 适当重写一个类,会更加适应我们的需求。
  419. IDL——接口定义语言。
  420. Avro是一个独立于编程语言的数据序列化系统。
  421. Avro模式通常用于Json来写,数据通常采用二进制格式来编码。
  422. Avro为序列化和反序列化提供了API。
  423. Avro数据文件时可切分的,适合MapReduce快速处理。
  424. Avro语言互相操作性。
  425. Avro定义了对象的排列顺序。
  426. Hadoop配置后添加的资源文件属性会覆盖之前定义的属性。
  427. MRUnit是一个测试库。
  428. 测试驱动程序:
  429. 使用本地作业运行器
  430. 使用一个mini集群来运行它
  431. Mini集群广泛应用于Hadoop自带的自动测试包中。
  432. Hadoop_CLASSPATH是一项客户端的设置。
  433. 为了启动作业,我们需要运行驱动程序。
  434. Job上的waitforCompletion()方法启动作业并检查进展情况。
  435. 作业ID的格式包含两部分:
  436. Jobtracker开始时间
  437. 唯一标识增量计数器
  438. 任务属于作业,任务ID通过替换作业ID的作业前缀为任务前缀,然后加上一个后缀表示哪个作业类的任务。
  439. Hadoop的web界面用来浏览作业信息。
  440. 作业历史包括已完成作业的时间和配置信息。
  441. 每个reducer产生一个输出文件。
  442. 最经典的调试方法,打印语句来调试程序。
  443. 任务页面包括一些看作业总任务细节的链接。
  444. 针对不同用户,Hadoop在不同的地方生产日志。
  445. Hadoop允许分析作业中的一部分任务。
  446. Jobcontrol的实例表示一个作业的运行图。
  447. Ooize中,工作流是一个有动作节点和控制节点组成的DAG。
  448. 每个工作都必须有一个start节点和一个end节点。
  449. Oozie提供了一组与工作流交互的函数。
  450. 工作流应用由工作流定义和所有运行所需的资源。
  451. 运行MapReduce作业:
  452. Job对象上的submit()
  453. Waitforcompletion()
  454. 客户端,提交MapReduce作业。
  455. Jobtracker,运行作业划分后的任务。
  456. Jobsummiter作业提交过程:
  457. 箱Jobtracker请求一个新的作业ID
  458. 检查作业的输出说明
  459. 计算作业的输入分片
  460. 将运行作业所需的资源复制到Jobtracker文件系统中。
  461. 告知Jobtracker作业,准备执行。
  462. 心跳 向Jobtracker表明tasktracker是否还存活。
  463. MapReduce 1 :
  464. 作业的提交
  465. 作业的初始化
  466. 任务的分配
  467. 任务的执行
  468. 进度和状态的更新
  469. 作业完成
  470. YARN (Yet Another Resource Negotiator)。
  471. YARN将Jobtracker的职能划分为多个独立的实体。
  472. YARN将两种角色划分为两个独立的守护进程:
  473. 资源管理器
  474. 应用管理器
  475. YARN设计的精妙之处在于不同的YARN应用可以在同一个集群共存。
  476. MapReduce确保每个reducer的输入都是按键排序的。
  477. 系统执行排序的过程称为shuffle。
  478. Shuffle属于不断被优化和改进的代码的一部分。
  479. Shuffle是MapReduce的“心脏”是奇迹发生的地方。
  480. 每个map任务都有一个环形内存缓冲区用于存储任务的输出。
  481. Hadoop设置作业配置参数作为streaming程序的环境变量。
  482. MapReduce模型将作业分解成任务,然而并行地运行任务。
  483. Hadoop MapReduce 使用一个提交协议来确保作业和任务都完成功或失败。
  484. Hadoop在他们自己的Java虚拟机上运行任务,以区别其他正在运行的任务。
  485. 计数器是收集作业统计信息的有效手段之一。
  486. Hadoop为每个作业维护若干内置计数器,以描述多项指标。
  487. 任务计数器由其任务维护,并定期发送给tasktracker再有tasktracker发送给Jobtracker。
  488. 作业计数器由Jobtracker维护。
  489. 计数器由一个java枚举(enum)类型来定义。
  490. 计数器是全局的。
  491. 排序是MapReduce的核心技术。
  492. MapReduce能够执行大型数据集键的“链接”操作。
  493. “边数据”是作业所需的额外的只读数据。
  494. RAID —— 磁盘阵列
  495. HDFS无需使用RAID的冗余机制。
  496. Hadoop部分代码需在Unix环境下执行。
  497. Namenode和Jobtracker最好分别放在不同机器中。
  498. Hadoop集群架构通常包含两级网络拓扑。
  499. 为了达到Hadoop的最佳性能,配置Hadoop系统以让其了解网络拓扑状况旧极为关键。
  500. HDFS和MapReduce可安装同一系统的不同位置。
  501. Hadoop控制脚本依赖SSH来执行针对整个集群的操作。
  502. 集群的每个Hadoop节点都各自保存一系列配置文件。
  503. Hadoop也支持为所有master和worker机器采用同一套配置文件。
  504. 为每一机器类维护单独的配置文件。
  505. 同步所有机器上的配置文件极具挑战性。
  506. Hadoop内置一些脚本来运行指令,在集群内启动和终止守护进程。
  507. MapReduce控制脚本不使用masters文件。
  508. Namenode在内存中保存整个命名空间中的所有文件元数据和块元数据。
  509. Hadoop为各个守护进程分配1GB内存。
  510. 在一个tasktracker上能够同时运行的任务数取决于一台机器有多少个处理器。
  511. Hadoop守护进程一般同时运行RPC和HTTP两个服务器。
  512. 各个datanode运行TCP/IP服务器以支持块传输。
  513. YARN是运行MapReduce的下一代架构。
  514. YARN有一个作业历史服务器和一个web应用程序代理服务器。
  515. YARN更加精细化管理内存。
  516. YARN守护进程运行一个或多个RPC和HTTP服务。
  517. Kerberos获取服务:
  518. 认证
  519. 授权
  520. 服务请求
  521. Hadoop使用委托令牌来支持后续认证访问。
  522. Whirr使用SSH与云端的机器通信。
  523. Pig为大型数据集的处理提供了更高层的抽象。
  524. Pig提供了一套更强大的数据变换操作。
  525. Pig Latin程序由一系列的操作式变换组成。
  526. Pig是一种探索大规模数据集的脚本语言。
  527. MapReduce的一个缺点是开发周期太长。
  528. Pig提供了多个命令来检查和处理程序中已有的数据结构。
  529. Pig被设计为可扩展的,处理路径中几乎每个部分都可以定制。
  530. Pig是作为一个客户端应用程序运行的。
  531. Pig两种模式:本地和MapReduce。
  532. Grunt是与Pig进行交互的外壳程序(shell)。
  533. 在MapReduce模式下,Pig翻译成MapReduce作业。
  534. Pig发布版本只和特定的Hadoop版本对应。
  535. 三种执行Pig程序方法:
  536. 脚本
  537. Grunt
  538. 嵌入式方法
  539. 创建一个精简的数据集是一门艺术。
  540. Pig Latin是一种数据流编程语言,而SQL是一种声明式编程语言。
  541. 一个Pig Latin程序由一组语句构成。
  542. Pig Latin并美欧正式的语言定义。
  543. 在Pig Latin程序执行时,每个命令按次序进行解析。
  544. Hive是一个构建在Hadoop上的数据仓库框架。
  545. Hive一般在工作站上运行。
  546. Hive把数据组织为表。
  547. 元数据(如表模式)存储在metastore数据库中。
  548. Hive外壳环境是我们交互的主要方式。
  549. HiveQL是Hive的查询语言。
  550. Hive操作表而Pig直接操作数据集。
  551. HiveQL大小写不敏感。
  552. 用-e选项在行嵌入命令,不用加分号。
  553. 在Hive的仓库目录中,表存储为目录。
  554. Metastore包含两部分:服务和后台数据的存储。
  555. 对于独立的metastore,mysql是一种很受欢迎的选择。
  556. Hive把表组织成“分区”。
  557. 桶为表加上了额外的结构。
  558. 每个桶就是表(分式)目录里的一个文件。
  559. Hive从两个维度对表的存储进行管理:行格式和文件格式。
  560. 视图是一种用select语句定义的“虚表”。
  561. Hbase是一个在HDFS上开发的面向列的分布式数据库。
  562. 数据模型:
  563. 应用把数据存放在带标签的表中
  564. 表中行的键也是字节数组
  565. 行中的列被分成“列族”
  566. 一个表的列族必须预先给出
  567. 所有列族成员都一起存放在文件系统中。
  568. HBase自动把表水平分成“区域”,每个区域由表中行的子集构成。
  569. HBase依赖于Zookeeper。
  570. HBase通过Hadoop文件系统API来持久化存储数据。
  571. HBase有Java开发。
  572. Hbase是一个分布式的,面向列的数据存储系统。
  573. HBase有一个高效的批量加载工具。
  574. Sqoop将结构化存储器抽取到Hadoop中。
  575. Sqoop有java开发。
  576. Hive不支持事务。
  577. Hive是最适合数据仓库应用程序的。
  578. Hive和Mysql提供的SQL方言最接近。
  579. Map操作会将集合中的元素从一种形式转换成另一种形式。
  580. MapReduce计算框架中的输入和输出的基本数据结构是键-值对。
  581. Hadoop神奇的一部分在于sort和shuffle过程。
  582. Hive驱动计算的“语言”是一XML形式编码的。
  583. Hive通过和Jobtracker通信来初始化MapReduce任务(Job)。
  584. Metastore(元数据存储)是一个独立的关系型数据库。
  585. Pig常用于ETL(数据抽取、数据转换、数据装载)。
  586. Hadoop团队通常会将Hive和Pig结合使用。
  587. Hive无法提供数据库特性(如行级别更新,快速查询响应和支持事务)。
  588. HBase的设计灵感来自goole的bigTable。
  589. HBase面向列存储,列组成列族。
  590. HBase对每个列保留多个版本。
  591. HBase使用HDFS来持久化存储数据。
  592. 将程序设计成驱动,比较方便移植。
  593. HBase没有提供SQL语言。
  594. Hadoop面向批处理系统。
  595. CLI是我们使用Hive的最常用方式。
  596. Jobtracker管理着Job,而HDFS则由namenode管理。
  597. 元数据存储中存储了表的模式和分区信息等元数据。
  598. Hive会将输出写到标准输出中。
  599. –e执行字符串包含的命令。
  600. –s去掉ok。
  601. –f执行文件。
  602. 如果查询中的表名和这个例子并不相关,我们有时候会使用src。
  603. 用户可以使用上下键来滚动查询历史命令。
  604. 用!执行bash shell命令。
  605. Hive Cli 可执行Hadoop的dfs命令。
  606. Hive本身提供了不同时区互相转换的内置函数。
  607. Hive中的列支持使用strct、map和arry集合数据类型。
  608. Hive中并没有键的概念。
  609. Hive不会再数据加载时进行验证,而是在查询时进行。
  610. Hive中数据库的概念本质上仅仅是表的一个目录式命名空间。
  611. Hive会为每个数据接库创建一个目录。
  612. 数据库的文件目录名是以.db结尾。
  613. Hive中并没有嵌套数据库的概念。
  614. Hive不允许用户删除一个包含有表的数据库。
  615. Hive会自动增加两个表属性:last_modified_by|last_modified_time。
  616. Hive总是将创建的表的目录放置在这个所属的数据库目录之后。
  617. Show tables命令可以列举出所有的表。
  618. 管理表(内布表)不方便和其他工作共享数据。
  619. Exte Nal告诉Hive这个表示外部表。
  620. Location 告诉Hive数据位于哪个路径下。
  621. 因为表示外部的,所以Hive并非人为其完全拥有这份数据。
  622. 有些Hive QL并不使用外部表。
  623. 分区字段,表现得旧和普通的字段一样。
  624. 对数据进行分区,也许最重要的原因是为了更快地查询。
  625. 通过show partitions命令查看表中存在的所有分区。
  626. Hive没有行级操作。
  627. Hive通常指定的路径应该是一个目录,而不是单独的文件。
  628. Hive要求源文件和目标文件以及目录应该在同一个文件系统中。
  629. 指定overwrite关键字,目标文件之前存在的会被删除。
  630. Hive并不会验证用户装载的数据和表的模式是否匹配。
  631. Hive会验证文件格式是否和表结构定义的一致。
  632. INSERT语句允许用户通过查询语句向目标表中插入数据。
  633. 静态分区键必须出现在动态分区键之前。
  634. Hive中没有临时表的概念。
  635. Select是sql中的射影算子。
  636. 可用正则来选举我们想要的列。
  637. Float和double相比较会出现问题。
  638. RLike可用正则指定匹配条件。
  639. Hive目前不支持on中的or。
  640. 视图可以允许保存一个查询并像对待表一样对这查询进行操作。
  641. Hive值有有限的索引功能。
  642. Bitmap索引普遍应用于排重后值较少的列。
  643. Hive中分区的功能是非常有用的。
  644. 每个task都是一个新的Jvm实例,都需要开启和销毁的开销。
  645. 分区提供一个隔离数据和优化查询的便遍历的方式。
  646. 分桶是将数据集分解或更容易管理的若干部分的另一种技术。
  647. Hive提供了serde抽象,其用于从输入中提取数据。
  648. 一个serDe通常是从左向右进行解析的。
  649. Hive提供了一个列式SerDe来以混合列式格式存储信息。
  650. Hive中通常使用“UDF”来表示任意的函数(用户自定义函数)。
  651. Streaming提供了另一种处理数据的方式。
  652. Hive中文件格式间具有明显的差异。
  653. Hive文本文件格式选择和记录格式是对应的。
  654. SequenceFile可以在块级别和记录级别进行压缩。
  655. 对于列式存储而言,进行压缩通常会非常高效。
  656. Hive功能强大的一个方面体现在不同的存储格式间转换数据非常地简单。
  657. SerD是序列化/反序列化的简写形式。
  658. Hive引擎使用定义的InputFormat来读取一行数据记录。
  659. Thrift是一个软件框架,其用于跨语言的服务开发。
  660. HiveServer使用Thrift提供服务。
  661. 存储处理程序是一个结合InputFormat、OutPutFormat、SerDe和Hive需要使用的特定的代码。
  662. 存储处理程序负责从底层存储系统中读取或写入数据。
  663. Hadoop起源于Apache Nutch的子项目。
  664. HBase弥补了Hadoop只能离线批处理的不足。
  665. HBase能够存储小文件,提供海量数据的随机检查。
  666. 大数据强调3v特征:即Volume(量级)、Varity(种类)和Velocity(速度)。
  667. 结构优化,质量提高,是一种实现实质性的跨越式的进程。
  668. NoSQL是Not only SQL,泛指非关系型数据库。
  669. NoSQL的实现具有两个特征:使用硬盘和把随机存储器作存储载体。
  670. NoSQL的Cache是记录级的,是一种粗粒度的Cache。
  671. NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
  672. HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库。
  673. HBase是NoSQL数据库。
  674. HBase可以通过行健(RowKey)检索数据,仅支持单行事务,主要用于存储非结构化和半结构化的松散数据。
  675. HBase的单表可以有百亿行,百万列。
  676. HBase是面向列的存储和权限控制,并支持列独立检索。
  677. HBase严重依赖Hadoop的HDFS组件。
  678. MapReduce可以直接访问HBase。
  679. HBase中最重要的访问方式是原生Java API。
  680. 客户端Client是整个HBase系统的入口。
  681. HMaster主要负责Table和Region的管理工作。
  682. HRegionServer主要负责响应用户I/O请求。
  683. HStore存储是HBase存储的核心。
  684. HStore两部分:Memstore和StoreFile。
  685. 当StoreFile文件增长到一定阀值,会触发CompCut。
  686. HBase的同一个表的记录可以有不一样的列。
  687. HBase中最基本的单元是列。
  688. 每一个行的行健是唯一的。
  689. HBase中的表有若干行,每行有很多列,列中的值有多个版本,每个版本的值称为一个单元格,单元格存不同的列值。
  690. HBase称为无模式数据库的原因是HBase的表没有列定义,没有类型。
  691. 创建连接是一项非常消耗资源的工作。
  692. HBase为我们提供了一个连接池。
  693. 行键是按字段排序由低到高存储在表中。
  694. HBase中行键是唯一的索引。
  695. HBase中的列族是一些列的集合。
  696. 一个列族中所有列成员有着相同的前缀。
  697. 一个列族的成员在文件系统上都是存储在一起的。
  698. 在创建表的时候至少指定一个列族。
  699. 修改列族要先停用表。
  700. HBase中的单元格由行键、列族、列、时间戳唯一确定。
  701. 单元格的内容是不可分别的字节数组。
  702. 每个单元格都保存着同一份数据的多个版本。
  703. 时间戳是64位的整数。
  704. HBase对数据模型4个操作包括:Get、Put、Scan和Delete。
  705. 多用户多线程对统一行的读写操作都不会影响该行数据的原子性。
  706. Get方法获取数据时,HBase返回的结果包含所有匹配的单元格数据。
  707. Result实例中包含列族、列限定符和时间戳等。
  708. Put操作要么向表增加新行,要么更新行。
  709. Put操作每次都会发起一次到服务器的RPC操作。
  710. HBase客户端有一个缓冲区,大大提高写入性能。
  711. HBase提供compare-and-set先检查,再执行。
  712. HBase没有update操作。
  713. Scan操作允许多行特定属性迭代。
  714. HBase的Delete操作可以指定删除某个列族或者某个列,或某时间更早的数据。
  715. HBase的Delete操作并不是真正地从磁盘删除数据。
  716. RowKey、Column、Version组合在一起称为HBase的一个单元格。
  717. Version用一个长整型表示(时间)。
  718. Get是在Scan的基础上实现的。
  719. 一个put操作会为一个Cell创建一个版本,默认使用当前时间戳。
  720. 删除操作的实现是创建一个墓碑标记。
  721. Get和Scan操作返回的是经过排序的数据。
  722. 返回的数据首选按行字典序排序,其次是列族、然后是列修饰符,最后的时间戳逆序。
  723. 获取列族的完整列名的唯一方法是处理所有行。
  724. HBase不支持连接查询,即Join查询。
  725. ICV(HBase计数器)操作发送在RegionServer上。
  726. 事务特性ACID,如HBase这种NoSQL数据库仅提供对行级别的原子性。
  727. HBase不是一个具备完整ACID特性的数据库。
  728. HBase中一个表的数据会被划分成很多的Region。
  729. 刚刚穿件的表只有一个Region。
  730. 每一个Region由一个RegionServer管理。
  731. 每个Region包含起始RowKey的记录,不包含结束RowKey的记录。
  732. Region的拆分与转移是由HBase自动完成。
  733. CAP原理是数据库软件的理论基础。
  734. HBase为了扩展性和性能考虑,弱化了事务性。
  735. RowKey是不可分割的字节数,按字典排序由低到高存储在表中。
  736. RowKey决定了访问HBase表时可以得到的性能。
  737. Region基于Rowkey为一个区间的行提供服务。
  738. Hfile在硬盘上存储有序的行。
  739. HBase只能在RowKey上建立索引。
  740. RowKey优化:
  741. 字典排序
  742. 进行散列
  743. 尽量短
  744. 列族是一些列的集合。
  745. 一个列族的所有列成员有着相同的前缀。
  746. 列族的前缀必须是可输出的字符。
  747. 列族必须在表建立的时候声明,列在用户随时可以创建。
  748. 在物理上,一个列族的成员在文件系统上都存储在一起。
  749. Flush和Compaction操作式针对一个Region的。
  750. 考虑Flush性能,列族数量越少越好。
  751. HFile数据块大小可以在列族层次设置。
  752. 数据块索引存储每个HFile数据块的起始键。
  753. 布隆过滤器(Bloom Filter)允许对存储在每个数据块的数据做一个反向测验。
  754. HFile可以被压缩并存放在HDFS上。
  755. HBase的每个单元格只维护三个时间版本。
  756. CRUD操作式HTable最基本的功能,其中的每类方法都包含多种实现。
  757. Java客户端有两种查询数据的方式:单行读和扫描读。
  758. 每类操作的不同实现方法应用在不同的场景下。
  759. HBaseAdmin类是HBase数据库的管理入口类。
  760. Scan类中的主要实现方法可以划分成三类:
  761. 添加列或列族
  762. 设置查询属性
  763. 查看属性信息
  764. 整个删除过程分为三步:
  765. 初始化Table实例
  766. 构造实体类Delete,Delete封装行键、列族或列名
  767. 执行删除
  768. HBase提供了若干封装类用于“无缝”连接MapReduce。
  769. 从HBase表汇总读取数据,使用MapReduce计算完成之后,将数据存储到其他介质中。
  770. NoSQL不使用SQL作为查询语言。
  771. 创建外部表适用于某表HBase已经存在,但在Hive中没有相关信息。
  772. 字符串类型是Redis中最基本的数据类型。
  773. 所有Redis命令都是原子操作。
  774. Redis提供了4个命令可以直接对二进制位进行操作。
  775. Redis是采用字典结构以键值对的形式存储数据的。
  776. 一个散列类型键可以包含至多2的32次方减去1个字段。
  777. 散列类型适合存储对象。
  778. 大数据所面对的问题是:一是存储,二是计算。
  779. 大数据的定义是发现潜在规律和趋势。
  780. 谷歌三大论文:1)GFS、2)MapReduce、3)BigTable。
  781. Hadoop是一个批处理系统,不擅长实时计算。
  782. YARN是通用的资源管理系统。
  783. 机器学习算法通常需要对同一个数据集合进行多次迭代计算。
  784. RDD弹性分布式数据集(Resillient Distributed DataSet)。
  785. Spark支持检查点(checkpoint)的容错机制。
  786. RDD支持的方法:
  787. 转换(Traansformation) ——生产新的RDD
  788. 动作(Action) ——返回一个非RDD
  789. Spark没有存储能力,仅做数据仓库。
  790. MapReduce依附于Yarn来运行。
  791. Zookeeper的节点必须是奇数个。
  792. Standalone模式下,集群可以容许某一个或多个工作节点失效。
  793. Hadoop:HDFS、MapReduce、YARN。
  794. Spark可以单独使用HDFS或YARN。
  795. 由YARN统一负载分配资源科避免分配混乱。
  796. Spark程序由master还是YARN来调度执行,是由spark程序在提交时决定的。
  797. 只有在交互需求是才使用yarn-client方式。
  798. 切片,本地模式默认去CPU的核算。
  799. 每个Job的执行,都会经历序列化,网络传输,反序列化和运行的过程。
  800. 在序列化是,spark会将Job运行所依赖的变量、方法(称为闭包)全部打包在一起。
  801. 如果RDD多次迭代,可将其持久化。
  802. 在Zookeeper模式下,恢复期间新任务无法提交。
  803. RDD特点:1)只读、2)可缓存、3)可以通过重新计算得到。
  804. Kafk是一个分布式、分区、重复提交的日志服务。
  805. Kafka掌管的类别消息叫做主题(topics)。
  806. 生产者发布消息到kafka主题中。
  807. 消费者订阅主题以及处理发布的消息。
  808. Kafka每个服务器叫做broker。
  809. 主题是一个类别或者被发布消息的名称。
  810. Kafka集群根据时间保留消息,而不是是否被消费。
  811. 消费者可以随时添加和移除。
  812. 生产者发布数据到他们选定的主题上。
  813. 消费者、消息处理通常有两种模式。:队列和发布-订阅。
  814. 在队列模式中,一组消费者可能从服务器读取消息,每个消息被其中一个消费者消费。
  815. 在发布-订阅模式中:消费者是广播到全部的消费者中。
  816. 消费者用一个消费组名称来标识自己。
  817. Kafka能够提供顺序保证并在一组消费者处理过程中均衡负载。
  818. Kafka可以替换传统的消息代理。
  819. Kafka可以媲美传统的消息系统例如:ActiveMQ和RabitMQ。
  820. Kafka通常用于操作监测数据的处理。
  821. Kafka作为日志聚合的一种解决方案。
  822. Zookeeper典型应用场景:配置文件的管理,集群管理,分布式队列,同步锁leader选举,队列管理等。
  823. Zookeeper是分布式服务框架。
  824. dataMonitor类是本程序Zookeeper逻辑的核心。
  825. Zookeeper是一个基于观察者模式设计的分布式服务管理框架。
  826. 分布式应用中通常需要有一套完整的命名规则。
  827. Netty高性能的NIO框架。
  828. Netty快速开发高性能,高可靠性的网络服务器和客户端程序。
  829. Netty是一个网络通信框架。
  830. NIO是一个面向块的I/O系统。
  831. NIO核心对象:缓冲区(Buffer),通道(Channel),选择器(Selecter)。
  832. 在NIO库中,所有数据都是用缓冲处理的。
  833. Netty是事件驱动的。
  834. Git是一个开源的分布式版本控制系统。
  835. Kafka系统的角色:
  836. Borker:一台kafka服务器就是一个broker。
  837. Topic:可以理解为一个MQ消息队列的名字。
  838. Java程序设计语言、虚拟机、API类库统称JDK。
  839. Jdk是用于支持Java程序开发的最小环境。
  840. JRE是支持Java程序运行的标准环境。
  841. Java技术体系可分为4个平台:Java Card、Me、Se、EE。
  842. Hadoop每个切片构建一个map任务。
  843. Map输出是中间结果,reduce产出最终输出结果。
  844. 集群上的带宽限制了MapReduce的作业的数量。
  845. HDFS中fsck指令可以显示块信息。
  846. Namenode之间需要通过高可用的共享存储实现编辑日志的共享。
  847. Datanode需要同时向连个namenode发送数据块处理报告。
  848. 超级用户是namenode进程的标识。
  849. Seek()方法是一个相对高开销的操作。
  850. FileSystem是一个通用的文件系统Api。
  851. HDFS只允许对一个打开的文件顺序写入,或者在现有文件的末尾追加数据。
  852. FileStatus封装了文件系统中问价和目录的元数据。
  853. 过滤器有path表示,只能作用域文件名。
  854. Hadoop无法自行第一网络拓扑结构。
  855. DFSoutputstream将写入分成一个个的数据包,并写入内部队列,称为“数据队列”。
  856. 文件系统的一致模型描述了文件读/写的数据可见性。
  857. HDFS为性能牺牲了一些Posix要求(可移植操作系统接口)。
  858. HDFS提供一个方法来使所有缓存与数据节点强行同步。
  859. Flume是一个将大规模流数据导入HDFS的工具。
  860. Flume节点允许以任何拓扑方式进行组织。
  861. 当一个字段中包含多个类型时,ObjectWritable非常有用。
  862. Avro是一个独立于编程语言的数据序列化系统。
  863. Avro模式通常用Json来写,数据通常采用二进制格式来编码。
  864. Avro数据文件时可切分的,适合MapReduce快速处理。
  865. SeQuenceFile是可以看做小文件的容器。
  866. MapFile是已经排序过的SequenceFile,它有索引,所以可以按键查找。
  867. Hadoop提供了钩子(hook)来辅助分析过程。
  868. Mini集群广泛应用于Hadoop自带的自动测试包中。
  869. 作业历史包括已完成作业的时间和配置信息。
  870. MapReduce任务日志可以从web界面访问。
  871. 复杂的作业通常是增加更多的作业,而不是增加作业的复杂度。
  872. Jobcontrol的实例表示一个作业的运行图。
  873. 在Ooize中,工作流是一个由动作(action)节点和控制流节点组成的DAG。
  874. Ooize提供了一组与工作流交互的函数。
  875. TaskRunner启动了一个新的Jvm里运行每个任务。
  876. YARN将Jobtracker的职能划分多个独立的实体。
  877. YARN集群上可以运行不同版本的MapReduce。
  878. 每个map任务都有一个环形内存缓存区用于存储任务的输出。
  879. 在本地作业运行器上运行时,只支持0个或1个reduce。
  880. 一个输入切片(split)就是一个由单个map操作来处理的输入块。
  881. 切片并不包含数据本身,而是指向数据的引用。
  882. Jobtracker使用其存储位置信息来调度map任务从而在tasktracker上处理这些切片数据。
  883. Reduce输入的键一定是有序的。
  884. Hadoop为每个作业维护若干内置计数器,以描述多项指标。
  885. 任务计数器由其关联任务维护,并定期发送给tasktracker,再有tasktracker发送给Jobtracker。
  886. “边数据”是作业所需的额外的只读数据。
  887. Hadoop还为mapper和reduce提供了一个包含了常用函数的库。
  888. Hadoop使用dfs。Mapred,rpc和jvm四个上下文根。
  889. FileContext将度量写到一个本地文件中。
  890. Ganglia是一个针对超大规模的开源的分布式监控系统。
  891. Hadoop包括多个托管bean(MBean),可以将hadoop度量发布给支持JMX的应用。
  892. Didtcp是一个理想的备份工具。
  893. HDFS能够容忍datanode故障,但这并不意味着允许随意终止datanode。
  894. Shell for((i0;i<n;i++))。
  895. Break n跳出几层循环。
  896. For I in {1 .. 4}。
  897. Unset 删除一个元素。
  898. Nohup 保持后台允许。
  899. ->覆盖,->>追加。
  900. 0、1、2标准输入正确,错误输出。
  901. Ls >/de/null 深渊。
  902. Linux默认无回收站。
  903. –e执行转义字符。
  904. Fsimage:元数据镜像文件。
  905. 目前HDFS不支持断点续传。
  906. 最后块不足够,则按实际打下存储。
  907. HAR是一个目录结构。
  908. Namenode两种状态:Active和standly。
  909. Namenode同步数据通过Journanodes集群。
  910. Namenode切换,自动和手工切换。
  911. MapReduce是分布式并行计算模型,用于解决海量数据问题。
  912. Hive操作流程:
  913. 提交SQL 交给驱动
  914. 驱动编译解析相关字段
  915. 去metastore查询相关信息
  916. 编译返回信息,发给驱动
  917. 驱动发一个执行计划
  918. DDLS对数据库表操作
  919. 吧Job交给Jobtracker让tasktracker执行
  920. 完成Job返回数据信息,找namenode查数据
  921. Dfs ops直接和namenode交互
  922. Hive dfs ls 查看hadoop系统。
  923. Hive无删除语句,用replace实现。
  924. Replace很危险,不建议使用。
  925. Hive删字段,大多数情况重建表。
  926. 桶表时对数据进行哈希取值,然后放到不同文件中存储。
  927. 桶表应用于抽样查询,加载文件分文件存储。
  928. 使用视图可以降低查询复杂度。
  929. 索引是对数记录偏移量。
  930. 分区字段字段建索引。
  931. 建索引会引发MapReduce计算。
  932. 装载数据:1)本地文件加载方式,2)查询装载。
  933. 动态分区加载方式。
  934. Hive是读模式。
  935. RDBMS是写模式。
  936. Hive不支持对单行操作,只支持覆盖和追加。
  937. 每个HStore对应了Table中的一个列族的存储。
  938. HStore是HBase存储的核心:HFile、memstore。
  939. HLog用于数据还原。
  940. HFile是不定长的。
  941. CSV是逗号分隔符的文件。
  942. Hive分析HBase,只要表映射即可。
  943. 列族优化:
  944. 随机查询:数据块越少,索引越大,占用内存也越大
  945. 顺序查询:更好的顺序扫描需要更大的数据块
  946. 布隆:有问题反馈,无问题不反馈。
  947. HBase删除数据时先标记合并删除。
  948. HBase热点优化,创建分区。
  949. Solr可以实现全文搜索。
  950. Solr可以方便实现站内搜索功能。
  951. Solr是通过http协议处理搜索和查询请求。
  952. Solr是一个索引库。
  953. 线性的访问磁盘,很多时候比随机访问内存块。
  954. Kafka将数据分段,为每个段建立索引。
  955. 索引分两部分:offset和position。
  956. Storm处理高频数据和大规模数据。
  957. Storm由用户自定义处流程。
  958. Stream ——一列火车。
  959. Tuple ——一节车厢。
  960. 数据 ——乘客。
  961. Bolt ——对tuple中数据进行处理 中间站。
  962. Spout ——源头,相当于火车的始发站。
  963. Toplogy ——轨道。
  964. Storm 主-从结构。
  965. 主节点:nimbus,负责分发代码,分配任务。
  966. 从节点:supervisor,负责产生worker,执行任务。
  967. Storm集群的运行依赖于Zookeeper。
  968. Executor是一个被worker进程启动的单独线程。
  969. Task是最终运行spout或bolt中代码的执行单元。
  970. Slots就是work进程。
  971. 将数据按类型分组。
  972. Storm流分组:1)随机 负载均衡,2)字段 类型分组。
  973. Work挂掉,storm会重新启动一个进程,数据不会丢失。
  974. Storm不支持HA(目前)。
  975. 每个work都有一个ack/fail确认机制。
  976. Trident是对storm进行封装的一个框架。
  977. ES也是对Luncene的封装,天生为分布式而生。
  978. ES基于Restful接口。
  979. Hadoop RPC调用是基于Probobuf实现的。
  980. Client protocol定义了所有由客户端发起的,由namenode响应的操作:
  981. HDFS文件读相关的操作
  982. HDFS文件写以及追加写的相关操作
  983. 管理HDFS命名空间(namenode)的相关操作
  984. 系统问题与管理相关的操作
  985. 快照相关操作
  986. 缓存相关操作
  987. 其他
  988. FileSystem:
  989. HDFS文件读操作
  990. HDFS文件写与追加操作
  991. 命名空间的管理操作
  992. DFSAdmin:对系统问题管理相关操作。
  993. 处于安全模式(safemode)中的namenode不接受客户端对命名空间的修改操作,只读。
  994. 刚刚启动的namenode直接自动进入安全模式。
  995. 必须在安全模式的两个操作:
  996. ‘-savenamespace’用于将整个命名空间保存到新的fsimage文件中
  997. ‘-rolledits’则会触发重置editlog文件
  998. Refreshnodes()方法会触发namenode刷新数据节点列表。
  999. Findizeupgrade()和rollingupgrade()操作都是与namenode升级相关。
  1000. 快照保存了一个实践点上HDFS摸个路径中所有数据的拷贝。
  1001. 快照可以将失效的集群回滚到之前一个正常的时间点上。
  1002. 创建快照之前,先开启目录的快照功能。
  1003. HDFS 2.3版本添加了集中式缓存管理功能:
  1004. Cache directive:表示要被缓存到内存的文件或目录
  1005. Cache pool:用于管理一系列的cache directive类似于命名空间
  1006. Datanode使用DatanodeProtocol接口与namenode握手注册,发送心跳进行全量以及增量的数据汇报。
  1007. DatanodeProtocol三种方法类型:
  1008. Datanode启动相关
  1009. 心跳相关
  1010. 数据块读写相关
  1011. Datnode启动操作会与namenode进行四次交互:
  1012. 与namenode握手
  1013. 注册上的datanode
  1014. 汇报数据块
  1015. 缓存所有数据块
  1016. 分布式系统的节点之间大多采用心跳维护节点的健康状态。
  1017. InterDatanodeProtocol(DN与DN之间接口),主要用于租约恢复操作。
  1018. 客户端打开一个文件进行写操作是,首先获取租约,并定期更新租约。
  1019. NamenodeProtocol定义了第二namenode与namenode之间的接口。
  1020. HDFS除了RPC调用还定义了流式接口(TCP/HTTP)。
  1021. Hadoop RPC不足以支持大文件读写。
  1022. HDFS客户端读取一个HDFS文件流程 :
  1023. 打开HDFS文件
  1024. 从namenode获取datanode地址
  1025. 连接到datanode读取数据块
  1026. 关闭输入流
  1027. 数据块的应答包中不仅包含了数据,还包含了校验值。
  1028. HDFS客户端写入一个HDFS文件的流程:
  1029. 创建文件
  1030. 建立数据流管道
  1031. 通过数据流管道写入数据
  1032. 关闭输入流并提交文件
  1033. HDFS追加文件流程:
  1034. 打开已有的HDFS文件
  1035. 建立数据流管道
  1036. 通过数据流管道写入数据
  1037. 关闭输入流并提交文件
  1038. 对于命名空间的一致性,两个namenode都需要与一组独立运行的节点(Journalnode,JNS)通信。
  1039. ZKFailovercontroller负责维护HA。
  1040. RPC(Remote Procedure Call protocol),远程过程调用协议。
  1041. Hadoop RPC框架底层采用Java NIO,Java动态代理以及protobuf等。
  1042. RPC框架:
  1043. 通信模块
  1044. 客户端stub程序
  1045. 服务器端stub程序
  1046. 请求程序
  1047. 服务程序
  1048. 客户端的stub可以看作是一个代理对象。
  1049. Hadoop RPC 框架的使用抽象:
  1050. 定义RPC协议
  1051. 实现RPC协议
  1052. 客户端获取代理对象
  1053. 服务端启动并构造RPC servers
  1054. Namenode:
  1055. 文件系统目录树管理
  1056. 数据块以及数据节点管理
  1057. 租约管理:namenode给予租约持有者在规定时间内拥有文件权限的合同
  1058. 缓存管理
  1059. Fsnamesystem
    Namenode的启动和停止
  1060. HDFS文件系统的命名空间是以/为根的整个目录树,是通过FSDirectory类来管理的。
  1061. HDFS中文件与目录都被当做系统目录树的一个INode节点。
  1062. HDFS会将命名空间保存到namenode的本地系统上一个叫fsimage的文件汇总。
  1063. FSDirectory维护者文件系统目录树的节点。
  1064. INode get方法:
  1065. Username
  1066. Groupnode
  1067. Fspermission
  1068. Allfeature:安全相关
  1069. Modification
  1070. Accesstime
  1071. Sattrfeature:扩展属性
  1072. HDFS的检查点机制会定时将editlog文件与fsimage文件合并以产生新的fsimage文件。
  1073. 非HA,检查点操作由secondary namenode来执行。
  1074. Namenode维护着HDFS中连个最重要的关系:
  1075. HDFS文件系统的目录树以及文件的数据块索引
  1076. 数据块和数据节点的对应关系
  1077. 当namenode发生错误并今夕了Active与standly切换时,多余的副本不能直接删除,先汇报再从队列中移除。
  1078. 数据块副本状态:
  1079. 正常副本
  1080. 损坏副本
  1081. 多余副本
  1082. 等待删除副本
  1083. 等待删除副本
  1084. 等待复制副本
  1085. 正在复制副本
  1086. 推迟操作副本
  1087. 数据副本的删除情况:
  1088. 数据块所属的HDFS文件被删除
  1089. 数据块的副本数量多于配置表
  1090. 副本被namenode标记损坏副本
  1091. 在HDFS中,客户端写文件时需要先从租约管理器中申请一个租约。
  1092. Namenode启动时会首先加载命名空间镜像并合并编辑日志。
  1093. 预防脑裂,HDFS提供三个级别的隔离机制:
  1094. 共享存储隔离
  1095. 客户端隔离
  1096. Datanode隔离
  1097. HA管理命令的执行是由HAAdmin为负责的。
  1098. Namenode三个类:
  1099. Namenode类
  1100. nameNode Rpcserver
  1101. FSNamesystem类
  1102. 块池:一个块池由属于同一个命名空间的所有数据块组成。
  1103. 命名空间卷:一个namenode管理的命名空间以及它对应的块池一起被称为命名空间卷。
  1104. 每个块池都是一个独立的数据块集合。
  1105. Datanode从逻辑上可切分几个模块:
  1106. 数据层
  1107. 逻辑层:向NN汇报,心跳,扫描损坏数据块
  1108. 服务器
  1109. Datanode升级需要考虑:
  1110. 版本兼容性问题
  1111. 升级消耗的硬盘空间问题
  1112. 回滚要求
  1113. Datanode两个管理功能:
  1114. 管理与组织磁盘存储目录
  1115. 管理与组织数据块及其元数据文件
  1116. Storedirectory:
  1117. 获取文件夹相关
  1118. 加锁/解锁
  1119. 存储状态恢复
  1120. 集中式缓存由分布在datanode上的对外内存组成,同时被namenode统一管理。
  1121. 数据包:
  1122. 数据包头
  1123. 校验数据
  1124. 实际数据
  1125. Java NIO零拷贝模式。
  1126. Datanode扫描器同期验证datanode上存储的数据块正确性。
  1127. HDFS目前提供三个客户端接口:
  1128. distributedFileSystem
  1129. FSShell
  1130. DFSAdmin
  1131. DFSClient是用户使用HDFS各项功能的起点。
  1132. HDFS管理员通过DFSAdmin工具管理与配置HDFS。
  1133. HDFS目前实现的读操作有三个层次:
  1134. 网络读:socket
  1135. 短路读:同一节点
  1136. 零拷贝读:缓存转换
  1137. Shuffle和sort阶段负责执行两个主要动作:
  1138. 决定哪个reducer接收map输出的键值对(切片)
  1139. 并确定传输给reducer的键值对是进行排序的
  1140. MapReduce是基于批处理的框架,不适合实时访问数据。
  1141. Hadoop配置文件:
  1142. Hadoop-env.sh ——设置环境变量
  1143. Core-site.xml ——系统级的Hadoop配置项
  1144. Hdfs-site.xml ——HDFS配置
  1145. Mapred-site.xml ——HDFS设置
  1146. Master ——Hadoop的master主机列表
  1147. Slaves ——Hadoop的slave主机地址列表
  1148. Flume四个组件:
  1149. Nodes ——flume数据路径
  1150. Agents ——从本地主机上收集流数据
  1151. Collectors ——汇总来自代理的数据
  1152. Master——执行配置管理任务
  1153. Flume以Avro Json格式写数据。
  1154. Agent数据接收器是Agent数据源的目的地。
  1155. Flume数据源:
  1156. Text ——处理一次的文本文件,每次处理一行
  1157. Tail ——为加入文件的每行生产一个事件
  1158. Multitail ——tail工具支持多文件处理
  1159. Syslogudp ——处理syslogUDP消息
  1160. syslogTcp ——处理sysLogTcp消息
  1161. execperiodic ——任意命令定期执行,整个输出是一个事件
  1162. execstream ——执行任意指令,每行是一个独立事件
  1163. exec ——定期执行任意指令并确定整个输出的每行事件
  1164. scribe ——处理scrive collection 系统生产的数据
  1165. Collector数据接收器支持多种事件输入格式:
  1166. Syslog ——输出类似syslog格式的事件
  1167. Log4j ——输出类似Hadoop log4j 格式的事件
  1168. avroJson——输出进过Avro编码的json格式的数据
  1169. avrodata ——输出经过avro二进制编码的数据
  1170. debug ——仅在调试时使用
  1171. raw——只输出事件本身,不包含元数据
  1172. spark编程模型是弹性分布式数据集,他是MapReduce模型的扩展和延伸。
  1173. RDD记录血统,而不是真正数据。
  1174. Spark四类操作:
  1175. 创建操作:用于RDD创建工作
  1176. 转换操作:RDD变换成新的RDD
  1177. 控制操作:RDD持久化
  1178. 行为操作:能够触发spark运行的操作
  1179. 调度器安装DAG进行计算,并最终得到目标RDD。
  1180. RDD模型将计算分解为多个相互独立的细粒度任务。
  1181. Spark中提供了通用接口来抽象每个RDD
  1182. 分区信息:它们是数据集的最小分片
  1183. 依赖关系:指向其父RDD
  1184. 函数:基于RDD计算方法
  1185. 划分策略和数据位置的元数据
  1186. RDD操作中用户可以使用Partition方法获取RDD划分的分区数。
  1187. Spark中RDD计算是以分区为单位的。
  1188. Spark默认连个划分器:哈希分区和范围分区。
  1189. Hadoop中的每一个HDFS数据块都称为一个RDD分区。
  1190. Map/mapPartitions作用每个元素,每个分区。
  1191. Checkpoint将切断与该RDD之前的依赖关系。
  1192. Spark基本概念:
  1193. Application ——用户编写的spark应用程序
  1194. Driver ——application的main创建sparkContext
  1195. Cluster manager ——指在集群上获取资源的外部服务
  1196. Standlone ——spark原生的资源管理
  1197. Hadoop YARN
  1198. Worl ——工作节点
  1199. Master ——总控进程
  1200. Executor ——执行进程
  1201. Spark定义了通信框架接口,这些接口实现中调用netty的具体方法。
  1202. Shuffle写有基于哈希和排序两种方式。
  1203. Clustermanager提供了资源的分配和管理。
  1204. 资源分配和调度的基本单位是container。
  1205. 在YARN中,每个application实例都有一个application master进程。
  1206. Application master是application启动的第一个容器,它负责和resourceManager打交道并请求资源。
  1207. Spark SQL执行过程:
  1208. 词法和语法解析
  1209. 绑定
  1210. 优化4. 执行
  1211. Spark 提供了两种方式将RDD转换成DataFrame:
  1212. 通过定义 case class ,使用反射推断schema
  1213. 通过编程接口,定义schema,并应用到RDD上
  1214. YARN拆分Jobtracker的两大职责:资源管理,作业调度/监控:
  1215. 全局的resource Manager
  1216. 每个应用对应的Application Master
  1217. Resource Manager拥有为系统中的所有应用的资源分配的决定权。
  1218. Container为应用程序授予在特定主机上使用资源全权利。
  1219. YARN三种调度器:
  1220. FIFO调度器
  1221. Capacity调度器
  1222. Fair调度器
  1223. Storm一个work进程执行的是一个topplpgy的子集。
  1224. Executor是一个被work进程启动的单独线程。
  1225. Work之间通信是通过Netty进行通信的。
  1226. Stream grouping:
  1227. Shuffle ——随机分组
  1228. Fields ——按字段分组
  1229. All ——广播发送
  1230. Non ——随机分配
  1231. Diret ——直接分组
  1232. Task是运行spout或bolt中的线程。
  1233. Strom的核心:
  1234. 主节点 ——Nimbus
  1235. 工作节点——supervisor
  1236. 协调器——Zookeeper
  1237. 工作进程——worker
  1238. 任务线程——task
  1239. Storm三大应用:
  1240. 信息流处理
  1241. 持续计算
  1242. 分布式远程调用
  1243. 提交一个Topology之后,storm创建spout/bolt实例big进行序列化。
  1244. 流是一个分布式并行创建和处理的无界的连续元组。
  1245. Storm数据传输利用的是zmq开源的消息传递框架。
  1246. Topology是由stream grouping链接起来的spout和bolt节点网络。
  1247. Tupe可以理解成键值对,即Fields和values。
  1248. Tuple的asked,faild都由spout发出并维护的。
  1249. 本地模式:storm用一个进程红的线程模拟所有spout/bolt。
  1250. Nimbus和supervisor之间的通信依赖Zookeeper完成。
  1251. 用户画像是一个实际用户的虚拟代表,如年龄,性别等。
  1252. 在机器学习中,对象是指含有一组特征的行变量。
  1253. 行变量的集合最容易构造的结构就是表。
  1254. Hadoop有三种令牌:
  1255. 委托令牌
  1256. 块访问令牌
  1257. 作业令牌
  1258. 对事物运动这种不确定性(随机性)的度量就是概率论。
  1259. 大数据4V:
  1260. Volume ——数据体量大
  1261. Variety ——数据类型繁多
  1262. Velocity ——处理速度快
  1263. Value ——商业价值高
  1264. 移动互联网产生了和客户紧密拥绑的大数据。
  1265. 在互联网这个产业链中,谁掌握了用户,谁的天下。
  1266. 消费者的注意力和使用习惯去了哪里,钱就会流向哪里。
  1267. 体验的产生是一个艺术的过程。
  1268. 大数据的目标是定位。
  1269. 建立一个学习型企业架构。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容