加米谷大数据
加米谷大数据
关注数: 2
粉丝数: 451
发帖数: 1,245
关注贴吧数: 37
MongoDB 概念解析 不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。 下表将帮助您更容易理解Mongo中的一些概念:通过下图实例,我们也可以更直观的了解Mongo中的一些概念:数据库 一个mongodb中可以建立多个数据库。 MongoDB的默认数据库为"db",该数据库存储在data目录中。 MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。 "show dbs" 命令可以显示所有数据的列表。以上实例命令中,"local" 是你要链接的数据库。 在下一个章节我们将详细讲解MongoDB中命令的使用。 数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。 不能是空字符串("")。不得含有' '(空格)、.、$、/、\和\0 (空字符)。应全部小写。最多64字节。 有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。 admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。 local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合 config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。 文档 文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。 一个简单的文档例子如下:需要注意的是: 文档中的键/值对是有序的。文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。MongoDB区分类型和大小写。MongoDB的文档不能有重复的键。文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。 文档键命名规范: 键不能含有\0 (空字符)。这个字符用来表示键的结尾。.和$有特别的意义,只有在特定环境下才能使用。以下划线"_"开头的键是保留的(不是严格要求的)。 集合 集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。 集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。 比如,我们可以将以下不同数据结构的文档插入到集合中:当第一个文档插入时,集合就会被创建。 合法的集合名 集合名不能是空字符串""。集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。集合名不能以"system."开头,这是为系统集合保留的前缀。用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。 如下实例: db.col.findOne() capped collections Capped collections 就是固定大小的collection。 它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。 Capped collections是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能 和标准的collection不同,你必须要显式的创建一个capped collection, 指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的。 要注意的是指定的存储大小包含了数据库的头信息。db.createCollection("mycoll",{capped:true, size:100000})在capped collection中,你能添加新的对象。能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。数据库不允许进行删除。使用drop()方法删除collection所有的行。注意: 删除之后,你必须显式的重新创建这个collection。在32bit机器中,capped collection最大存储为1e9( 1X109)个字节。 元数据 数据库的信息是存储在集合中。它们使用了系统的命名空间: dbname.system.* 在MongoDB数据库中名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection),如下:对于修改系统集合中的对象有如下限制。 在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。 {{system.users}}是可修改的。 {{system.profile}}是可删除的。 MongoDB 数据类型 下表为MongoDB中常用的几种数据类型。
MongoDB - 连接 启动 MongoDB 服务 执行启动操作后,mongodb 在输出一些必要信息后不会输出任何信息,之后就等待连接的建立,当连接被建立后,就会开始打印日志信息。 你可以使用 MongoDB shell 来连接 MongoDB 服务器。你也可以使用 PHP 来连接 MongoDB。本教程我们会使用 MongoDB shell 来连接 Mongodb 服务,之后的章节我们将会介绍如何通过php 来连接MongoDB服务。 标准 URI 连接语法: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] mongodb:// 这是固定的格式,必须要指定。 username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库 host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。 portX 可选的指定端口,如果不填,默认为27017 /database 如果指定username:password@,连接并验证登陆指定数据库。若不指定,默认打开 test 数据库。 ?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开 标准的连接格式包含了多个选项(options),如下所示:实例MongoDB 连接命令格式 使用用户名和密码连接到 MongoDB 服务器,你必须使用 'username:password@hostname/dbname' 格式,'username'为用户名,'password' 为密码。 使用用户名和密码连接登陆到默认数据库:更多连接实例 连接本地数据库服务器,端口是默认的。
MongoDB 删除数据库 语法 MongoDB 删除数据库的语法格式如下: db.dropDatabase() 删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。 实例 以下实例我们删除了数据库 runoob。 首先,查看所有数据库: > show dbslocal0.078GBrunoob 0.078GBtest 0.078GB 接下来我们切换到数据库 runoob: >use runoobswitched to db runoob> 执行删除命令:
MongoDB 创建数据库 语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库。 实例 以下实例我们创建了数据库 runoob:
大数据技术分享:Flume-ng的原理和使用 1. 介绍 Flume NG是Cloudera提供的一个分布式、可靠、可用的系统,它能够将不同数据源的海量日志数据进行高效收集、聚合、移动,最后存储到一个中心化数据存储 系统中。由原来的Flume OG到现在的Flume NG,进行了架构重构,并且现在NG版本完全不兼容原来的OG版本。经过架构重构后,Flume NG更像是一个轻量的小工具,非常简单,容易适应各种方式日志收集,并支持failover和负载均衡。 Flume 使用 java 编写,其需要运行在 Java1.6 或更高版本之上。 官方网站:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fflume.apache.org%2F&urlrefer=1796a7b40df1265c14fccd514ae6696e 用户文档:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fflume.apache.org%2FFlumeUserGuide.html&urlrefer=160b21a37ae4a24a60d3e2c6591e52b4 开发文档:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fflume.apache.org%2FFlumeDeveloperGuide.html&urlrefer=8cbb41bb5c329c44c5dfa23ecdfb3ad9 2. 架构 Flume的架构主要有一下几个核心概念: Event:一个数据单元,带有一个可选的消息头Flow:Event从源点到达目的点的迁移的抽象Client:操作位于源点处的Event,将其发送到Flume AgentAgent:一个独立的Flume进程,包含组件Source、Channel、SinkSource:用来消费传递到该组件的EventChannel:中转Event的一个临时存储,保存有Source组件传递过来的EventSink:从Channel中读取并移除Event,将Event传递到Flow Pipeline中的下一个Agent(如果有的话) 2.1 数据流 Flume 的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。 Flume 传输的数据的基本单位是 Event,如果是文本文件,通常是一行记录,这也是事务的基本单位。Event 从 Source,流向 Channel,再到 Sink,本身为一个 byte 数组,并可携带 headers 信息。Event 代表着一个数据流的最小完整单元,从外部数据源来,向外部的目的地去。 Flume 运行的核心是 Agent。它是一个完整的数据收集工具,含有三个核心组件,分别是 source、channel、sink。通过这些组件,Event 可以从一个地方流向另一个地方,如下图所示。 source 可以接收外部源发送过来的数据。不同的 source,可以接受不同的数据格式。比如有目录池(spooling directory)数据源,可以监控指定文件夹中的新文件变化,如果目录中有文件产生,就会立刻读取其内容。channel 是一个存储地,接收 source 的输出,直到有 sink 消费掉 channel 中的数据。channel 中的数据直到进入到下一个channel中或者进入终端才会被删除。当 sink 写入失败后,可以自动重启,不会造成数据丢失,因此很可靠。sink 会消费 channel 中的数据,然后送给外部源或者其他 source。如数据可以写入到 HDFS 或者 HBase 中。 2.2 核心组件 2.2.1 source Client端操作消费数据的来源,Flume 支持 Avro,log4j,syslog 和 http post(body为json格式)。可以让应用程序同已有的Source直接打交道,如AvroSource,SyslogTcpSource。也可以 写一个 Source,以 IPC 或 RPC 的方式接入自己的应用,Avro和 Thrift 都可以(分别有 NettyAvroRpcClient 和 ThriftRpcClient 实现了 RpcClient接口),其中 Avro 是默认的 RPC 协议。具体代码级别的 Client 端数据接入,可以参考官方手册。 对现有程序改动最小的使用方式是使用是直接读取程序原来记录的日志文件,基本可以实现无缝接入,不需要对现有程序进行任何改动。对于直接读取文件 Source,有两种方式: ExecSource: 以运行 Linux 命令的方式,持续的输出最新的数据,如 tail -F 文件名 指令,在这种方式下,取的文件名必须是指定的。 ExecSource 可以实现对日志的实时收集,但是存在Flume不运行或者指令执行出错时,将无法收集到日志数据,无法保证日志数据的完整性。SpoolSource: 监测配置的目录下新增的文件,并将文件中的数据读取出来。需要注意两点:拷贝到 spool 目录下的文件不可以再打开编辑;spool 目录下不可包含相应的子目录。 SpoolSource 虽然无法实现实时的收集数据,但是可以使用以分钟的方式分割文件,趋近于实时。 如果应用无法实现以分钟切割日志文件的话, 可以两种收集方式结合使用。 在实际使用的过程中,可以结合 log4j 使用,使用 log4j的时候,将 log4j 的文件分割机制设为1分钟一次,将文件拷贝到spool的监控目录。 log4j 有一个 TimeRolling 的插件,可以把 log4j 分割文件到 spool 目录。基本实现了实时的监控。Flume 在传完文件之后,将会修改文件的后缀,变为 .COMPLETED(后缀也可以在配置文件中灵活指定)。 Flume Source 支持的类型: Source类型说明Avro Source支持Avro协议(实际上是Avro RPC),内置支持Thrift Source支持Thrift协议,内置支持Exec Source | 基于Unix的command在标准输出上生产数据JMS Source从JMS系统(消息、主题)中读取数据,ActiveMQ已经测试过Spooling Directory Source监控指定目录内数据变更Twitter 1% firehose Source通过API持续下载Twitter数据,试验性质Netcat Source监控某个端口,将流经端口的每一个文本行数据作为Event输入Sequence Generator Source序列生成器数据源,生产序列数据Syslog Sources读取syslog数据,产生Event,支持UDP和TCP两种协议HTTP Source基于HTTP POST或GET方式的数据源,支持JSON、BLOB表示形式Legacy Sources兼容老的Flume OG中Source(0.9.x版本) 2.2.2 Channel 当前有几个 channel 可供选择,分别是 Memory Channel, JDBC Channel , File Channel,Psuedo Transaction Channel。比较常见的是前三种 channel。 MemoryChannel 可以实现高速的吞吐,但是无法保证数据的完整性。MemoryRecoverChannel 在官方文档的建议上已经建义使用FileChannel来替换。FileChannel保证数据的完整性与一致性。在具体配置FileChannel时,建议FileChannel设置的目录和程序日志文件保存的目录设成不同的磁盘,以便提高效率。 File Channel 是一个持久化的隧道(channel),它持久化所有的事件,并将其存储到磁盘中。因此,即使 Java 虚拟机当掉,或者操作系统崩溃或重启,再或者事件没有在管道中成功地传递到下一个代理(agent),这一切都不会造成数据丢失。Memory Channel 是一个不稳定的隧道,其原因是由于它在内存中存储所有事件。如果 java 进程死掉,任何存储在内存的事件将会丢失。另外,内存的空间收到 RAM大小的限制,而 File Channel 这方面是它的优势,只要磁盘空间足够,它就可以将所有事件数据存储到磁盘上。 Flume Channel 支持的类型: Channel类型说明Memory ChannelEvent数据存储在内存中JDBC ChannelEvent数据存储在持久化存储中,当前Flume Channel内置支持DerbyFile ChannelEvent数据存储在磁盘文件中Spillable Memory ChannelEvent数据存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件(当前试验性的,不建议生产环境使用)Pseudo Transaction Channel测试用途Custom Channel自定义Channel实现 2.2.3 sink Sink在设置存储数据时,可以向文件系统、数据库、hadoop存数据,在日志数据较少时,可以将数据存储在文件系中,并且设定一定的时间间隔保存数据。在日志数据较多时,可以将相应的日志数据存储到Hadoop中,便于日后进行相应的数据分析。 Flume Sink支持的类型 Sink类型说明HDFS Sink数据写入HDFSLogger Sink数据写入日志文件Avro Sink数据被转换成Avro Event,然后发送到配置的RPC端口上Thrift Sink数据被转换成Thrift Event,然后发送到配置的RPC端口上IRC Sink数据在IRC上进行回放File Roll Sink存储数据到本地文件系统Null Sink丢弃到所有数据HBase Sink数据写入HBase数据库Morphline Solr Sink数据发送到Solr搜索服务器(集群)ElasticSearch Sink数据发送到Elastic Search搜索服务器(集群)Kite Dataset Sink写数据到Kite Dataset,试验性质的Custom Sink自定义Sink实现 更多sink的内容可以参考官方手册。 2.3 可靠性 Flume 的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。 Flume 使用事务性的方式保证传送Event整个过程的可靠性。Sink 必须在 Event 被存入 Channel 后,或者,已经被传达到下一站agent里,又或者,已经被存入外部数据目的地之后,才能把 Event 从 Channel 中 remove 掉。这样数据流里的 event 无论是在一个 agent 里还是多个 agent 之间流转,都能保证可靠,因为以上的事务保证了 event 会被成功存储起来。而 Channel 的多种实现在可恢复性上有不同的保证。也保证了 event 不同程度的可靠性。比如 Flume 支持在本地保存一份文件 channel 作为备份,而memory channel 将 event 存在内存 queue 里,速度快,但丢失的话无法恢复。 2.4 可恢复性 3. 使用场景 下面,根据官网文档,我们展示几种Flow Pipeline,各自适应于什么样的应用场景: 多个 agent 顺序连接: 可以将多个Agent顺序连接起来,将最初的数据源经过收集,存储到最终的存储系统中。这是最简单的情况,一般情况下,应该控制这种顺序连接的 Agent的数量,因为数据流经的路径变长了,如果不考虑failover的话,出现故障将影响整个Flow上的Agent收集服务。 多个Agent的数据汇聚到同一个Agent: 这种情况应用的场景比较多,比如要收集Web网站的用户行为日志,Web网站为了可用性使用的负载均衡的集群模式,每个节点都产生用户行为日志,可 以为每个节点都配置一个Agent来单独收集日志数据,然后多个Agent将数据最终汇聚到一个用来存储数据存储系统,如HDFS上。 多路(Multiplexing)Agent 这种模式,有两种方式,一种是用来复制(Replication),另一种是用来分流(Multiplexing)。Replication方式,可以将最前端的数据源复制多份,分别传递到多个channel中,每个channel接收到的数据都是相同的。 配置格式示例如下: # List the sources, sinks and channels for the agent<Agent>.sources = <Source1><Agent>.sinks = <Sink1> <Sink2><Agent>.channels = <Channel1> <Channel2># set list of channels for source (separated by space)<Agent>.sources.<Source1>.channels = <Channel1> <Channel2># set channel for sinks<Agent>.sinks.<Sink1>.channel = <Channel1><Agent>.sinks.<Sink2>.channel = <Channel2><Agent>.sources.<Source1>.selector.type = replicating 上面指定了selector的type的值为replication,其他的配置没有指定,使用的Replication方式,Source1会将 数据分别存储到Channel1和Channel2,这两个channel里面存储的数据是相同的,然后数据被传递到Sink1和Sink2。 Multiplexing方式,selector可以根据header的值来确定数据传递到哪一个channel,配置格式,如下所示: # Mapping for multiplexing selector<Agent>.sources.<Source1>.selector.type = multiplexing<Agent>.sources.<Source1>.selector.header = <someHeader><Agent>.sources.<Source1>.selector.mapping.<Value1> = <Channel1><Agent>.sources.<Source1>.selector.mapping.<Value2> = <Channel1> <Channel2><Agent>.sources.<Source1>.selector.mapping.<Value3> = <Channel2>#...<Agent>.sources.<Source1>.selector.default = <Channel2> 上面selector的type的值为multiplexing,同时配置selector的header信息,还配置了多个selector的 mapping的值,即header的值:如果header的值为Value1、Value2,数据从Source1路由到Channel1;如果 header的值为Value2、Value3,数据从Source1路由到Channel2。 实现load balance功能 Load balancing Sink Processor能够实现load balance功能,上图Agent1是一个路由节点,负责将Channel暂存的Event均衡到对应的多个Sink组件上,而每个Sink组件分别连 接到一个独立的Agent上,示例配置,如下所示: a1.sinkgroups = g1a1.sinkgroups.g1.sinks = k1 k2 k3a1.sinkgroups.g1.processor.type = load_balancea1.sinkgroups.g1.processor.backoff = truea1.sinkgroups.g1.processor.selector = round_robina1.sinkgroups.g1.processor.selector.maxTimeOut=10000实现failover能 Failover Sink Processor能够实现failover功能,具体流程类似load balance,但是内部处理机制与load balance完全不同:Failover Sink Processor维护一个优先级Sink组件列表,只要有一个Sink组件可用,Event就被传递到下一个组件。如果一个Sink能够成功处理 Event,则会加入到一个Pool中,否则会被移出Pool并计算失败次数,设置一个惩罚因子,示例配置如下所示: a1.sinkgroups = g1a1.sinkgroups.g1.sinks = k1 k2 k3a1.sinkgroups.g1.processor.type = failovera1.sinkgroups.g1.processor.priority.k1 = 5a1.sinkgroups.g1.processor.priority.k2 = 7a1.sinkgroups.g1.processor.priority.k3 = 6a1.sinkgroups.g1.processor.maxpenalty = 20000 4. 安装和使用 Flume 的 rpm 安装方式很简单,这里不做说明。 示例1: avro 数据源 安装成功之后,在 /etc/flume/conf 目录创建f1.conf 文件,内容如下: agent-1.channels.ch-1.type = memoryagent-1.sources.avro-source1.channels = ch-1agent-1.sources.avro-source1.type = avroagent-1.sources.avro-source1.bind = 0.0.0.0agent-1.sources.avro-source1.port = 41414agent-1.sources.avro-source1.threads = 5agent-1.sinks.log-sink1.channel = ch-1agent-1.sinks.log-sink1.type = loggeragent-1.channels = ch-1agent-1.sources = avro-source1agent-1.sinks = log-sink1 关于 avro-source 配置说明,请参考 avro-source 接下来启动 agent: $ flume-ng agent -c /etc/flume-ng/conf -f /etc/flume-ng/conf/f1.conf -Dflume.root.logger=DEBUG,console -n agent-1 参数说明: -n 指定agent名称-c 指定配置文件目录-f 指定配置文件-Dflume.root.logger=DEBUG,console 设置日志等级 下面可以启动一个 avro-client 客户端生产数据: $ flume-ng avro-client -c /etc/flume-ng/conf -H localhost -p 41414 -F /etc/passwd -Dflume.root.logger=DEBUG,console 示例2:spooldir 数据源 在 /etc/flume/conf 目录创建 f2.conf 文件,内容如下: agent-1.channels = ch-1agent-1.sources = src-1agent-1.channels.ch-1.type = memoryagent-1.sources.src-1.type = spooldiragent-1.sources.src-1.channels = ch-1agent-1.sources.src-1.spoolDir = /root/logagent-1.sources.src-1.fileHeader = trueagent-1.sinks.log-sink1.channel = ch-1agent-1.sinks.log-sink1.type = loggeragent-1.sinks = log-sink1 关于 Spooling Directory Source 配置说明,请参考 Spooling Directory Source 接下来启动 agent: $ flume-ng agent -c /etc/flume-ng/conf -f /etc/flume-ng/conf/f2.conf -Dflume.root.logger=DEBUG,console -n agent-1 然后,手动拷贝一个文件到 /root/log 目录,观察日志输出以及/root/log 目录下的变化。 示例3:spooldir 数据源,写入 hdfs 在 /etc/flume/conf 目录创建 f3.conf 文件,内容如下: agent-1.channels.ch-1.type = fileagent-1.channels.ch-1.checkpointDir= /root/checkpointagent-1.channels.ch-1.dataDirs= /root/dataagent-1.sources.src-1.type = spooldiragent-1.sources.src-1.channels = ch-1agent-1.sources.src-1.spoolDir = /root/logagent-1.sources.src-1.deletePolicy= neveragent-1.sources.src-1.fileHeader = trueagent-1.sources.src-1.interceptors =i1agent-1.sources.src-1.interceptors.i1.type = timestampagent-1.sinks.sink_hdfs.channel = ch-1agent-1.sinks.sink_hdfs.type = hdfsagent-1.sinks.sink_hdfs.hdfs.path = hdfs://cdh1:8020/user/root/events/%Y-%m-%dagent-1.sinks.sink_hdfs.hdfs.filePrefix = logsagent-1.sinks.sink_hdfs.hdfs.inUsePrefix = .agent-1.sinks.sink_hdfs.hdfs.rollInterval = 30agent-1.sinks.sink_hdfs.hdfs.rollSize = 0agent-1.sinks.sink_hdfs.hdfs.rollCount = 0agent-1.sinks.sink_hdfs.hdfs.batchSize = 1000agent-1.sinks.sink_hdfs.hdfs.writeFormat = textagent-1.sinks.sink_hdfs.hdfs.fileType = DataStream#agent-1.sinks.sink_hdfs.hdfs.fileType = CompressedStream#agent-1.sinks.sink_hdfs.hdfs.codeC = lzopagent-1.channels = ch-1agent-1.sources = src-1agent-1.sinks = sink_hdfs 关于 HDFS Sink配置说明,请参考 HDFS Sink 说明: 通过 interceptors 往 header 里添加 timestamp,这样做,可以在 hdfs.path 引用系统内部的时间变量或者主机的 hostname。通过设置 hdfs.inUsePrefix,例如设置为 .时,hdfs 会把该文件当做隐藏文件,以避免在 mr 过程中读到这些临时文件,引起一些错误如果使用 lzo 压缩,则需要手动创建 lzo 索引,可以通过修改 HdfsSink 的代码,通过代码创建索引FileChannel 的目录最好是和 spooldir 的数据目录处于不同磁盘。 示例4:spooldir 数据源,写入 HBase 关于 HBase Sink 配置说明,请参考 HBase Sink 5. 开发相关 5.1 编译源代码 从 github 下载源代码并编译: $ git clone
[email protected]
:cloudera/flume-ng.git -b cdh4-1.4.0_4.7.0$ cd flume-ng$ mvn install -DskipTests -Phadoop-2 如果提示找不到 hadoop-test 的 jar 包,则修改 pom.xml 中的版本,如改为 2.0.0-mr1-cdh4.7.0,具体版本视你使用的分支版本而定,我这里是 cdh4.7.0。 如果提示找不到 uanodeset-parser 的 jarb,则在 pom.xml 中添加下面仓库: <repository> <id>tempo-db</id> <url>http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmaven.tempo-db.com%2Fartifactory%2Flist%2Ftwitter%2F&urlrefer=4f1edbb2fa48174ae2a47b69665b1404 </url> <snapshots> <enabled>false</enabled> </snapshots></repository> 6. 最佳实践 参考基于Flume的美团日志收集系统(一)架构和设计,列出一些最佳实践: 模块命名规则:所有的 Source 以 src 开头,所有的 Channel 以 ch 开头,所有的 Sink 以 sink 开头;模块之间内部通信统一使用 Avro 接口;将日志采集系统系统分为三层:Agent 层,Collector 层和 Store 层,其中 Agent 层每个机器部署一个进程,负责对单机的日志收集工作;Collector 层部署在中心服务器上,负责接收Agent层发送的日志,并且将日志根据路由规则写到相应的 Store 层中;Store 层负责提供永久或者临时的日志存储服务,或者将日志流导向其它服务器。扩展 MemoryChannel 和 FileChannel ,提供 DualChannel 的实现,以提供高吞吐和大缓存监控 collector HdfsSink写数据到 hdfs 的速度、FileChannel 中拥堵的 events 数量,以及写 hdfs 状态(查看是否有 .tmp 文件生成)
CentOS 7自定义开机启动,添加自定义系统服务 引言,说明Centos 系统服务脚本目录:/usr/lib/systemd/ 有系统(system)和用户(user)之分: 如需要开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即:/lib/systemd/system/ 反之,用户登录后才能运行的程序,存在用户(user)里:/lib/systemd/user/ 服务以.service结尾。 这边以presto开机运行为例: 1.建立服务文件vim /usr/lib/systemd/system/presto.service [Unit]Description=presto.servieAfter=network.target [Service]Type=forkingExecStart=/opt/presto/bin/launcher startExecReload=/opt/presto/bin/launcher restartExecStop=/opt/presto/bin/launcher stopPrivateTmp=true [Install]WantedBy=multi-user.target [Unit]:服务的说明Description:描述服务After:描述服务类别[Service]:服务运行参数的设置Type=forking是后台运行的形式ExecStart为服务的具体运行命令ExecReload为重启命令ExecStop为停止命令PrivateTmp=True表示给服务分配独立的临时空间注意:[Service]的启动、重启、停止命令全部要求使用绝对路径[Install]:服务安装的相关设置,可设置为多用户2.保存目录以754的权限保存在目录:/lib/systemd/system 3.相关命令 设置开机自启动systemctl enable presto.service 启动nginx服务systemctl start presto.service设置开机自启动systemctl enable presto.service停止开机自启动systemctl disable presto.service查看服务当前状态systemctl status presto.service重新启动服务systemctl restart presto.service查看所有已启动的服务systemctl list-units --type=service
Linux目录结构和常用命令 一、Linux目录结构 你想知道为什么某些程序位于/bin下,或者/sbin,或者/usr/bin,或/usr/sbin目录下吗?例如,less命令位于/usr/bin目录下。为什么没在/bin中,或/sbin,或/usr/sbin目录中?所有这些目录之间有什么不同? 在这篇文章中,让我们回顾一下Linux的文件系统结构,并理解各上层目录的含义。 蓝色:表示目录 青色:表示链接 黑色:表示文件 1、/- 根 每一个文件和目录从根目录开始。 只有root用户具有该目录下的写权限。请注意,/root是root用户的主目录,这与/.不一样 2、/bin中 - 用户二进制文件 包含二进制可执行文件。 在单用户模式下,你需要使用的常见Linux命令都位于此目录下。系统的所有用户使用的命令都设在这里。 例如:ps、ls、ping、grep、cp 3、/sbin目录 - 系统二进制文件 就像/bin,/sbin同样也包含二进制可执行文件。 但是,在这个目录下的linux命令通常由系统管理员使用,对系统进行维护。例如:iptables、reboot、fdisk、ifconfig、swapon命令 4、/etc - 配置文件 包含所有程序所需的配置文件。 也包含了用于启动/停止单个程序的启动和关闭shell脚本。例如:/etc/resolv.conf、/etc/logrotate.conf hosts:设备名称(或域名)到ip地址的解析,相当于本地存在的dns功能。见下图: 5、/dev - 设备文件 包含设备文件。 这些包括终端设备、USB或连接到系统的任何设备。例如:/dev/tty1、/dev/usbmon0 6、/proc - 进程信息 包含系统进程的相关信息。 这是一个虚拟的文件系统,包含有关正在运行的进程的信息。例如:/proc/{pid}目录中包含的与特定pid相关的信息。 这是一个虚拟的文件系统,系统资源以文本信息形式存在。例如:/proc/uptime 7、/var - 变量文件 var代表变量文件。 这个目录下可以找到内容可能增长的文件。 这包括 - 系统日志文件(/var/log);包和数据库文件(/var/lib);电子邮件(/var/mail);打印队列(/var/spool);锁文件(/var/lock);多次重新启动需要的临时文件(/var/tmp); 8、/tmp - 临时文件 包含系统和用户创建的临时文件。 当系统重新启动时,这个目录下的文件都将被删除。 9、/usr - 用户程序 包含二进制文件、库文件、文档和二级程序的源代码。 /usr/bin中包含用户程序的二进制文件。如果你在/bin中找不到用户二进制文件,到/usr/bin目录看看。例如:at、awk、cc、less、scp。 /usr/sbin中包含系统管理员的二进制文件。如果你在/sbin中找不到系统二进制文件,到/usr/sbin目录看看。例如:atd、cron、sshd、useradd、userdel。 /usr/lib中包含了/usr/bin和/usr/sbin用到的库。 /usr/local中包含了从源安装的用户程序。例如,当你从源安装Apache,它会在/usr/local/apache2中。 10、/home - HOME目录 所有用户用home目录来存储他们的个人档案。 例如:/home/john、/home/nikita 11、/boot - 引导加载程序文件 包含引导加载程序相关的文件。 内核的initrd、vmlinux、grub文件位于/boot下。 例如:initrd.img-2.6.32-24-generic、vmlinuz-2.6.32-24-generic 12、/lib - 系统库 包含支持位于/bin和/sbin下的二进制文件的库文件. 库文件名为 ld*或lib*.so.* 例如:ld-2.11.1.so,libncurses.so.5.7 13、/opt - 可选的附加应用程序 opt代表可选的。 包含从个别厂商的附加应用程序。 附加应用程序应该安装在/opt/或者/opt/的子目录下。 14、/mnt - 挂载目录 临时安装目录,系统管理员可以挂载文件系统。 15、/media - 可移动媒体设备 用于挂载可移动设备的临时目录。 举例来说,挂载CD-ROM的/media/cdrom,挂载软盘驱动器的/media/floppy; 16、/srv - 服务数据 srv代表服务。 包含服务器特定服务相关的数据。 例如,/srv/cvs包含cvs相关的数据。 【参考】 Linux Filesystem Hierarchy Source and pre-formatted versions available 1. Linux Filesystem Hierarchy 1.1. Foreward1.2. The Root Directory1.3. /bin1.4. /boot1.5. /dev1.6. /etc1.7. /home1.8. /initrd1.9. /lib1.10. /lost+found1.11. /media1.12. /mnt1.13. /opt1.14. /proc1.15. /root1.16. /sbin1.17. /usr1.18. /var1.19. /srv1.20. /tmp Glossary A. UNIX System V Signals B. Sources C. About the Author D. Contributors E. Disclaimer F. Donations G. Feedback H. GNU Free Documentation License H.1. PREAMBLEH.2. APPLICABILITY AND DEFINITIONSH.3. VERBATIM COPYINGH.4. COPYING IN QUANTITYH.5. MODIFICATIONSH.6. COMBINING DOCUMENTSH.7. COLLECTIONS OF DOCUMENTSH.8. AGGREGATION WITH INDEPENDENT WORKSH.9. TRANSLATIONH.10. TERMINATIONH.11. FUTURE REVISIONS OF THIS LICENSEH.12. ADDENDUM: How to use this License for your documents 二、常用命令 1、命令帮助 2、用户 3、SHELL 4、显示硬盘、分区、CPU、内存信息 5、网络 6、进程 7、文件 1、命令帮助[root@localhost ~]#man ps 2、用户$finger username 显示用户username的信息 $who 显示当前登陆用户 $who am I $su 成为root用户 $sudo command 以root用户身份执行 $passwd 更改密码 3、SHELL$history 显示在当前shell下命令历史 $alias 显示所有的命令别称 $alias new_command='command' 将命令command别称为new_command $env 显示所有的环境变量 $export var=value 设置环境变量var为value 4、显示硬盘、分区、CPU、内存信息$df -lh 显示所有硬盘的使用状况$du -sh * 显示当前目录下各个目录和文件的大小 $mount 显示所有的硬盘分区挂载 $mount partition path 挂在partition到路径path $umount partition 卸载partition $sudo fdisk -l 显示所有的分区 $sudo fdisk device 为device(比如/dev/sdc)创建分区表。 进入后选择n, p, w $sudo mkfs -t ext3 partition 格式化分区patition(比如/dev/sdc1) 修改 /etc/fstab,以自动挂载分区。增加行: /dev/sdc1 path(mount point) ext3 defaults 0 0 $arch 显示架构 $cat /proc/cpuinfo 显示CPU信息 $cat /proc/meminfo 显示内存信息 $free 显示内存使用状况 5、网络$ifconfig 显示网络接口以及相应的IP地址。ifconfig可用于设置网络接口 $ifup eth0 运行eth0接口 $ifdown eth0 关闭eth0接口 $iwconfig 显示无线网络接口 $route 显示路由表。route还可以用于修改路由表 $netstat 显示当前的网络连接状态 $ping IP 发送ping包到地址IP $traceroute IP 探测前往地址IP的路由路径 $dhclient 向DHCP主机发送DHCP请求,以获得IP地址以及其他设置信息。 $host domain DNS查询,寻找域名domain对应的IP $host IP 反向DNS查询 $wget url 使用wget下载url指向的资源 $wget -m url 镜像下载 6、进程$top 显示进程信息,并实时更新 $ps 显示当前shell下的进程 $ps -lu username 显示用户username的进程 $ps -ajx 以比较完整的格式显示所有的进程 $kill PID 杀死PID进程 (PID为Process ID) 7、文件$touch filename 如果文件不存在,创建一个空白文件;如果文件存在,更新文件读取和修改时间。 $rm filename 删除文件 $cp file1 file2 复制file1为file2 $ls -l path 显示文件和文件相关信息 $mkdir dir 创建dir文件夹 $mkdir -p path 递归创建路径path上的所有文件夹 $rmdir dir 删除dir文件夹,dir必须为空文件夹。 $rm -r dir 删除dir文件夹,以及其包含的所有文件 $file filename 文件filename的类型描述 $chown username:groupname filename 更改文件的拥有者为owner,拥有组为group $chmod 755 filename更改文件的权限为755: owner r+w+x, group: r+x, others: r+x $od -c filename 以ASCII字符显示文件 $cat filename 显示文件 $cat file1 file2 连接显示file1和file2 $head -1 filename 显示文件第一行 $tail -5 filename 显示文件倒数第五行 $diff file1 file2 显示file1和file2的差别 $sort filename 对文件中的行排序,并显示 $sort -f filename 排序时,不考虑大小写 $sort -u filename 排序,并去掉重复的行 $uniq filename 显示文件filename中不重复的行 (内容相同,但不相邻的行,不算做重复) $wc filename 统计文件中的字符、词和行数 $wc -l filename 统计文件中的行数
CentOS7常用命令 1、目录切换命令:pushd and popd 进入目录: pushd /usr/src pushd /etc/X11 pushd /boot/grub popd 回退目录 2、环境变量配置:vi /etc/profile #java export JAVA_HOME=/usr/java/jdk1.8.0_60 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH #Scala export SCALA_HOME=/usr/local/scala export PATH=$PATH:$SCALA_HOME/bin:$SCALA_HOME/sbin 3、关于Systemctl命令 Systemctl接受服务(.service),挂载点(.mount),套接口(.socket)和设备(.device)作为单元。 使用systemctl命令杀死服务 systemctl kill httpd.service systemctl status httpd.service 如何屏蔽(让它不能启动)或显示服务 systemctl mask httpd.service systemctl unmask httpd.service 如何激活服务并在启动时启用或禁用服务(即系统启动时自动启动服务) systemctl is-active httpd.service systemctl enable httpd.service systemctl disable httpd.service 如何启动、重启、停止、重载服务以及检查服务状态 systemctl start httpd.service systemctl restart httpd.service systemctl stop httpd.service systemctl reload httpd.service systemctl status httpd.service 列出所有可用单元 systemctl list-unit-files 列出所有运行中单元 systemctl list-units 列出所有失败单元 systemctl --failed 检查某个单元(如 httpd.service)是否启用 systemctl is-enabled httpd.service 检查某个单元或服务是否运行 systemctl status firewalld.service 4、Centos7根据文件内容查找 find /opt/ -type f |xargs grep "content xxx" 5、CentOS7关闭防火墙 停止firewall systemctl stop firewalld.service systemctl disable firewalld.service firewall-cmd --state 查看默认防火墙状态(关闭后显示notrunning,开启后显示running) 6、查看程序的安装位置 使用 whereis 命令查看程序的安装位置 如:whereis systemd whereis mysql whereis httpd <code style="font-family: Monaco, Consolas, Courier, "Lucida Console", monospace; background-color: inherit;"><span style="background-color: inherit;"></span></code> 7、CentOS如何查看端口是被哪个应用进程占用 一、检查端口被哪个进程占用 代码如下 复制代码 netstat -lnp|grep 88 #88请换为你的apache需要的端口,如:80 SSH执行以上命令,可以查看到88端口正在被哪个进程使用。如下图,进程号为 1777 。 二、查看进程的详细信息 ps 1777 SSH执行以上命令。查看相应进程号的程序详细路径。 三、杀掉进程,重新启动apache 代码如下 复制代码 kill -9 1777 #杀掉编号为1777的进程 service httpd start #启动apache。
技术干货 | MapReduce作业调度 可以通过设置mapred.job.priority属性或JobClient的setJobPriority()方法来设置优先级(在这两种方法中,可以选VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW中的任何值作为优先级)。在作业调度器选择要运行的下一个作业时,选择的是优先级最高的作业。然而,在FIFO调度算法中,优先级并不支持抢占,所以高优先级的作业任然受阻于此前已经开始的,长时间运行的低优先级的作业。MR1的默认调度器是最初基于队列的FIFO调度器,还有两个多用户调度器,分别为公平调度器和容量调度器。01 公平调度器 公平调度器的目标是让每个用户公平共享集群能力。如果只有一个作业在运行,就会得到集群的所有资源。随着提交的作业越来越多,闲置的任务槽会以“让每个用户公平共享集群”这种方式进行分配。某个用户的耗时短的作业将在合理的时间内完成,即便另一个用户的长时间作业正在运行而且还在运行过程中。 作业都放在作业池中,在默认情况下,每个用户都有自己的作业池。提交作业数较多的用户,不会因此而获得更多的集群资源。可以用map和reduce的任务槽数来定制作业池的最小容量,也可以设置每个池的权重。 公平调度器支持抢占机制,所以,如果一个池在特定的一段时间内未能公平共享资源,就会中止运行池中得到过多资源的任务,把空出来的任务槽让给运行资源不足的作业池。 公平调度器是一个后续模块。要使用它,需要将其JAR文件放在HADOOP的类路径,即将它从Hadoop的contrib/fairscheduler目录复制到lib目录。随后,像下面这样设置mapred.jobtracker.taskScheduler属性: org.apache.hadoop.mapred.FairScheduler 02 容量调度器 集群由很多队列组成(类似于公平调度器的任务池),这些队列可能是层次结构的(因此,一个队列可能是另一个队列的子队列),每个队列被分配有一定的容量。这一点与公平调度器类似,只不过在每个队列内部,作业根据FIFO方式(考虑优先级)进行调度。本质上,容量调度器允许用户或组织(使用队列进行定义)为每个用户或组织模拟出一个使用FIFO调度策略的独立MR集群。相比之下,公平调度器(实际上也支持作业池内的FIFO作业调度,使其类似于容量调度器)强制每个池内公平共享,使运行的作业共享池的资源。
技术干货 | Apache Spark 黑名单(Blacklist)机制介绍 在使用 Apache Spark 的时候,作业会以分布式的方式在不同的节点上运行;特别是当集群的规模很大时,集群的节点出现各种问题是很常见的,比如某个磁盘出现问题等。我们都知道 Apache Spark 是一个高性能、容错的分布式计算框架,一旦它知道某个计算所在的机器出现问题(比如磁盘故障),它会依据之前生成的 lineage 重新调度这个 Task。 我们现在来考虑下下面的场景: 1、有个节点上的磁盘由于某些原因出现间歇性故障,导致某些扇区不能被读取。假设我们的 Spark 作业需要的数据正好就在这些扇区上,这将会导致这个 Task 失败。 2、这个作业的 Driver 获取到这个信息,知道 Task 失败了,所以它会重新提交这个 Task。 3、Scheduler 获取这个请求之后,它会考虑到数据的本地性问题,所以很可能还是把这个 Task 分发到上述的机器,因为它并不知道上述机器的磁盘出现了问题。 4、因为这个机器的磁盘出现问题,所以这个 Task 可能一样失败。然后 Driver 重新这些操作,最终导致了 Spark 作业出现失败! 上面提到的场景其实对我们人来说可以通过某些措施来避免。但是对于 Apache Spark 2.2.0 版本之前是无法避免的,不过高兴的是,来自 Cloudera 的工程师解决了这个问题:引入了黑名单机制 Blacklist(详情可以参见SPARK-8425,具体的设计文档参见Design Doc for Blacklist Mechanism),并且随着 Apache Spark 2.2.0 版本发布,不过目前还处于实验性阶段。 黑名单机制其实是通过维护之前出现问题的执行器(Executors)和节点(Hosts)的记录。当某个任务(Task)出现失败,那么黑名单机制将会追踪这个任务关联的执行器以及主机,并记下这些信息;当在这个节点调度任务出现失败的次数超过一定的数目(默认为2),那么调度器将不会再将任务分发到那台节点。调度器甚至可以杀死那台机器对应的执行器,这些都可以通过相应的配置实现。 我们可以通过 Apache Spark WEB UI 界面看到执行器的状态(Status):如果执行器处于黑名单状态,你可以在页面上看到其状态为 Blacklisted ,否则为 Active。如下图所示:拥有了黑名单机制之后,上面场景的问题就可以很好的解决。 目前黑名单机制可以通过一系列的参数来控制,主要如下:因为黑名单机制目前还处于实验性状态,所以上面的一些参数可能会在后面的 Spark 中有所修改。
加米谷大数据 | Hive模式设计 过多使用分区可能导致非必须的Hadoop文件和文件夹,最终会超出NameNode对系统云数据信息的处理能力。 默认,每个task都是一个新的JVM实例,都需要开启和销毁的开销。对于小文件(小于一个块的大小),每个文件都会对应一个task。会导致JVM开启和销毁的时间中可能会比实际处理数据的时间消耗要长。 理想的分区方案部应该导致产生太多的分区和文件夹目录,并且每个目录下的文件应该足够大,应该是文件系统中块大小的若干倍。 不能够找到好的、大小相对合适的分区方式的话,可以考虑使用分桶表数据存储。 Hive没有主键或基于序列密钥生成的自增键的概念。分桶是将数据集分解成更容易管理的若干部分的另一个技术。如:在创建表时使用CLUSTERED BY(COLUMN_NAME) INTO 96 BUCKETS; 需要设置一个属性来强制Hive为目标表的分桶初始化过程设置一个正确的reducer个数,然后再执行一个查询来填充分区:set hive.enforce.bucketing=true; from raw_logs insert overwrite table weblog partition (dt='2016-08-23') select user_id,url,source_ip where dt='2016-08-23'; 如果没有使用hive.enforce.bucketing属性,那么就需要自己设置和分桶个数相匹配的reducer个数,如用set mapred.reduce.tasks=96,然后在INSERT语句中,需要在SELECT 语句后增加CLUSTER BY 语句。因为桶的数量是固定的,所以它没有数据波动,桶对于抽样再适合不过。分桶同时有利于执行高效的map-side JOIN。 为底层数据增加一个新字段,旧的原始数据文件可能不包含这个字段,这种方式,无法再已有字段的开始或中间增加新字段。 几乎在所有情况下,压缩都可以使磁盘上存储的数据量变小,这样可以通过降低I/O来提高查询执行速度,但是压缩和解压缩会消耗CPU资源。一般情况建议使用压缩,除非CPU对性能有影响。
加米谷大数据 | Python之新手运行时常见的17个错误 当初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂。这里列出了常见的的一些让你程序 crash 的运行时错误。 1)忘记在 if , elif , else , for , while , class ,def 声明末尾添加 :(导致 “SyntaxError :invalid syntax”) 该错误将发生在类似如下代码中: if spam == 42 print('Hello!') 2)使用 = 而不是 ==(导致“SyntaxError: invalid syntax”) = 是赋值操作符而 == 是等于比较操作。该错误发生在如下代码中: if spam = 42: print('Hello!') 3)错误的使用缩进量。(导致“IndentationError:unexpected indent”、“IndentationError:unindent does not match any outer indetation level”以及“IndentationError:expected an indented block”) 记住缩进增加只用在以:结束的语句之后,而之后必须恢复到之前的缩进格式。该错误发生在如下代码中: print('Hello!') print('Howdy!') 或者:if spam == 42: print('Hello!') print('Howdy!') 或者:if spam == 42: print('Hello!') 4)在 for 循环语句中忘记调用 len() (导致“TypeError: ‘list’ object cannot be interpreted as an integer”) 通常你想要通过索引来迭代一个list或者string的元素,这需要调用 range() 函数。要记得返回len 值而不是返回这个列表。 该错误发生在如下代码中: spam = ['cat', 'dog', 'mouse']for i in range(spam): print(spam[i]) 5)尝试修改string的值(导致“TypeError: ‘str’ object does not support item assignment”) string是一种不可变的数据类型,该错误发生在如下代码中: spam = 'I have a pet cat.'spam[13] = 'r'print(spam) 而你实际想要这样做: spam = 'I have a pet cat.'spam = spam[:13] + 'r' + spam[14:] print(spam) 6)尝试连接非字符串值与字符串(导致 “TypeError: Can’t convert ‘int’ object to str implicitly”) 该错误发生在如下代码中: numEggs = 12print('I have ' + numEggs + ' eggs.') 而你实际想要这样做: numEggs = 12print('I have ' + str(numEggs) + ' eggs.') 或者: numEggs = 12print('I have %s eggs.' % (numEggs)) 7)在字符串首尾忘记加引号(导致“SyntaxError: EOL while scanning string literal”) 该错误发生在如下代码中: print(Hello!') 或者: print('Hello!) 或者: myName = 'Al'print('My name is ' + myName + . How are you?') 8)变量或者函数名拼写错误(导致“NameError: name ‘fooba’ is not defined”) 该错误发生在如下代码中: foobar = 'Al'print('My name is ' + fooba) 或者: spam = ruond(4.2) 或者: spam = Round(4.2) 9)方法名拼写错误(导致 “AttributeError: ‘str’ object has no attribute ‘lowerr‘”) 该错误发生在如下代码中: spam = 'THIS IS IN LOWERCASE.'spam = spam.lowerr() 10)引用超过list最大索引(导致“IndexError: list index out of range”) 该错误发生在如下代码中: spam = ['cat', 'dog', 'mouse'] print(spam[6]) 11)使用不存在的字典键值(导致“KeyError:‘spam’”) 该错误发生在如下代码中: spam = {'cat': 'Zophie', 'dog': 'Basil', 'mouse': 'Whiskers'} print('The name of my pet zebra is ' + spam['zebra']) 12)尝试使用Python关键字作为变量名(导致“SyntaxError:invalid syntax”) Python关键不能用作变量名,该错误发生在如下代码中: class = 'algebra' Python3的关键字有:and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, True, try, while, with, yield 13)在一个定义新变量中使用增值操作符(导致“NameError: name ‘foobar’ is not defined”) 不要在声明变量时使用0或者空字符串作为初始值,这样使用自增操作符的一句spam += 1等于spam = spam + 1,这意味着spam需要指定一个有效的初始值。 该错误发生在如下代码中: spam = 0spam += 42eggs += 42 14)在定义局部变量前在函数中使用局部变量(此时有与局部变量同名的全局变量存在)(导致“UnboundLocalError: local variable ‘foobar’ referenced before assignment”) 在函数中使用局部变来那个而同时又存在同名全局变量时是很复杂的,使用规则是:如果在函数中定义了任何东西,如果它只是在函数中使用那它就是局部的,反之就是全局变量。 这意味着你不能在定义它之前把它当全局变量在函数中使用。 该错误发生在如下代码中: someVar = 42def myFunction(): print(someVar) someVar = 100myFunction() 15)尝试使用 range()创建整数列表(导致“TypeError: ‘range’ object does not support item assignment”) 有时你想要得到一个有序的整数列表,所以 range() 看上去是生成此列表的不错方式。然而,你需要记住 range() 返回的是 “range object”,而不是实际的 list 值。 该错误发生在如下代码中: spam = range(10) spam[4] = -1 也许这才是你想做: spam = list(range(10)) spam[4] = -1 (注意:在 Python 2 中 spam = range(10) 是能行的,因为在 Python 2 中 range() 返回的是list值,但是在 Python 3 中就会产生以上错误) 16)不错在 ++ 或者 — 自增自减操作符。(导致“SyntaxError: invalid syntax”) 如果你习惯于例如 C++ , Java , PHP 等其他的语言,也许你会想要尝试使用 ++ 或者 — 自增自减一个变量。在Python中是没有这样的操作符的。 该错误发生在如下代码中: spam = 1spam++ 也许这才是你想做的: spam = 1spam += 1 17)忘记为方法的第一个参数添加self参数(导致“TypeError: myMethod() takes no arguments (1 given)”) 该错误发生在如下代码中: class Foo(): def myMethod(): print('Hello!') a = Foo() a.myMethod() 成都加米谷大数据科技有限公司是一家专注于大数据人才培养的机构。由来自阿里、华为、京东、星环等国内知名企业的多位技术大牛联合创办,技术底蕴丰厚,勤奋创新,精通主流前沿大数据及人工智能相关技术。 以国家规划大数据产业发展战略为指引,以全国大数据技术和大数据分析人才的培养为使命,以提升就业能力、强化职业技术为目标。面向社会提供大数据、人工智能等前沿技术的培训业务。
加米谷大数据 | 推荐5款好用的Python工具 对于Python开发者,在互联网上有很多可用的开发工具,但对于初学者不知道哪个Python开发工具比较好,找到一个合适的Python开发工具是很难的,需要花费很多的时间精力。所以,加米谷大数据就为初学者推荐几个最好用的5个Python开发工具: 1、Python Tutor Python Tutor 是由 Philip Guo 开发的一个免费教育工具,可帮助学生攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。通过这个工具,教师或学生可以直接在 Web 浏览器中编写 Python 代码,并逐步可视化地运行程序。如果你不知道代码在内存中是如何运行的,不妨把它拷贝到Tutor里可视化执行一遍,加深理解。2、IPython IPython 是一个 for Humans 的 Python 交互式 shell,用了它之后你就不想再用自带的 Python shell 了,IPython 支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多实用功能和函数,同时它也是科学计算和交互可视化的最佳平台。 3、Jupyter Notebook Jupyter Notebook 就像一个草稿本,能将文本注释、数学方程、代码和可视化内容全部组合到一个易于共享的文档中,以 Web 页面的方式展示。它是数据分析、机器学习的必备工具。 4、Anaconda Python 虽好,可总是会遇到各种包管理和 Python 版本问题,特别是 Windows 平台很多包无法正常安装,为了解决这些问题,Anoconda 出现了,Anoconda 包含了一个包管理工具和一个Python管理环境,同时附带了一大批常用数据科学包,也是数据分析的标配。5、Skulpt Skulpt 是一个用 Javascript 实现的在线 Python 执行环境,它可以让你轻松在浏览器中运行 Python 代码。使用 skulpt 结合 CodeMirror 编辑器即可实现一个基本的在线Python编辑和运行环境。
加米谷大数据 | Hbase的数据坐标 Hbase在表里存储数据使用的是四维坐标系统。分别是:行健、列族、列限定符和时间版本。 如: 列族A 行健 列限定符(name) 列限定符(email) 列限定符C(password) aaa 单元(value1) 单元(value4) 单元(value7) bbb 单元(value2) 单元(value5) 单元(value8) ccc 单元(value3) 单元(value6) 时间版本1:单元(value9),时间版本2:单元(value10) 行健按照字典排序,一行具有一个行健,唯一且一行具有多个列族,每个列族下有一个或多个列限定符,每个列限定符下有多个单元,每个单元默认具有3个时间版本的值。 单元的新建、修改和删除都会留下新时间版本,当没有设定时间版本时,HBase以毫秒为单位使用当前时间,所以版本数字用长整型long表示。单元里数据的每个版本提交一个KeyValue实例给Result。 可用方法getTimestamp()来获取KeyValue实例的版本信息。如果一个单元的版本超过了最大数量,多出的记录在下一次大合并时会扔掉。除了删除整个整个单元,你也可以删除一个或介个特定的版本。deleteColumns() (带s)处理小于指定时间版本的所有KeyValue,不指定则为当前时间now,则相当于删除了该单元,而方法 deleteColumn()只删除一个时间版本。 把所有坐标视为一个整体,Hbase可看做一个键值数据库,可把单元数据看做值。当使用Hbase API检索数据时,不需提供全部坐标,如果在GET命令中省略了时间版本,将返回多个时间版本的映射集合。 可以在一次操作中,获取多个数据,按坐标的降序列。 如果是全维度坐标,将得到指定单元值。去掉时间版本后,得到一个从时间戳列值的映射。再继续去掉列限定符,得到一个指定列族下的所有列限定符的映射。最后去掉列族,将得到一行的映射。 成都加米谷大数据科技有限公司是一家专注于大数据人才培养的机构。由来自阿里、华为、京东、星环等国内知名企业的多位技术大牛联合创办,技术底蕴丰厚,勤奋创新,精通主流前沿大数据及人工智能相关技术。 以国家规划大数据产业发展战略为指引,以全国大数据技术和大数据分析人才的培养为使命,以提升就业能力、强化职业技术为目标。面向社会提供大数据、人工智能等前沿技术的培训业务(http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.dtinone.com&urlrefer=087954d6c27420645d8ba4d7381bc2b7)。
加米谷大数据——数据表明,中国的程序员是最牛的! 一直觉得中国的程序员想法多,肯钻研肯学习,但却不知道原来中国的程序员是世界上最牛的程序员。说来可能不信,但根据HackerRank官网的一篇报道,数据显示中国的程序员就是世界上最牛的程序员。特将此文翻译成中文,分享给大家。 如果问哪里的程序员最牛,很多人肯定会认为是美国。毕竟美国拥有很多杰出的程序员,如比尔·盖茨、 肯·汤普森、 C 语言之父丹尼斯·里奇、唐纳德·克努特。但是,这些年,印度的程序员规模增长是全世界最快的,俄罗斯的黑客也越来越锋芒毕露。有什么办法来确定哪个国家的程序员是最牛的吗? 在HackerRank网站上,哪些国家在编程挑战赛中表现最厉害呢?通过数据,我们希望可以找到问题的答案。 在 HackerRank网站上,为了帮助程序员提高技能,我们举行过数以千计的编程挑战赛。来自世界各地成千上万的程序员参加了这些挑战赛,从 Python 到算法到安全到分布式系统都有涉及。我们的社区也有超过150万开发者的排名,并且社区的人数每天都在增长。 根据我们的数据显示,中国和俄罗斯拥有最具才华的程序员。中国程序员在数学、功能程序设计和数据结构方面超过了世界其他国家的程序员,而俄罗斯程序员则在算法领域占据主导地位,算法也是最流行和最具竞争力的领域。虽然美国和印度在HackerRank上也有不少优秀的程序员,但他们也只能排在第28和第31。 整体综合排名 我们先从程序员中最受欢迎的测试类型开始分析。HackerRank程序员可选择参与15个不同领域,下表显示了各个领域的比例 :遥遥领先的领域是算法领域,这个领域得到了近40%的程序员青睐。这个领域包括数据排序,动态编程,搜索关键字和其他基于逻辑的任务方面的挑战。对于算法测试,程序员可使用他们选择的语言,这可能也解释了该领域如此受欢迎的部分原因。排在第二位和第三位的Java和数据架构分别都占到了接近 10%的比例。而分布系统和安全的占比最低。 那么,基于这些测试,哪个国家的程序员整体得分最高呢? 为了弄清楚,我们查看了各个国家所在领域的平均得分。计算平均得分前我们又为每个领域制定了打分标准(通过从每个分数减去平均值,然后除以标准差,也称为z分数),这样的话,即使每个领域的难度有差异,但我们也能对不同领域的个人打分,并形成从整体到个体的比较体系。为了让结果更直观,我们根据 z 分数框架的原理,做了一个 1-100 分数框架来解释。 我们统计了 HackerRank 上程序员最多的 50 个国家,得出下面这张表单: 由于中国的程序员得分最高,所以将中国的分数作为 100 的基准分,则俄罗斯的分数为 99.9 ,两国仅相差 0.01 。另外,波兰和瑞士也以 98 的高分进入前列。巴基斯坦得分仅为 57.4 。 印度和美国为全世界贡献了最多的程序员,但没有进入榜单的前 25名 ,只分别以 76 和 78 的分数排名 31 和 28 。 特定领域排名 虽然中国的排名很出众,但也不只是雄霸所有榜单。哪个国家的程序员在特定领域的表现最好?我们来看看各个领域中上榜的国家。 可以看到中国在一些领域相当出色。中国程序员在在数据结构、数学和函数式编程方面打败了其他国家的程序员。另外,俄罗斯程序员在挑战举办最多的算法领域也摘得桂冠。其次是分别处于第二、第三位置的波兰和中国。 怎么解释不同国家在不同领域的水平差异?有可能是因为俄罗斯的程序员更喜欢参加算法类的比赛,也就会在这一领域投入更多精力,而大部分中国程序员则更喜欢参与数据结构类的项目。 在HackerRank工作的一个软件工程师就是这样的,他叫Shimi Zhang,是我们函数型编程领域排名前十位的程序员之一。他来自中国重庆市,两年前来到美国攻读计算机科学硕士,然后来到HackerRank工作。 来自中国的顶尖程序员Shimi Zhang就中国程序员的不同凡响之处表达了他的看法: “和其他国家相比,中国的高等教育资源比较少,中国的年轻人学习编程的路本来就窄。很多非凡的年轻人在得到来之不易的变成比赛,会真正痴迷于此。 在中国,很多年轻人在中学时期就开始自学编程了,甚至还尝试解决的一些在全世界也没有多少人能解决的难题。 举办专门针对青少年工程师的全国性竞赛,如 NOIp ( 全国青少年信息学奥林匹克联赛)和 NOI ( 全国青少年信息学奥林匹克竞赛),今年至少有 3 个人在 NOI 中同时获得了冠军。这种针对青少年举行的编程比赛是近十年内的趋势。 并且, NOI 中还有一个**的特别规定:如果一位选手在 NIO 中获得了金牌,他就不能参加国际信息学奥林匹克竞赛的中国队选拔赛,这就意味着,在国际信息学奥林匹克竞赛中获得金牌的中国选手,都是首战告捷。” 不同国家程序员的偏好 接下来,我们又比较了每个国家程序员在不同挑战赛上花费的时间,然后与HackerRank用户平均花费的时长进行比较。这样一来,就能找出不同国家程序员在特定领域的偏好了。 如上表所示,中国程序员在数学竞赛中的参与度远远高于我们预期的平均水平,这就能解释为什么他们能在这个领域高踞榜首了。捷克人貌似很喜欢 shell,在这个单项他们是第一。 不同国家程序员的编程语言偏好 但是除了这两个国家,其它国家的选择偏好和擅长领域好像并没有必然联系。我们也想知道其他国家的程序员对特定的编程语言是否有特殊嗜好。比如印度程序员是不是对C++更感兴趣?墨西哥程序员是不是都用Ruby编码? 总的来说,世界各地的程序员选用 Java 的比例都要高于其它语言(只有极少数的例外:如马来西亚和巴基斯坦的程序员更喜欢 C++,台湾的程序员更喜欢 Python )。而斯里兰卡程序员也是JAVA比例使用最高的国家,在HackerRan中也排名排在第八的位置。 巴基斯坦、斯里兰卡和尼日利亚目前排名位于低端,他们可以学习学习瑞士的毅力。程序员在HackerRank社区上没有努力就放弃了挑战,得分为零。瑞士的零记分用户比例是最低,瑞士程序员也可谓称得上世界上最顽强的程序员。 其实对于世界各地的程序员来说,无论你来自何处,都有可能成为一下个盖茨或者克努特。 根据这些数据,如果我们举办一场黑客奥林匹克比赛,中国将赢得金牌,俄罗斯将获得银牌,而波兰则拿下铜牌。尽管美国和印度的程序员让人值得称赞,但想进入前25,还是需要再继续努力的。 成都加米谷大数据科技有限公司是一家专注于大数据人才培养的机构。由来自阿里、华为、京东、星环等国内知名企业的多位技术大牛联合创办,技术底蕴丰厚,勤奋创新,精通主流前沿大数据及人工智能相关技术。 以国家规划大数据产业发展战略为指引,以全国大数据技术和大数据分析人才的培养为使命,以提升就业能力、强化职业技术为目标。面向社会提供大数据、人工智能等前沿技术的培训业务。
加米谷大数据 | Apache Spark 黑名单(Blacklist)机制介绍 在使用 Apache Spark 的时候,作业会以分布式的方式在不同的节点上运行;特别是当集群的规模很大时,集群的节点出现各种问题是很常见的,比如某个磁盘出现问题等。我们都知道 Apache Spark 是一个高性能、容错的分布式计算框架,一旦它知道某个计算所在的机器出现问题(比如磁盘故障),它会依据之前生成的 lineage 重新调度这个 Task。 我们现在来考虑下下面的场景: 1、有个节点上的磁盘由于某些原因出现间歇性故障,导致某些扇区不能被读取。假设我们的 Spark 作业需要的数据正好就在这些扇区上,这将会导致这个 Task 失败。 2、这个作业的 Driver 获取到这个信息,知道 Task 失败了,所以它会重新提交这个 Task。 3、Scheduler 获取这个请求之后,它会考虑到数据的本地性问题,所以很可能还是把这个 Task 分发到上述的机器,因为它并不知道上述机器的磁盘出现了问题。 4、因为这个机器的磁盘出现问题,所以这个 Task 可能一样失败。然后 Driver 重新这些操作,最终导致了 Spark 作业出现失败! 上面提到的场景其实对我们人来说可以通过某些措施来避免。但是对于 Apache Spark 2.2.0 版本之前是无法避免的,不过高兴的是,来自 Cloudera 的工程师解决了这个问题:引入了黑名单机制 Blacklist(详情可以参见SPARK-8425,具体的设计文档参见Design Doc for Blacklist Mechanism),并且随着 Apache Spark 2.2.0 版本发布,不过目前还处于实验性阶段。 黑名单机制其实是通过维护之前出现问题的执行器(Executors)和节点(Hosts)的记录。当某个任务(Task)出现失败,那么黑名单机制将会追踪这个任务关联的执行器以及主机,并记下这些信息;当在这个节点调度任务出现失败的次数超过一定的数目(默认为2),那么调度器将不会再将任务分发到那台节点。调度器甚至可以杀死那台机器对应的执行器,这些都可以通过相应的配置实现。 我们可以通过 Apache Spark WEB UI 界面看到执行器的状态(Status):如果执行器处于黑名单状态,你可以在页面上看到其状态为 Blacklisted ,否则为 Active。如下图所示: 拥有了黑名单机制之后,上面场景的问题就可以很好的解决。 目前黑名单机制可以通过一系列的参数来控制,主要如下: 因为黑名单机制目前还处于实验性状态,所以上面的一些参数可能会在后面的 Spark 中有所修改。
技术干货 hive安装部署 解压hive压缩包 apache-hive-2.1.0-bin.tar.gz(官网下载) 配置HADOOP_HOME环境变量 配置HIVE_HOME环境变量 在$HIVE_HOME/conf下创建hive-site.xml,并输入增加以下配置: <?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="configuration.xsl" ?> <configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>hive.exec.scratchdir</name> <value>/tmp/hive</value> </property> <property> <name>hive.server2.logging.operation.log.location</name> <value>/tmp/hive/operation_logs</value> <description>Top level directory where operation logs are stored if logging functionality is enabled</description> </property> <property> <name>hive.exec.local.scratchdir</name> <value>/tmp/hive</value> <description>Local scratch space for Hive jobs</description> </property> <property> <name>hive.downloaded.resources.dir</name> <value>/tmp/hive/resources</value> <description>Temporary local directory for added resources in the remote file system.</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>bigdata</value> <description>password to use against metastore database</description> </property> <property> <name>hive.server2.thrift.bind.host</name> <value>0.0.0.0</value> <description>Bind host on which to run the HiveServer2 Thrift interface. Can be overridden by setting $HIVE_SERVER2_THRIFT_BIND_HOST</description> </property> <property> <name>hive.server2.thrift.port</name> <value>10000</value> <description>Port number of HiveServer2 Thrift interface. Can be overridden by setting $HIVE_SERVER2_THRIFT_PORT</description> </property> <property> <name>hive.server2.enable.doAs</name> <value>false</value> <description>Set true to use user who login hiveserver2 for executing hadoop job.Otherwise, use the user who run hiveserver2.</description> </property> </configuration> 安装mysql,创建指定主机能访问的用于hive的的用户及密码,并授予所有权限,如果javax.jdo.option.ConnectionURL属性没有加createDatabaseIfNotExist=true,那么需要手动创建用于hive的数据库 拷贝mysql驱动JAR包到$HIVE_HOME/lib目录下: cp mysql-connector-java-5.1.39-bin.jar $HIVE_HOME/lib/ 执行schematool -initSchema -dbType mysql 下载hive-jdbc-2.1.0-standalone.jar并放入$HIVE_HOME/lib下。(因为使用beeline方式连接hive时需要) 使用以下命令启动hive服务: hive --service hiveserver2 >/dev/null 2>/dev/null & 检查HiveServer是否启动成功的最快捷的方法就是使用netstat命令查看10000端口是否打开并监听连接:netstat -nl|grep 10000 Hive提供了配置变量hive.start.cleanup.scratchdir,默认值是false,将这个属性设置为true的话,那么就会在每次重启HiveServer服务时清理掉临时目录。 如果metastore不在server同一台主机上,需要配置: hive.metastore.local为false hive.metastore.uris为远程metastore服务地址,如:thrift://metastore_server:9083 且需要手动在远程主机上执行hive --service metastore >/dev/null 2>/dev/null & 来启动metastore,可以用netstat -an|grep 9083检查源数据服务是否启动。
大数据技术沙龙——spark核心技术原理透视 大数据技术沙龙——spark核心技术原理透视
企业对大数据人才都有哪些技术要求? 现代社会本身竞争压力就很大,更何况是大数据这样热门的专业,越来越多企业运用大数据技术赚钱的同时也需要更多的大数据人才来拟补职场空缺,那到底企业需要什么样的大数据人才去填满职场空缺呢? 企业对大数据人才都有哪些技术要求? 一、 企业要求大数据人才有专业技术能力 学习大数据这个专业的学员有很多,到底哪些学员可以成为企业青睐的对象呢?当然是有能力的合格大数据人才了,这样的人才企业和社会都很青睐,一个合格的大数据工程师需要具备哪些技能?信息挖掘和处理能力、计算机编程能力、信息分析能力等一系列大数据技术能力,都是企业对大数据人才专业技术方面的要求。企业对人才的大量需求在于需要人才去处理解决大数据在运营中所遇到的疑难杂症,只有能解决问题的大数据人才才是有价值的,更被需要的,也会是企业重用的人才,所以正在学习大数据的学员们,要努力培养自己的专业技能,实现自己的价值。 二、 企业要求大数据人才有实战项目经验 企业在看重大数据人才专业技能的能力之外,也会很看重学员的实战项目经验。了解过大数据的人都知道,学习大数据离不开大数据项目操作,做过项目的学员普遍能力较高,也更熟悉企业项目工作流程,对于这样的大数据人才很多企业都比较青睐也很欢迎。大数据实战项目是学习大数据的最后一个步骤也是相当重要的一个步骤,项目操作一般都是在大数据实验室内进行,并且是多台电脑多名学员一同进行的,这样的操作训练让学员们理论知识学以致用,不仅会提升个人大数据操作能力也会培养学员的团队协作能力。 三、 大数据培训班培养出的大数据人才更受青睐的原因 既然企业更青睐有专业技能和实战经验的学员,那怎样才能培养这样的能力成为一个合格的大数据人才呢? 1、大数据培训班有专业大数据课程和导师 想要培养自己的专业技能,当然要选择合格的课程并且选择有经验的导师授课。为了保证学员学习大数据知识不脱离一线,加米谷大数据课程每半年就要更新一次,针对不同类型的学员也有不同的学习方案,零基础学员没有计算机编程基础要从最基本的javaSE编程开始学习,具有一定的学习基础和能力之后开始转战大数据课程,基础学员入学进行java考核,考核通过即可学习大数据课程,培训周期和培训费用都会相对而言减少; 2.大数据培训班有大数据实战项目 加米谷大数据有完善的课程体系,高质量的培训课程,互动式的培训模式,真实的项目实战。企业需要大数据人才不但要有专业的大数据技能也要求学员具备一定的实战经验,这样的大数据人才在企业才能实现自己的价值,想要实现自己的梦想和价值,加米谷给你们提供舞台!
加米谷大数据|hadoop之hdfs安全模式 namenode启动时,首先将映像文件(fsimage)载入内存,并中兴编辑日志中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage文件(该操作不需要借助namenode)和一个空的编辑日志。此时,namenode开始监听RPC和http请求。但是此刻namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的。(只有访问文件系统元数据的文件系统操作时肯定成功执行的,对于读文件操作,只有集群中当前datanode上的块可用时,才能工作。但文件修改操作,包括写、删或重命名均会失败)在安全模式下namenode并不向datanode发出任何块复制或删除的指令。如果满足“最小副本条件”,namenode会在30秒钟后就退出安全模式,启动一个刚格式化的HDFS集群时,因系统中还没任何块,所以namenode不会进入安全模式。01、进入和离开安全模式 hdfs dfsadmin -safemode get 显示是否处于安全模式 hdfs dfsadmin -safemode wait 一直等到某条命令到来前才退出安全模式 以下可以随时进入或离开安全模式 hdfs dfsadmin -safemode enter 进入安全模式 hdfs dfsadmin -safemode leave 离开安全模式 02、安全模式相关的属性 dfs.replication.min(默认1),成功执行写操作所需创建的最小副本数(也称最小副本级别) dfs.safemode.threshold.pct(默认值0.999),在namenode退出安全模式之前,系统中满足最小副本级别(由dfs.replication.min定义)的块的比例。将这项值设为0或更小会令namenode无法启动安全模式,设为高于1则永远不会退出安全模式。 dfs.safemode.extension(默认值30000),在满足最小副本条件之后,namenode还需处于安全模式的时间(以毫秒为单位),对于小型集群可设为0 成都加米谷大数据科技有限公司是一家专注于大数据人才培养的机构。由来自阿里、华为、京东、星环等国内知名企业的多位技术大牛联合创办,技术底蕴丰厚,勤奋创新,精通主流前沿大数据及人工智能相关技术。 以国家规划大数据产业发展战略为指引,以全国大数据技术和大数据分析人才的培养为使命,以提升就业能力、强化职业技术为目标。面向社会提供大数据、人工智能等前沿技术的培训业务。
首页
1
2
3
4
5
6
下一页