利用Ambari进行hdp小版本升级

* 注意事项:

  • 升级描述:当前HDP版本2.2.0.0,升级版本2.2.6.0;
  • 手动升级(命令行)方式官方文档:http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.2.6/bk_upgrading_hdp_manually/content/ch_upgrade_2_1.html

1. 升级前准备工作

1.1 重启服务* 注:因为上次升级Ambari metrics没有重启服务,所以这次重启所有服务以应用上一次的配置更新;

1.2 备份所有服务的配置文件:

mkdir /root/backup
tar -cvf /root/backup/hdp_config_backup.tar /etc/

1.3 检查 Hive Server 节点端口使用情况,如果端口被占用,需要手动修改;

netstat -anp | grep 1001[01]

1.4 备份 Hive 元数据库

备份
mysqldump hive > /root/backup/backup_hive.sql

还原
mysql hive < /root/backup/backup_hive.sql

1.5 关闭正在运行的 Mapreducecrontab 定时任务、Kill掉所有已经发布的 Storm topology

1.6 将升级安装包解压到YUM主机。

tar -xzvf HDP-2.2.6.0-centos6-rpm.tar.gz
mv HDP /var/www/html/HDP2.2.6

2. 升级

2.1 登录到 Ambari,添加新的HDP版本;

UpgradeSetp_img

http://public-repo-1.hortonworks.com/HDP2.2.6/centos6/2.x/updates/2.2.6.0/
http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6

UpgradeSetp_img

 

2.2 保存后,点击安装,Ambari 将为所有节点安装新的HDP组件;

UpgradeSetp_img
UpgradeSetp_img

2.3 等待安装后,点击更新,Ambari 将为所有节点更新HDP组件;

UpgradeSetp_img

2.4 更新过程中,Ambari 将提示6次需要干预的操作,因为升级前已经准备好了,所以当遇到提示时直接确认即可,整个升级过程将持续1小时左右;

UpgradeSetp_img

升级完成

UpgradeSetp_img

3. 恢复应用服务

3.1 升级完成后,Hive server thrift 端口将改为 10010,所以需要检查相关应用的配置,修改对应的端口参数值;

4. 其他

HDP 升级过程中的提示

  1. Before continuing, please backup the Hive Metastore database located on the following host(s): hadoop002.icccuat.com.
  2. The initial batch of DataNode, RegionServer and NodeManager hosts have been upgraded. You are advised to check the hosts and perform cluster/workload-specific tests against your cluster to ensure proper operation before proceeding with upgrade of the remaining services.
  3. Please note that the HiveServer port will now change to 10010 if hive is using a binary transfer mode or 10011 if hive is using an http transport mode. You can use “netstat -anp | grep 1001[01]” to determine if the port is available on each of following HiveServer host(s): hadoop002.icccuat.com. If the port is not available, the process using it must be terminated.
    Updated ‘hive-site’ with ‘hive.server2.thrift.port=10010’
  4. Before continuing, please deactivate and kill any currently running topologies.
  5. Please rebuild your topology using the new Storm version dependencies and resubmit it using the newly created jar.
  6. Your cluster version has been upgraded. Click on Finalize when you are ready to finalize the upgrade and commit to the new version. You are strongly encouraged to run tests on your cluster to ensure it is fully operational before finalizing. You cannot go back to the original version once the upgrade is finalized.

HDP ambari 的10条使用经验

Hortonworks 使用 ambari 作为其 hadoop 生态圈的管理工具,界面美观,配置方便。以下是我最近使用ambari做hadoop环境配置的时候遇到的一些使用问题,希望对刚接触的童鞋有用。

1.

hbase 启动不起来,通常是因为节点日期不同步。

2.

HDFS 无法启动,通常是因为hdfs 进入了安全模式,需要先退出来,再启动。

3.

repo源的地址是可以随时更改的。

更改路径:admin -> stacks and Versions -> Versions -> 点击框的右上角笔样编辑图标 . 替换对应repo的url即可。

4.

如何删除节点(hosts)

顶部hosts 菜单 -> 点选相应的主机名 -> 右上角 host Actions -> delete host

5.

新增节点如果是基于原有的镜像创建,需要做host cleanup .

如果发现datanode启动,但是不是live , 很可能是新节点和其他节点配置冲突。这也就是为什么要做host cleanup 的原因。

另外,新添加的节点为非live, 不要试图通过调整namenode所在节点来解决,否则问题越来越多。

6.

ambari.repo 指定了ambari的源; 通过在ambari web配置HDP源,自动生成 “HDP*.repo” 文件。

7.

提示 /var/log/ambari-metrics-monitor/ambari-metrics-monitor.out 没有权限修改之类

这个问题,可以采取两种解决办法:

  1. 赋权: chown ams:hadoop  /var/log/ambari-metrics-monitor/ambari-metrics-monitor.out
  2. 在安装ambari metrics monitor 之前,先把这个文件删除。

8.

ambari 界面上的 hdfs balancer 有时不管用。

可以通过手工执行命令来平衡:

 hadoop balancer 

9.

ambari 可以通过 RESTful api 访问,例如:

 curl --user admin:admin http://10.0.2.11:8080/api/v1/clusters

10.

ambari 每个组件的页面中间上方都有外部链接可以指向组件本身的管理和监控页面。

Sqoop框架学习

一、Sqoop基础:连接关系型数据库与Hadoop的桥梁

1.1 Sqoop的基本概念

Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易。Apache Sqoop正在加紧帮助客户将重要数据从数据库移到Hadoop。随着Hadoop和关系型数据库之间的数据移动渐渐变成一个标准的流程,云管理员们能够利用Sqoop的并行批量数据加载能力来简化这一流程,降低编写自定义数据加载脚本的需求。

Apache SqoopSQL-to-Hadoop) 项目旨在协助 RDBMS 与 Hadoop 之间进行高效的大数据交流。用户可以在 Sqoop 的帮助下,轻松地把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中;同时也可以把数据从 Hadoop 系统里抽取并导出到关系型数据库里。因此,可以说Sqoop就是一个桥梁,连接了关系型数据库与Hadoop。

1.2 Sqoop的基本机制

Sqoop中一大亮点就是可以通过hadoop的mapreduce把数据从关系型数据库中导入数据到HDFS。Sqoop架构非常简单,其整合了Hive、Hbase和Oozie,通过map-reduce任务来传输数据,从而提供并发特性和容错。Sqoop的基本工作流程如下图所示:

 

Sqoop在import时,需要制定split-by参数。Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域分配到不同map中。每个map中再处理数据库中获取的一行一行的值,写入到HDFS中(由此也可知,导入导出的事务是以Mapper任务为单位)同时split-by根据不同的参数类型有不同的切分方法,如比较简单的int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来确定划分几个区域。 比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers为2的话,则会分成两个区域(1,500)和(501-100),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。最后每个map各自获取各自SQL中的数据进行导入工作。

二、Sqoop实践:MySQL->HDFS/HDFS->MySQL

2.1 Sqoop的安装配置

(1)下载sqoop安装包:这里使用的是1.4.3版本,已经上传至网盘中(http://pan.baidu.com/s/1pJ7gfxh

(2)解压sqoop安装包:tar -zvxf sqoop-1.4.3.bin__hadoop-1.0.0.tar.gz

(3)设置环境变量:vim /etc/profile ,增加以下内容

export SQOOP_HOME=/usr/local/sqoop
export PATH=.:$HADOOP_HOME/bin:$SQOOP_HOME/bin:$HIVE_HOME/bin:$PIG_HOME/bin:$HBASE_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH

最后是环境变量生效:source /etc/profile

(4)将mysql的jdbc驱动mysql-connector-java-5.1.10.jar复制到sqoop项目的lib目录下:

cp mysql-connector-java-5.1.10.jar /usr/local/sqoop/lib

(5)重命名配置文件:在${SQOOP_HOME}/conf中执行命令

mv sqoop-env-template.sh sqoop-env.sh

(6)【可选】修改配置文件:vim sqoop-env.sh

#Set path to where bin/hadoop is available

export HADOOP_COMMON_HOME=/usr/local/hadoop/

#Set path to where hadoop-*-core.jar is available

export HADOOP_MAPRED_HOME=/usr/local/hadoop

#set the path to where bin/hbase is available export

HBASE_HOME=/usr/local/hbase

#Set the path to where bin/hive is available

export HIVE_HOME=/usr/local/hive

#Set the path for where zookeper config dir is

export ZOOCFGDIR=/usr/local/zookeeper

2.2 数据导入:MySQL->HDFS

这里假设我们已经在hadoop-master服务器中安装了MySQL数据库服务,并使用默认端口3306。需要注意的是,sqoop的数据库驱动driver默认只支持mysql和oracle,如果使用sqlserver的话,需要把sqlserver的驱动jar包放在sqoop的lib目录下,然后才能使用drive参数。

(1)MySQL数据源:mysql中的hive数据库的TBLS表,这里使用学习笔记17《Hive框架学习》里边Hive的数据库表。

(2)使用import命令将mysql中的数据导入HDFS:

首先看看import命令的基本格式:

  sqoop             ##sqoop命令

import             ##表示导入

–connect jdbc:mysql://ip:3306/sqoop    ##告诉jdbc,连接mysql的url

–username root                                     ##连接mysql的用户名

–password admin                                 ##连接mysql的密码

–table mysql1                                        ##从mysql导出的表名称

–fields-terminated-by ‘\t’                        ##指定输出文件中的行的字段分隔符

-m 1                                                       ##复制过程使用1个map作业

–hive-import                                          ##把mysql表数据复制到hive空间中。如果不使用该选项,意味着复制到hdfs中

然后看看如何进行实战:这里将mysql中的TBLS表导入到hdfs中(默认导入目录是/user/<username>)

sqoop import –connect jdbc:mysql://hadoop-master:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’

最后看看是否成功导入了HDFS中:可以看到TBLS表存入了多个map任务所生成的文件中

(3)刚刚看到了默认是由多个map来进行处理生成,可以设置指定数量的map任务。又由于sqoop默认不是追加方式写入,还可以设置其为追加方式写入已有文件末尾:

sqoop import –connect jdbc:mysql://hadoop0:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’  –null-string ‘**’  -m 1 –append

(4)还可以将MySQL中的数据导入Hive中(你设定的hive在hdfs中的存储位置,我这里是/hive/):

首先得删掉刚刚导入到hdfs中的文件数据:

hadoop fs -rmr /user/root/*

然后再通过以下命令导入到hive中:

sqoop import –connect jdbc:mysql://hadoop-master:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’ -m 1 –append  –hive-import

最后看看是否导入到了hive目录(/hive/)中:

(5)还可以对指定数据源进行增量导入:所谓增量打入,就是导入上一次导入后数据源新增的那部分数据,例如:上次导入的数据是id从1~100的数据,那么这次就只导入100以后新增的数据,而不必整体导入,节省了导入时间。下面的命令以TBL_ID字段作为判断标准采用增量导入,并记录上一次的最后一个记录是6,只导入6以后的数据即可。

sqoop import –connect jdbc:mysql://hadoop0:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’  –null-string ‘**’  -m 1 –append  –hive-import  –check-column ‘TBL_ID’ –incremental append –last-value 6

2.3 数据导出:HDFS->MySQL

(1)既然要导出到MySQL,那么首先得要有一张接收从HDFS导出数据的表。这里为了示范,只创建一个最简单的数据表TEST_IDS,只有一个int类型的ID字段。

(2)使用export命令进行将数据从HDFS导出到MySQL中,可以看看export命令的基本格式:

sqoop

export                                        ##表示数据从hive复制到mysql中

–connect jdbc:mysql://ip:3306/sqoop   ##告诉jdbc,连接mysql的url

–username root          ##连接mysql的用户名

–password admin        ##连接mysql的密码

–table mysql2                                        ##mysql中的表,即将被导入的表名称

–export-dir ‘/user/root/warehouse/mysql1’  ##hive中被导出的文件目录

–fields-terminated-by ‘\t’    ##hive中被导出的文件字段的分隔符

 

注意:导出的数据表必须是事先存在的  

(3)准备一个符合数据表规范的文件ids并上传到HDFS中,作为导出到MySQL的数据源:这个ids里边只有10个数字

复制代码
1
2
3
4
5
6
7
8
9
10
复制代码

(4)export实战:将HDFS中的ids导出到mysql中的TEST_IDS数据表中

sqoop export –connect jdbc:mysql://hadoop-master:3306/hive  –username root –password admin –table TEST_IDS –fields-terminated-by ‘\t’ –export-dir ‘/testdir/input/ids’

最后查看是否导入到了mysql中的TEST_IDS数据表中:

2.4 创建job,运行job

刚刚我们使用了import和export命令进行了常规的导入导出操作,但是每次都要我们使用那么长的命令不太容易记忆。于是,我们可以将其创建为一个job,每次需要使用时只需要记住job名,运行job即可。

这里以导入为例,创建一个job名为myjob1的job:

sqoop job –create myjob1  — import –connect jdbc:mysql://hadoop-master:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’  -m 1 –append

可以通过命令查看是否存在job:sqoop job –list

执行刚刚创建的job:

sqoop job –exec myjob1

但是,我们发现上面的设置后还需要我们输入密码,这样便无法做到真正的自动执行job。

于是,我们做一点小小的配置(hive-site.xml)修改:将下面的xml配置的注释移除即可

复制代码
  <!--  -->
  <property>
    <name>sqoop.metastore.client.record.password</name>
    <value>true</value>
    <description>If true, allow saved passwords in the metastore.
    </description>
  </property>
复制代码

移除之后,还需要将刚刚那个job删除掉,重新创建job后才可以无密码自动执行。

sqoop job –delete myjob1

sqoop job –create myjob1 — import –connect jdbc:mysql://hadoop-master:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’  -m 1 –append

sqoop job –exec myjob1

出处:http://www.cnblogs.com/edisonchou/

Sqoop——数据传输工具

一、Sqoop简介与部署

  1. Sqoop是一款开源的工具,主要用于在HADOOP不传统的数据库(mysql、postgresql等)进行数据的传递,可以将一个关系型数据库(例如:MySQL、Oracle、Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
    Sqoop中一大亮点就是可以通过hadoop的mapreduce把数据从关系型数据库中导入数据到HDFS。
  2. Sqoop1架构

    QQ截图20160120182115.jpg-121.6kB

    • 版本号为1.4.x为sqoop1
    • 在架构上:sqoop1使用sqoop客户端直接提交的方式
    • 访问方式:CLI控制台方式进行访问
    • 安全性:命令或脚本中指定用户数据库名及密码
  3. Sqoop2架构

    QQ截图20160120182204.jpg-110.8kB

    • 版本号为1.99x为sqoop2
    • 在架构上:sqoop2引入了sqoop server,对connector实现了集
      中的管理
    • 访问方式:REST API、 JAVA API、 WEB UI以及CLI控制台方式进
      行访问
    • CLI方式访问,会通过交互过程界面,输入的密码信息丌被看到,
      同时Sqoop2引入基亍角色的安全机制

    Sqoop2比Sqoop多了一个Server端。

  4. Sqoop1与Sqoop2对比

    QQ截图20160120182356.jpg-221.6kB

  5. Sqoop验证安装
    1. [root@master bin]# sqoop help
    2. Warning: /opt/cloudera/parcels/CDH-5.3.8-1.cdh5.3.8.p0.5/bin/../lib/sqoop/../accumulo does not exist! Accumulo imports will fail.
    3. Please set $ACCUMULO_HOME to the root of your Accumulo installation.
    4. 16/01/20 18:31:21 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.3.8
    5. usage: sqoop COMMAND [ARGS]
    6. Available commands:
    7. codegen Generate code to interact with database records
    8. create-hive-table Import a table definition into Hive
    9. eval Evaluate a SQL statement and display the results
    10. export Export an HDFS directory to a database table
    11. help List available commands
    12. import Import a table from a database to HDFS
    13. import-all-tables Import tables from a database to HDFS
    14. import-mainframe Import datasets from a mainframe server to HDFS
    15. job Work with saved jobs
    16. list-databases List available databases on a server
    17. list-tables List available tables in a database
    18. merge Merge results of incremental imports
    19. metastore Run a standalone Sqoop metastore
    20. version Display version information
    21. See 'sqoop help COMMAND' for information on a specific command

      测试Sqoop导入/导出MySQL

      1. 准备环境
        • mysql-connector-java
          mysql-connector-java-5.1.34-bin.jar放入sqoop/lib/下面(低于此版本mysql连接器可能会有异常)
        • mysql数据库允许远程连接
          Linux下执行mysql命令登录测试是否mysql允许远程访问:
          mysql –h mysql-server-ip –u username –p database
          如果没有权限,在mysql命令行中执行:
          grant all PRIVILEGES on *.* to root@’hostname’ identified by ‘password’; flush privileges;
        • 测试sqoop是否可以连接到mysql
          Sqoop测试命令,显示当前可用的数据库:
          sqoop list-databases --connect jdbc:mysql://mysql-server-ip:3306/ --username root --password <password>

          1. # 将mysql-*.jar放入sqoop目录中
          2. [root@master tmp]# cp mysql-connector-java-5.1.35.jar /opt/cloudera/parcels/CDH-5.3.8-1.cdh5.3.8.p0.5/lib/sqoop
          3. [root@master tmp]# cp mysql-connector-java-5.1.35.jar /opt/cloudera/parcels/CDH-5.3.8-1.cdh5.3.8.p0.5/lib/sqoop2
          4. # 用sqoop查看数据库
          5. [root@master tmp]# sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password root
          6. Warning: /opt/cloudera/parcels/CDH-5.3.8-1.cdh5.3.8.p0.5/bin/../lib/sqoop/../accumulo does not exist! Accumulo imports will fail.
          7. Please set $ACCUMULO_HOME to the root of your Accumulo installation.
          8. 16/01/20 20:47:19 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.3.8
          9. 16/01/20 20:47:19 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
          10. 16/01/20 20:47:20 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
          11. information_schema
          12. cm
          13. hive
          14. mysql
          15. navigator_audit_server
          16. navigator_metadata_server
          17. reports_manager
          18. test
          19. # 用于测试的数据库表结构及数据内容
          20. mysql> use test
          21. Reading table information for completion of table and column names
          22. You can turn off this feature to get a quicker startup with -A
          23. Database changed
          24. mysql> describe user_info;
          25. +--------+--------------+------+-----+---------+----------------+
          26. | Field | Type | Null | Key | Default | Extra |
          27. +--------+--------------+------+-----+---------+----------------+
          28. | id | int(11) | NO | PRI | NULL | auto_increment |
          29. | name | varchar(100) | YES | | NULL | |
          30. | gender | varchar(10) | YES | | NULL | |
          31. | grade | int(20) | YES | | NULL | |
          32. +--------+--------------+------+-----+---------+----------------+
          33. 4 rows in set (0.00 sec)
          34. mysql> select * from user_info;
          35. +----+----------+--------+-------+
          36. | id | name | gender | grade |
          37. +----+----------+--------+-------+
          38. | 1 | redskirt | m | 100 |
          39. | 2 | honey | m | 90 |
          40. | 3 | lw | m | 92 |
          41. | 4 | nicholas | m | 99 |
          42. | 5 | sasaki | m | 99 |
          43. +----+----------+--------+-------+
          44. 5 rows in set (0.00 sec)
      2. mysql数据导入HDFS
        • 全表导入(单map串行导入)
        1. sqoop import --connect jdbc:mysql://mysql-serverip:3306/sqoop --username root --password root --table user_info -m 1

        参数解析:
        --connect:JDBC连接URL
        --username:连接数据库用户名
        --password:连接数据库密码
        --table:要读取的表
        -m:map并行读取的数量
        含义:读取user_info表数据到HDFS集群,并叧通过一个map任务
        注意:此Sqoop命令没有指定HDFS目录,默认数据会放在/user/{user.name}/{–table参数指定表名}目录下。

        1. [root@master tmp]# sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user_info -m 1
        2. mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
        3. Query OK, 0 rows affected (0.06 sec)
        4. mysql> flush privileges;
        5. Query OK, 0 rows affected (0.02 sec)

        在YARN上可看到完成的MapReduce任务

      3. QQ截图20160120213128.png-59.2kB
      4. # HDFS中查看结果
      5. [root@master tmp]# hadoop fs -cat /user/root/user_info/part-m-00000
      6. 1,redskirt,m,100
      7. 2,honey,m,90
      8. 3,lw,m,92
      9. 4,nicholas,m,99
      10. 5,sasaki,m,99
  • Select语句导入
  1. sqoop import --connect jdbc:mysql://mysql-serverip:3306/test --username root --password root --query 'select * from user_info where id <5 and $CONDITIONS' --split-by id --target-dir /user/root/mysql/user_info -m 2

参数解析:
--query: 导入过程使用SQL语句
--split-by:表中的那一列作为任务分配列并列:有id列1,2,3,4, 5,6,-m选项为2,那么将分为1,2,3记录通过一个map任务来执行,4,5,6,通过另一个map任务来执行
--target-dir: 指定HDFS上存放数据目录
where $CONDITIONS: 当使用--query的时候需要有$CONDITIONS

  1. [root@master tmp]# sqoop import --connect jdbc:mysql://master:3306/test --username root --password root --query 'select * from user_info where id <5 and $CONDITIONS' --split-by id --target-dir /user/root/mysql/user_info -m 2
  2. # 查看导入结果
  3. [root@master tmp]# hadoop fs -cat /user/root/mysql/user_info/part-m-00000
  4. 1,redskirt,m,100
  5. 2,honey,m,90

QQ截图20160121000902.png-61.4kB

    • Select语句导入空值处理
    1. sqoop import --connect jdbc:mysql://mysql-serverip:3306/sqoop --username root --password root --query 'select * from user_info where $CONDITIONS' --split-by id --target-dir /data/sqoop/mysql/user_info -m 2 --null-string '' --null-non-string ''

    参数解析:
    当从数据库中拉取过来的数据存在空值,默认Sqoop会设置为null,通过下面参数,来替换null值。
    举例语句中,null值,设置为了空:
    --null-string:string类型替换为第一个”中指定的值
    --null-non-string:非string类型替换为第二个”中指定的值

    1. mysql> select * from user_info;
    2. +----+----------+--------+-------+
    3. | id | name | gender | grade |
    4. +----+----------+--------+-------+
    5. | 1 | redskirt | m | 100 |
    6. | 2 | honey | m | 90 |
    7. | 3 | lw | m | 92 |
    8. | 4 | nicholas | m | 99 |
    9. | 5 | sasaki | m | 99 |
    10. | 6 | NULL | NULL | NULL |
    11. +----+----------+--------+-------+
    12. 6 rows in set (0.00 sec)
    13. [root@master tmp]# hadoop fs -rmr /user/root/mysql/user_info
    14. [root@master tmp]# sqoop import --connect jdbc:mysql://master:3306/test --username root --password root --query 'select * from user_info where $CONDITIONS' --split-by id --target-dir /user/root/mysql/user_info -m 2 --null-string '' --null-non-string ''
    15. [root@master tmp]# hadoop fs -cat /user/root/mysql/user_info/part-m-00000
    16. 1,redskirt,m,100
    17. 2,honey,m,90
    18. 3,lw,m,92
    19. [root@master tmp]# hadoop fs -cat /user/root/mysql/user_info/part-m-00001
    20. 4,nicholas,m,99
    21. 5,sasaki,m,99
    22. 6,,,
    • 导入库下所有语句
    1. sqoop import-all-tables --connect jdbc:mysql://mysql-serverip:3306/sqoop --username root --password root

    参数解析:
    import-all-tables:导入指定库下面所有的表

    1. [root@master tmp]# hadoop fs -rmr /user/root/user_info
    2. [root@master tmp]# sqoop import-all-tables --connect jdbc:mysql://master:3306/test --username root --password root

    QQ截图20160121111208.jpg-241.4kB

    • 指定某些列导入HDFS
    1. sqoop import --connect jdbc:mysql://master:3306/test --username root --password root --table user_info --target-dir /user/root/user_info -m 1 --null-string '' --null-non-string '' --columns id,name

    参数解析:
    --columns:指定导出哪几列

    1. [root@master tmp]# hadoop fs -rmr /user/root/user_info
    2. [root@master tmp]# sqoop import --connect jdbc:mysql://master:3306/test --username root --password root --table user_info --target-dir /user/root/user_info -m 1 --null-string '' --null-non-string '' --columns id,name
    3. [root@master tmp]# hadoop fs -cat /user/root/user_info/part-m-00000
    4. 1,redskirt
    5. 2,honey
    6. 3,lw
    7. 4,nicholas
    8. 5,sasaki
    9. 6,
  1. HDFS数据导入mysql
    • 数据导出到mysql表
    1. sqoop export --connect jdbc:mysql://mysql-serverip:3306/test --username root --password root --table user_info_ --fields-terminated-by ',' --export-dir /user/root/mysql/user_info --input-null-string '' --input-null-non-string ''

    参数解析:
    export:从HDFS导出mysql(或其他RDBMS)
    --table:mysql当中表
    --fields-terminated-by:源数据字段分隔符
    --export-dir:源数据HDFS上位置

    1. # 创建目标表结构
    2. mysql> use test;
    3. Reading table information for completion of table and column names
    4. You can turn off this feature to get a quicker startup with -A
    5. Database changed
    6. mysql> create table if not exists user_info_(
    7. -> id int(11) not null primary key auto_increment,
    8. -> name varchar(50)
    9. -> );
    10. Query OK, 0 rows affected (0.00 sec)
    11. # 执行导出
    12. [root@master tmp]# sqoop export --connect jdbc:mysql://master:3306/test --username root --password root --table user_info_ --fields-terminated-by ',' --export-dir /user/root/mysql/user_info --input-null-string '' --input-null-non-string ''
    13. # 查看数据库
    14. mysql> select * from user_info_;
    15. +----+----------+
    16. | id | name |
    17. +----+----------+
    18. | 1 | redskirt |
    19. | 2 | honey |
    20. | 3 | lw |
    21. | 4 | nicholas |
    22. | 5 | sasaki |
    23. | 6 | NULL |
    24. +----+----------+
    25. 6 rows in set (0.00 sec)
    • Batch模式数据导入到mysql表
    1. sqoop export -Dsqoop.export.records.per.statement=10 -- connect jdbc:mysql://mysql-server-ip:3306/sqoop --username root --password root --table user_info_bak --fields-terminatedby ',' --export-dir /user/root/mysql/user_info

    参数解析
    --Dsqoop.export.records.per.statement=10指定每10条数据执行一次insert类似 INSERT INTO xxx VALUES (), (), (), …
    或是
    --Dsqoop.export.records.per.transaction=10指定每次事务多少条记录被insert,类似BEGIN; INSERT, INSERT, …. COMMIT

    • HDFS数据对mysql表做更新
    1. sqoop export --connect jdbc:mysql://mysql-serverip:3306/sqoop --username sqoop --password sqoop --table user_info_bak --update-key id --fields-terminated-by ',' --export-dir /user/root/mysql/user_info

    参数解析
    --update-key id指定根据那个列进行更新,也可指定多列,用逗号分隔。
    相当于:

    1. update user_info_bak set name=‘xxx’… where id=“1’;
    2. update user_info_bak set name=‘ yyy’… where id=“2’;
    • HDFS导出mysql表空值处理
    1. sqoop export --connect jdbc:mysql://mysql-serverip:3306/sqoop --username sqoop --password sqoop --table user_info --input-null-string '' --input-null-non-string ''

    参数解析
    同导入的含义相同
    --input-null-string:会被翻译成数据库中string列NULL的值
    --input-null-non-string:被翻译成数据库中非string列NULL的值

三、导入Hbase,Hive场景

  1. mysql数据导入Hive
    • mysql直接导入到hive
    1. sqoop import --connect jdbc:mysql://master:3306/tmpbase --username root --password password --table user_info --hive-import -hive-database default --hive-table user_info_bak

    参数解析:
    --hive-import:该次导入任务为导向hive
    --hive-table:要导入的hive表
    --hive-database:导入的hive库
    注意两边表结构要一致

  2. mysql数据导入Hbase
    • mysql直接导入到hbase
    1. sqoop import --connect jdbc:mysql://master:3306/tmpbase --username root --password password --table user_info --hbase-table user_info --column-family f --hbase-createtable

    参数解析:
    --hbase-table:要导入的hbase表
    --column-family:指定hbase表中列族
    --hbase-create-table:如果HBase表没有创建,自行创建
    注意:实际使用效率较差,小数据量情况下使用(100百万以下数据,可以尝试使用)

    • Mysql bulk load方式导入到hbase
    1. sqoop import --connect jdbc:mysql://master:3306/tmpbase --username root --password password --table user_info --hbase-table user_info --column-family f --hbase-createtable --hbase-bulkload

    参数解析:
    --hbase-table:要导入的hbase表
    --column-family:指定hbase表中列族
    --hbase-create-table:如果HBase表没有创建,自劢创建
    --hbase-bulkload:以bulkload方式导入HBase,而非直接put

四、Sqoop增量导入

  1. Sqoop Append增量模式
    ppend模式:追加模式,必须是数值字段(1,2,3,4)
    适用范围:有自增序列

    1. sqoop import --connect jdbc:mysql://mysql-serverip:3306/sqoop --username root --password root --query 'select * from user_info where $CONDITIONS' --split-by id --target-dir /data/sqoop/ -m 1 --incremental append -- check-column grade --last-value 80

    参数解析:
    --incremental:指定sqoop增量模式
    --check-column:指定增量的列
    --last-value:指定列值从那一行开始

  2. Sqoop Lastmodified增量模式
    Lastmodified模式:根据时间戳更新模式。
    适用范围:有自增序列

    1. sqoop import --connect jdbc:mysql://msyql-serverip:3306/sqoop --username root --password root --query 'select * from user_info where $CONDITIONS' --split-by id --target-dir /data/sqoop -m 1 --incremental lastmodified --check-column c_date --append --last-value '2015-03-05 01:16:18'

    参数解析:
    --incremental:指定sqoop增量模式
    --check-column:指定增量的列(datatime类型)
    --last-value:指定从那一段时间到当前开始
    --c_date:datetime

五、Sqoop Job定义

  1. Sqoop定义任务
    • 定义user_info Job
    1. sqoop job --create user_info -- import --connect jdbc:mysql://mysql-server-ip:3306/sqoop --username root --password root --table user_info -m 1

    参数解析:
    sqoop job –create:将创建一个Job名字为user_info

  2. Sqoop执行任务及修改Job参数
    • 执行定义的 Job
    1. sqoop job -exec user_info

    参数解析:
    sqoop job -exec:将执行已经定义好的user_info覆盖定义Job的默认参数
    sqoop job -exec user_info -- -m 3:覆盖之前存在的参数-m 1为-m 3

解决zookeeper问题:Error contacting service. It is probably not running

今天部署了一个3台机器的zookeepe集群后,查看机器的集群状态时出现问题,截图如下:

Image
实际上,这个集群是正确启动的,我从每个机器的日志里看到了集群的选举过程和最终结果,知道谁是leader,并且某些zk目录节点已经被应用写成功了 。从这个情况来看,应该是集群成功启动了,但是zkServer.sh status无法执行成功。
在网上搜了下,有以下几种说法:
1 zkServer.sh里的nc命令有问题
可能是机器上没有安装nc命令,还有种说法是在zkServer.sh里找到这句:
STAT=`echo stat | nc localhost $(grep clientPort “$ZOOCFG” | sed -e ‘s/.*=//’) 2> /dev/null| grep Mode`

在nc与localhost之间加上 -q 1 (是数字1而不是字母l)

可是我的zookeeper版本是3.4.6,zkServer.sh里根本没有这一句(获取状态的语句没有用nc命令)
2 日志目录没有创建
这种说法是因为zoo.cfg文件指定了zookeeper日志目录,但是这个目录需要自己先手工创建好,如果没有先创建好,则会出现问题。
但是,我的zookeeper日志目录是提前创建好的,日志文件里已经有内容了,而且没有出现任何错误。
看来我只能自己想办法解决。zookeeper 3.4.6执行zkServer.sh status命令时,获取当前机器状态的语句是这样的:
    STAT=`”$JAVA” “-Dzookeeper.log.dir=${ZOO_LOG_DIR}” “-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}” \
-cp “$CLASSPATH” $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain \
$clientPortAddress $clientPort srvr 2> /dev/null    \
| grep Mode`
如果STAT变量为空,则会显示:
Error contacting service. It is probably not running.
然后退出,代码如下:
    if [ “x$STAT” = “x” ]
then
echo “Error contacting service. It is probably not running.”
exit 1
else
echo $STAT
exit 0
fi
利用shell的debug模式,这段代码执行过程如下:
++ grep Mode
++ /usr/local/java/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp ‘/usr/local/zookeeper-3.4.6/bin/../build/classes:/usr/local/zookeeper-3.4.6/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../conf:’ org.apache.zookeeper.client.FourLetterWordMain localhost $’2182\r’ srvr
+ STAT=
+ ‘[‘ x = x ‘]’
+ echo ‘Error contacting service. It is probably not running.’
Error contacting service. It is probably not running.
+ exit 1
可见STAT变量确实为空,导致输出Error contacting service. It is probably not running.并且退出。
“$JAVA” “-Dzookeeper.log.dir=${ZOO_LOG_DIR}” “-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}” \
-cp “$CLASSPATH” $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain \
$clientPortAddress $clientPort srvr 2> /dev/null
在执行过程中实际的命令如下:
/usr/local/java/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp ‘/usr/local/zookeeper-3.4.6/bin/../build/classes:/usr/local/zookeeper-3.4.6/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../conf:’ org.apache.zookeeper.client.FourLetterWordMain localhost $’2182\r’ srvr
于是,我直接执行了这一段命令,终于发现一些问题,如下图所示:
Image1
执行过程中报出异常:
in thread “main” java.lang.NumberFormatException: For input string: “2182
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at org.apache.zookeeper.client.FourLetterWordMain.main(FourLetterWordMain.java:76)
看来应该是端口号:$’2182\r’造成的,这不是一个合法的数字。端口号$’2182\r’是怎么来的呢?在zkServer.sh里有这么一句:
clientPort=`grep “^[[:space:]]*clientPort[^[:alpha:]]” “$ZOOCFG” | sed -e ‘s/.*=//’`
grep “^[[:space:]]*clientPort[^[:alpha:]]” “$ZOOCFG” | sed -e ‘s/.*=//’在执行过程中,实际命令如下:
grep ‘^[[:space:]]*clientPort[^[:alpha:]]’ /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg | sed -e ‘s/.*=//’
单独执行这行命令,实际上执行结果的确是2182这个纯数字,不知道为什么整个zkServer.sh执行时,clientPort变成了$’2182\r’。因为时间比较紧,这个问题就暂时放下。我直接将clientPort=`grep “^[[:space:]]*clientPort[^[:alpha:]]” “$ZOOCFG” | sed -e ‘s/.*=//’`改为clientPort=”2182″,因为我的zookeeper端口不是2181而是2182。

大数据究竟是什么?

在写这篇文章之前,我发现身边很多IT人对于这些热门的新技术、新趋势往往趋之若鹜却又很难说的透彻,如果你问他大数据和你有什么关系?估计很少能 说出一二三来。究其原因,一是因为大家对新技术有着相同的原始渴求,至少知其然在聊天时不会显得很“土鳖”;二是在工作和生活环境中真正能参与实践大数据 的案例实在太少了,所以大家没有必要花时间去知其所以然。

我希望有些不一样,所以对该如何去认识大数据进行了一番思索,包括查阅了资料,翻阅了最新的专业书籍,但我并不想把那些零散的资料碎片或不同理解论述简单规整并堆积起来形成毫无价值的转述或评论,我很真诚的希望进入事物探寻本质。

如果你说大数据就是数据大,或者侃侃而谈4个V,也许很有深度的谈到BI或预测的价值,又或者拿Google和Amazon举例,技术流可能会聊起 Hadoop和Cloud Computing,不管对错,只是无法勾勒对大数据的整体认识,不说是片面,但至少有些管窥蠡测、隔衣瘙痒了。……也许,“解构”是最好的方法。

怎样结构大数据?

首先,我认为大数据就是互联网发展到现今阶段的一种表象或特征而已,没有必要神话它或对它保持敬畏之心,在以云计算为代表的技术创新大幕的衬托下,这些原本很难收集和使用的数据开始容易被利用起来了,通过各行各业的不断创新,大数据会逐步为人类创造更多的价值。

其次,想要系统的认知大数据,必须要全面而细致的分解它,我着手从三个层面来展开:

36大数据

第一层面是理论,理论是认知的必经途径,也是被广泛认同和传播的基线。我会从大数据的特征定义理解行业对大数据的整体描绘和定性;从对大数据价值的 探讨来深入解析大数据的珍贵所在;从对大数据的现在和未来去洞悉大数据的发展趋势;从大数据隐私这个特别而重要的视角审视人和数据之间的长久博弈。

第二层面是技术,技术是大数据价值体现的手段和前进的基石。我将分别从云计算、分布式处理技术、存储技术和感知技术的发展来说明大数据从采集、处理、存储到形成结果的整个过程。

第三层面是实践,实践是大数据的最终价值体现。我将分别从互联网的大数据,政府的大数据,企业的大数据和个人的大数据四个方面来描绘大数据已经展现的美好景象及即将实现的蓝图。

 和大数据相关的理论

Ø 特征定义

最早提出大数据时代到来的是麦肯锡:“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。人们对于海量数据的挖掘和运用,预示着新一波生产率增长和消费者盈余浪潮的到来。”

业界(IBM 最早定义)将大数据的特征归纳为4个“V”(量Volume,多样Variety,价值Value,速Velocity),或者说特点有四个层面:第一, 数据体量巨大。大数据的起始计量单位至少是P(1000个T)、E(100万个T)或Z(10亿个T);第二,数据类型繁多。比如,网络日志、视频、图 片、地理位置信息等等。第三,价值密度低,商业价值高。第四,处理速度快。最后这一点也是和传统的数据挖掘技术有着本质的不同。

其实这些V并不能真正说清楚大数据的所有特征,下面这张图对大数据的一些相关特性做出了有效的说明。

36大数据

古语云:三分技术,七分数据,得数据者得天下。先不论谁说的,但是这句话的正确性已经不用去论证了。维克托·迈尔-舍恩伯格在《大数据时代》一书中 举了百般例证,都是为了说明一个道理:在大数据时代已经到来的时候要用大数据思维去发掘大数据的潜在价值。书中,作者提及最多的是Google如何利用人 们的搜索记录挖掘数据二次利用价值,比如预测某地流感爆发的趋势;Amazon如何利用用户的购买和浏览历史数据进行有针对性的书籍购买推荐,以此有效提 升销售量;Farecast如何利用过去十年所有的航线机票价格打折数据,来预测用户购买机票的时机是否合适。

那么,什么是大数据思维?维克托·迈尔-舍恩伯格认为,1-需要全部数据样本而不是抽样;2-关注效率而不是精确度;3-关注相关性而不是因果关系。

阿里巴巴的王坚对于大数据也有一些独特的见解,比如,

“今天的数据不是大,真正有意思的是数据变得在线了,这个恰恰是互联网的特点。”
“非互联网时期的产品,功能一定是它的价值,今天互联网的产品,数据一定是它的价值。”
“你千万不要想着拿数据去改进一个业务,这不是大数据。你一定是去做了一件以前做不了的事情。”

特别是最后一点,我是非常认同的,大数据的真正价值在于创造,在于填补无数个还未实现过的空白。

有人把数据比喻为蕴藏能量的煤矿。煤炭按照性质有焦煤、无烟煤、肥煤、贫煤等分类,而露天煤矿、深山煤矿的挖掘成本又不一样。与此类似,大数据并不在“大”,而在于“有用”。价值含量、挖掘成本比数量更为重要。

Ø 价值探讨

大数据是什么?投资者眼里是金光闪闪的两个字:资产。比如,Facebook上市时,评估机构评定的有效资产中大部分都是其社交网站上的数据。

如果把大数据比作一种产业,那么这种产业实现盈利的关键,在于提高对数据的“加工能力”,通过“加工”实现数据的“增值”。

Target 超市以20多种怀孕期间孕妇可能会购买的商品为基础,将所有用户的购买记录作为数据来源,通过构建模型分析购买者的行为相关性,能准确的推断出孕妇的具体临盆时间,这样Target的销售部门就可以有针对的在每个怀孕顾客的不同阶段寄送相应的产品优惠卷。

Target的例子是一个很典型的案例,这样印证了维克托·迈尔-舍恩伯格提过的一个很有指导意义的观点:通过找出一个关联物并监控它,就可以预测 未来。Target通过监测购买者购买商品的时间和品种来准确预测顾客的孕期,这就是对数据的二次利用的典型案例。如果,我们通过采集驾驶员手机的GPS 数据,就可以分析出当前哪些道路正在堵车,并可以及时发布道路交通提醒;通过采集汽车的GPS位置数据,就可以分析城市的哪些区域停车较多,这也代表该区 域有着较为活跃的人群,这些分析数据适合卖给广告投放商。

不管大数据的核心价值是不是预测,但是基于大数据形成决策的模式已经为不少的企业带来了盈利和声誉。

从大数据的价值链条来分析,存在三种模式:

1- 手握大数据,但是没有利用好;比较典型的是金融机构,电信行业,政府机构等。

2- 没有数据,但是知道如何帮助有数据的人利用它;比较典型的是IT咨询和服务企业,比如,埃森哲,IBM,Oracle等。

3- 既有数据,又有大数据思维;比较典型的是Google,Amazon,Mastercard等。

未来在大数据领域最具有价值的是两种事物:1-拥有大数据思维的人,这种人可以将大数据的潜在价值转化为实际利益;2-还未有被大数据触及过的业务领域。这些是还未被挖掘的油井,金矿,是所谓的蓝海。

Wal-Mart作为零售行业的巨头,他们的分析人员会对每个阶段的销售记录进行了全面的分析,有一次他们无意中发现虽不相关但很有价值的数据,在 美国的飓风来临季节,超市的蛋挞和抵御飓风物品竟然销量都有大幅增加,于是他们做了一个明智决策,就是将蛋挞的销售位置移到了飓风物品销售区域旁边,看起 来是为了方便用户挑选,但是没有想到蛋挞的销量因此又提高了很多。

还有一个有趣的例子,1948年辽沈战役期间,司令员林彪要求每天要进行例常的“每日军情汇报”,由值班参谋读出下属各个纵队、师、团用电台报告的 当日战况和缴获情况。那几乎是重复着千篇一律枯燥无味的数据:每支部队歼敌多少、俘虏多少;缴获的火炮、车辆多少,枪支、物资多少……有一天,参谋照例汇 报当日的战况,林彪突然打断他:“刚才念的在胡家窝棚那个战斗的缴获,你们听到了吗?”大家都很茫然,因为如此战斗每天都有几十起,不都是差不多一模一样 的枯燥数字吗?林彪扫视一周,见无人回答,便接连问了三句:“为什么那里缴获的短枪与长枪的比例比其它战斗略高?”“为什么那里缴获和击毁的小车与大车的 比例比其它战斗略高?”“为什么在那里俘虏和击毙的军官与士兵的比例比其它战斗略高?”林彪司令员大步走向挂满军用地图的墙壁,指着地图上的那个点说: “我猜想,不,我断定!敌人的指挥所就在这里!”果然,部队很快就抓住了敌方的指挥官廖耀湘,并取得这场重要战役的胜利。

这些例子真实的反映在各行各业,探求数据价值取决于把握数据的人,关键是人的数据思维;与其说是大数据创造了价值,不如说是大数据思维触发了新的价值增长。

Ø 现在和未来

我们先看看大数据在当下有怎样的杰出表现:

  • 大数据帮助政府实现市场经济调控、公共卫生安全防范、灾难预警、社会舆论监督;
  • 大数据帮助城市预防犯罪,实现智慧交通,提升紧急应急能力;
  • 大数据帮助医疗机构建立患者的疾病风险跟踪机制,帮助医药企业提升药品的临床使用效果,帮助艾滋病研究机构为患者提供定制的药物;
  • 大数据帮助航空公司节省运营成本,帮助电信企业实现售后服务质量提升,帮助保险企业识别欺诈骗保行为,帮助快递公司监测分析运输车辆的故障险情以提前预警维修,帮助电力公司有效识别预警即将发生故障的设备;
  • 大数据帮助电商公司向用户推荐商品和服务,帮助旅游网站为旅游者提供心仪的旅游路线,帮助二手市场的买卖双方找到最合适的交易目标,帮助用户找到最合适的商品购买时期、商家和最优惠价格;
  • 大数据帮助企业提升营销的针对性,降低物流和库存的成本,减少投资的风险,以及帮助企业提升广告投放精准度;
  • 大数据帮助娱乐行业预测歌手,歌曲,电影,电视剧的受欢迎程度,并为投资者分析评估拍一部电影需要投入多少钱才最合适,否则就有可能收不回成本;
  • 大数据帮助社交网站提供更准确的好友推荐,为用户提供更精准的企业招聘信息,向用户推荐可能喜欢的游戏以及适合购买的商品。

其实,这些还远远不够,未来大数据的身影应该无处不在,就算无法准确预测大数据终会将人类社会带往到哪种最终形态,但我相信只要发展脚步在继续,因大数据而产生的变革浪潮将很快淹没地球的每一个角落。

比如,Amazon的最终期望是:“最成功的书籍推荐应该只有一本书,就是用户要买的下一本书。”

Google也希望当用户在搜索时,最好的体验是搜索结果只包含用户所需要的内容,而这并不需要用户给予Google太多的提示。

而当物联网发展到达一定规模时,借助条形码、二维码、RFID等能够唯一标识产品,传感器、可穿戴设备、智能感知、视频采集、增强现实等技术可实现 实时的信息采集和分析,这些数据能够支撑智慧城市,智慧交通,智慧能源,智慧医疗,智慧环保的理念需要,这些都所谓的智慧将是大数据的采集数据来源和服务 范围。

未来的大数据除了将更好的解决社会问题,商业营销问题,科学技术问题,还有一个可预见的趋势是以人为本的大数据方针。人才是地球的主宰,大部分的数据都与人类有关,要通过大数据解决人的问题。

比如,建立个人的数据中心,将每个人的日常生活习惯,身体体征,社会网络,知识能力,爱好性情,疾病嗜好,情绪波动……换言之就是记录人从出生那一刻起的每一分每一秒,将除了思维外的一切都储存下来,这些数据可以被充分的利用:

  • 医疗机构将实时的监测用户的身体健康状况;
  • 教育机构更有针对的制定用户喜欢的教育培训计划;
  • 服务行业为用户提供即时健康的符合用户生活习惯的食物和其它服务;
  • 社交网络能为你提供合适的交友对象,并为志同道合的人群组织各种聚会活动;
  • 政府能在用户的心理健康出现问题时有效的干预,防范自杀,刑事案件的发生;
  • 金融机构能帮助用户进行有效的理财管理,为用户的资金提供更有效的使用建议和规划;
  • 道路交通、汽车租赁及运输行业可以为用户提供更合适的出行线路和路途服务安排;

……

当然,上面的一切看起来都很美好,但是否是以牺牲了用户的自由为前提呢?只能说当新鲜事物带来了革新的同时也同样带来了“病菌”。比如,在手机未普 及前,大家喜欢聚在一起聊天,自从手机普及后特别是有了互联网,大家不用聚在一起也可以随时随地的聊天,只是“病菌”滋生了另外一种情形,大家慢慢习惯了 和手机共渡时光,人与人之间情感交流仿佛永远隔着一张“网”。

Ø 大数据隐私

你或许并不敏感,当你在不同的网站上注册了个人信息后,可能这些信息已经被扩散出去了,当你莫名其妙的接到各种邮件,电话,短信的滋扰时,你不会想 到自己的电话号码,邮箱,生日,购买记录,收入水平,家庭住址,亲朋好友等私人信息早就被各种商业机构非法存储或贱卖给其它任何有需要的企业或个人了。

更可怕的是,这些信息你永远无法删除,它们永远存在于互联网的某些你不知道的角落。除非你更换掉自己的所有信息,但是这代价太大了。

用户隐私问题一直是大数据应用难以绕开的一个问题,如被央视曝光过的分众无线、罗维邓白氏以及网易邮箱都涉及侵犯用户隐私。目前,中国并没有专门的 法律法规来界定用户隐私,处理相关问题时多采用其他相关法规条例来解释。但随着民众隐私意识的日益增强,合法合规地获取数据、分析数据和应用数据,是进行 大数据分析时必须遵循的原则。

说到隐私被侵犯,爱德华•斯诺登应该占据一席之地,这位前美国中央情报局(CIA)雇员一手引爆了美国“棱镜计划”(PRISM)的内幕消息。“棱 镜”项目是一项由美国国家安全局(NSA)自2007年起开始实施的绝密电子监听计划,年耗资近2000亿美元,用于监听全美电话通话记录,据称还可以使 情报人员通过“后门”进入9家主要科技公司的服务器,包括微软、雅虎、谷歌、Facebook、PalTalk、美国在线、Skype、YouTube、 苹果。这个事件引发了人们对政府使用大数据时对公民隐私侵犯的担心。

再看看我们身边,当微博,微信,QQ空间这些社交平台肆意的吞噬着数亿用户的各种信息时,你就不要指望你还有隐私权了,就算你在某个地方删除了,但也许这些信息已经被其他人转载或保存了,更有可能已经被百度或Google存为快照,早就提供给任意用户搜索了。
因此在大数据的背景下,很多人都在积极的抵制无底线的数字化,这种大数据和个体之间的博弈还会一直继续下去……

专家给予了我们一些如何有效保护大数据背景下隐私权的建议:1-减少信息的数字化;2-隐私权立法;3-数字隐私权基础设施(类似DRM数字版权管理);4-人类改变认知(接受忽略过去);5-创造良性的信息生态;6-语境化。

但是这些都很难立即见效或者有实质性的改善。

比如,现在有一种职业叫删帖人,专门负责帮人到各大网站删帖,删除评论。其实这些人就是通过黑客技术侵入各大网站,破获管理员的密码然后进行手工定 向删除。只不过他们保护的不是客户的隐私,而大多是丑闻。还有一种职业叫人肉专家,他们负责从互联网上找到一个与他们根本就无关系用户的任意信息。这是很 可怕的事情,也就是说,如果有人想找到你,只需要两个条件:1-你上过网,留下过痕迹;2-你的亲朋好友或仅仅是认识你的人上过网,留下过你的痕迹。这两 个条件满足其一,人肉专家就可以很轻松的找到你,可能还知道你现在正在某个餐厅和谁一起共进晚餐。

当很多互联网企业意识到隐私对于用户的重要性时,为了继续得到用户的信任,他们采取了很多办法,比如google承诺仅保留用户的搜索记录9个月,浏览器厂商提供了无痕冲浪模式,社交网站拒绝公共搜索引擎的爬虫进入,并将提供出去的数据全部采取匿名方式处理等。

在这种复杂的环境里面,很多人依然没有建立对于信息隐私的保护意识,让自己一直处于被滋扰,被精心设计,被利用,被监视的处境中。可是,我们能做的 几乎微乎其微,因为个人隐私数据已经无法由我们自己掌控了,就像一首诗里说到的:“如果你现在继续麻木,那就别指望这麻木能抵挡得住被”扒光”那一刻的惊 恐和绝望……”

 和大数据相关的技术

Ø 云技术

大数据常和云计算联系到一起,因为实时的大型数据集分析需要分布式处理框架来向数十、数百或甚至数万的电脑分配工作。可以说,云计算充当了工业革命时期的发动机的角色,而大数据则是电。

云计算思想的起源是麦卡锡在上世纪60年代提出的:把计算能力作为一种像水和电一样的公用事业提供给用户。

如今,在Google、Amazon、Facebook等一批互联网企业引领下,一种行之有效的模式出现了:云计算提供基础架构平台,大数据应用运行在这个平台上。

业内是这么形容两者的关系:没有大数据的信息积淀,则云计算的计算能力再强大,也难以找到用武之地;没有云计算的处理能力,则大数据的信息积淀再丰富,也终究只是镜花水月。

那么大数据到底需要哪些云计算技术呢?

这里暂且列举一些,比如虚拟化技术,分布式处理技术,海量数据的存储和管理技术,NoSQL、实时流数据处理、智能分析技术(类似模式识别以及自然语言理解)等。

云计算和大数据之间的关系可以用下面的一张图来说明,两者之间结合后会产生如下效应:可以提供更多基于海量业务数据的创新型服务;通过云计算技术的不断发展降低大数据业务的创新成本。

36大数据

如果将云计算与大数据进行一些比较,最明显的区分在两个方面:

第一,在概念上两者有所不同,云计算改变了IT,而大数据则改变了业务。然而大数据必须有云作为基础架构,才能得以顺畅运营。

第二,大数据和云计算的目标受众不同,云计算是CIO等关心的技术层,是一个进阶的IT解决方案。而大数据是CEO关注的、是业务层的产品,而大数据的决策者是业务层。

Ø 分布式处理技术

分布式处理系统可以将不同地点的或具有不同功能的或拥有不同数据的多台计算机用通信网络连接起来,在控制系统的统一管理控制下,协调地完成信息处理任务—这就是分布式处理系统的定义。

以Hadoop(Yahoo)为例进行说明,Hadoop是一个实现了MapReduce模式的能够对大量数据进行分布式处理的软件框架,是以一种可靠、高效、可伸缩的方式进行处理的。

而MapReduce是Google提出的一种云计算的核心计算模式,是一种分布式运算技术,也是简化的分布式编程模式,MapReduce模式的 主要思想是将自动分割要执行的问题(例如程序)拆解成map(映射)和reduce(化简)的方式, 在数据被分割后通过Map 函数的程序将数据映射成不同的区块,分配给计算机机群处理达到分布式运算的效果,在通过Reduce 函数的程序将结果汇整,从而输出开发者需要的结果。

再来看看Hadoop的特性,第一,它是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处 理。其次,Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。Hadoop 还是可伸缩的,能够处理 PB 级数据。此外,Hadoop 依赖于社区服务器,因此它的成本比较低,任何人都可以使用。

你也可以这么理解Hadoop的构成,Hadoop=HDFS(文件系统,数据存储技术相关)+HBase(数据库)+MapReduce(数据处理)+……Others

Hadoop用到的一些技术有:

  • HDFS: Hadoop分布式文件系统(Distributed File System) - HDFS (HadoopDistributed File System)
  • MapReduce:并行计算框架
  • HBase: 类似Google BigTable的分布式NoSQL列数据库。
  • Hive:数据仓库工具,由Facebook贡献。
  • Zookeeper:分布式锁设施,提供类似Google Chubby的功能,由Facebook贡献。
  • Avro:新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制。
  • Pig:大数据分析平台,为用户提供多种接口。
  • Ambari:Hadoop管理工具,可以快捷的监控、部署、管理集群。
  • Sqoop:用于在Hadoop与传统的数据库间进行数据的传递。

说了这么多,举个实际的例子,虽然这个例子有些陈旧,但是淘宝的海量数据技术架构还是有助于我们理解对于大数据的运作处理机制:

淘宝大数据

如上图所示,淘宝的海量数据产品技术架构分为五个层次,从上至下来看它们分别是:数据源,计算层,存储层,查询层和产品层。

数据来源层。存放着淘宝各店的交易数据。在数据源层产生的数据,通过DataX,DbSync和Timetunel准实时的传输到下面第2点所述的“云梯”。
计算层。在这个计算层内,淘宝采用的是Hadoop集群,这个集群,我们暂且称之为云梯,是计算层的主要组成部分。在云梯上,系统每天会对数据产品进行不同的MapReduce计算。
存储层。在这一层,淘宝采用了两个东西,一个使MyFox,一个是Prom。MyFox是基于MySQL的分布式关系型数据库的集群,Prom是基于Hadoop Hbase技术的一个NoSQL的存储集群。
查询层。在这一层中,Glider是以HTTP协议对外提供restful方式的接口。数据产品通过一个唯一的URL来获取到它想要的数据。同时,数据查询即是通过MyFox来查询的。

最后一层是产品层,这个就不用解释了。

Ø 存储技术

大数据可以抽象的分为大数据存储和大数据分析,这两者的关系是:大数据存储的目的是支撑大数据分析。到目前为止,还是两种截然不同的计算机技术领域:大数据存储致力于研发可以扩展至PB甚至EB级别的数据存储平台;大数据分析关注在最短时间内处理大量不同类型的数据集。

提到存储,有一个著名的摩尔定律相信大家都听过:18个月集成电路的复杂性就增加一倍。所以,存储器的成本大约每18-24个月就下降一半。成本的不断下降也造就了大数据的可存储性。

比如,Google大约管理着超过50万台服务器和100万块硬盘,而且Google还在不断的扩大计算能力和存储能力,其中很多的扩展都是基于在廉价服务器和普通存储硬盘的基础上进行的,这大大降低了其服务成本,因此可以将更多的资金投入到技术的研发当中。

以Amazon举例,Amazon S3 是一种面向 Internet 的存储服务。该服务旨在让开发人员能更轻松的进行网络规模计算。Amazon S3 提供一个简明的 Web 服务界面,用户可通过它随时在 Web 上的任何位置存储和检索的任意大小的数据。 此服务让所有开发人员都能访问同一个具备高扩展性、可靠性、安全性和快速价廉的基础设施,Amazon 用它来运行其全球的网站网络。再看看S3的设计指标:在特定年度内为数据元提供 99.999999999% 的耐久性和 99.99% 的可用性,并能够承受两个设施中的数据同时丢失。

S3很成功也确实卓有成效,S3云的存储对象已达到万亿级别,而且性能表现相当良好。S3云已经拥万亿跨地域存储对象,同时AWS的对象执行请求也 达到百万的峰值数量。目前全球范围内已经有数以十万计的企业在通过AWS运行自己的全部或者部分日常业务。这些企业用户遍布190多个国家,几乎世界上的 每个角落都有Amazon用户的身影。

Ø 感知技术

大数据的采集和感知技术的发展是紧密联系的。以传感器技术,指纹识别技术,RFID技术,坐标定位技术等为基础的感知能力提升同样是物联网发展的基 石。全世界的工业设备、汽车、电表上有着无数的数码传感器,随时测量和传递着有关位置、运动、震动、温度、湿度乃至空气中化学物质的变化,都会产生海量的 数据信息。

而随着智能手机的普及,感知技术可谓迎来了发展的高峰期,除了地理位置信息被广泛的应用外,一些新的感知手段也开始登上舞台,比如,最新 的”iPhone 5S”在home键内嵌指纹传感器,新型手机可通过呼气直接检测燃烧脂肪量,用于手机的嗅觉传感器面世可以监测从空气污染到危险的化学药品,微软正在研发 可感知用户当前心情智能手机技术,谷歌眼镜InSight新技术可通过衣着进行人物识别。

除此之外,还有很多与感知相关的技术革新让我们耳目一新:比如,牙齿传感器实时监控口腔活动及饮食状况,婴儿穿戴设备可用大数据去养育宝 宝,Intel正研发3D笔记本摄像头可追踪眼球读懂情绪,日本公司开发新型可监控用户心率的纺织材料,业界正在尝试将生物测定技术引入支付领域等。

其实,这些感知被逐渐捕获的过程就是就世界被数据化的过程,一旦世界被完全数据化了,那么世界的本质也就是信息了。

就像一句名言所说,“人类以前延续的是文明,现在传承的是信息。”

大数据的实践

Ø 互联网的大数据

互联网上的数据每年增长50%,每两年便将翻一番,而目前世界上90%以上的数据是最近几年才产生的。据IDC预测,到2020年全球将总共拥有 35ZB的数据量。互联网是大数据发展的前哨阵地,随着WEB2.0时代的发展,人们似乎都习惯了将自己的生活通过网络进行数据化,方便分享以及记录并回 忆。

互联网上的大数据很难清晰的界定分类界限,我们先看看BAT的大数据:

百度拥有两种类型的大数据:用户搜索表征的需求数据;爬虫和阿拉丁获取的公共web数据。搜索巨头百度围绕数据而生。它对网页数据的爬取、网页内容 的组织和解析,通过语义分析对搜索需求的精准理解进而从海量数据中找准结果,以及精准的搜索引擎关键字广告,实质上就是一个数据的获取、组织、分析和挖掘 的过程。搜索引擎在大数据时代面临的挑战有:更多的暗网数据;更多的WEB化但是没有结构化的数据;更多的WEB化、结构化但是封闭的数据。

阿里巴巴拥有交易数据和信用数据。这两种数据更容易变现,挖掘出商业价值。除此之外阿里巴巴还通过投资等方式掌握了部分社交数据、移动数据。如微博和高德。

腾讯拥有用户关系数据和基于此产生的社交数据。这些数据可以分析人们的生活和行为,从里面挖掘出政治、社会、文化、商业、健康等领域的信息,甚至预测未来。

在信息技术更为发达的美国,除了行业知名的类似Google,Facebook外,已经涌现了很多大数据类型的公司,它们专门经营数据产品,比如:

  • Metamarkets:这家公司对Twitter、支付、签到和一些与互联网相关的问题进行了分析,为客户提供了很好的数据分析支持。
  • Tableau:他们的精力主要集中于将海量数据以可视化的方式展现出来。Tableau为数字媒体提供了一个新的展示数据的方式。他们提供了一个免费工具,任何人在没有编程知识背景的情况下都能制造出数据专用图表。这个软件还能对数据进行分析,并提供有价值的建议。
  • ParAccel:他们向美国执法机构提供了数据分析,比如对15000个有犯罪前科的人进行跟踪,从而向执法机构提供了参考性较高的犯罪预测。他们是犯罪的预言者。
  • QlikTech:QlikTech旗下的Qlikview是一个商业智能领域的自主服务工具,能够应用于科学研究和艺术等领域。为了帮助开发者对这些数据进行分析,QlikTech提供了对原始数据进行可视化处理等功能的工具。
  • GoodData:GoodData希望帮助客户从数据中挖掘财富。这家创业公司主要面向商业用户和IT企业高管,提供数据存储、性能报告、数据分析等工具。
  • TellApart:TellApart和电商公司进行合作,他们会根据用户的浏览行为等数据进行分析,通过锁定潜在买家方式提高电商企业的收入。
  • DataSift:DataSift主要收集并分析社交网络媒体上的数据,并帮助品牌公司掌握突发新闻的舆论点,并制定有针对性的营销方案。这家公司还和Twitter有合作协议,使得自己变成了行业中为数不多可以分析早期tweet的创业公司。
  • Datahero:公司的目标是将复杂的数据变得更加简单明了,方便普通人去理解和想象。

举了很多例子,这里简要归纳一下,在互联网大数据的典型代表性包括:

1-用户行为数据(精准广告投放、内容推荐、行为习惯和喜好分析、产品优化等)
2-用户消费数据(精准营销、信用记录分析、活动促销、理财等)
3-用户地理位置数据(O2O推广,商家推荐,交友推荐等)
4-互联网金融数据(P2P,小额贷款,支付,信用,供应链金融等)
5-用户社交等UGC数据(趋势分析、流行元素分析、受欢迎程度分析、舆论监控分析、社会问题分析等)

Ø 政府的大数据

近期,奥巴马政府宣布投资2亿美元拉动大数据相关产业发展,将“大数据战略”上升为国家意志。奥巴马政府将数据定义为“未来的新石油”,并表示一个 国家拥有数据的规模、活性及解释运用的能力将成为综合国力的重要组成部分,未来,对数据的占有和控制甚至将成为陆权、海权、空权之外的另一种国家核心资 产。

在国内,政府各个部门都握有构成社会基础的原始数据,比如,气象数据,金融数据,信用数据,电力数据,煤气数据,自来水数据,道路交通数据,客运数 据,安全刑事案件数据,住房数据,海关数据,出入境数据,旅游数据,医疗数据,教育数据,环保数据等等。这些数据在每个政府部门里面看起来是单一的,静态 的。但是,如果政府可以将这些数据关联起来,并对这些数据进行有效的关联分析和统一管理,这些数据必定将获得新生,其价值是无法估量的。

具体来说,现在城市都在走向智能和智慧,比如,智能电网、智慧交通、智慧医疗、智慧环保、智慧城市,这些都依托于大数据,可以说大数据是智慧的核心 能源。从国内整体投资规模来看,到2012年底全国开建智慧城市的城市数超过180个,通信网络和数据平台等基础设施建设投资规模接近5000亿元。“十 二五”期间智慧城市建设拉动的设备投资规模将达1万亿元人民币。大数据为智慧城市的各个领域提供决策支持。在城市规划方面,通过对城市地理、气象等自然信 息和经济、社会、文化、人口等人文社会信息的挖掘,可以为城市规划提供决策,强化城市管理服务的科学性和前瞻性。在交通管理方面,通过对道路交通信息的实 时挖掘,能有效缓解交通拥堵,并快速响应突发状况,为城市交通的良性运转提供科学的决策依据。在舆情监控方面,通过网络关键词搜索及语义智能分析,能提高 舆情分析的及时性、全面性,全面掌握社情民意,提高公共服务能力,应对网络突发的公共事件,打击违法犯罪。在安防与防灾领域,通过大数据的挖掘,可以及时 发现人为或自然灾害、恐怖事件,提高应急处理能力和安全防范能力。

另外,作为国家的管理者,政府应该有勇气将手中的数据逐步开放,供给更多有能力的机构组织或个人来分析并加以利用,以加速造福人类。比如,美国政府 就筹建了一个data.gov网站,这是奥巴马任期内的一个重要举措:要求政府公开透明,而核心就是实现政府机构的数据公开。截止目前,已经开放了有 91054 个datasets;349citizen-developed apps;137 mobile apps;175 agencies and subagencies;87 galleries;295 Government APIs。

Ø 企业的大数据

企业的CXO们最关注的还是报表曲线的背后能有怎样的信息,他该做怎样的决策,其实这一切都需要通过数据来传递和支撑。在理想的世界中,大数据是巨 大的杠杆,可以改变公司的影响力,带来竞争差异、节省金钱、增加利润、愉悦买家、奖赏忠诚用户、将潜在客户转化为客户、增加吸引力、打败竞争对手、开拓用 户群并创造市场。

那么,哪些传统企业最需要大数据服务呢?抛砖引玉,先举几个例子:1) 对大量消费者提供产品或服务的企业(精准营销);2) 做小而美模式的中长尾企业(服务转型);3) 面临互联网压力之下必须转型的传统企业(生死存亡)。

对于企业的大数据,还有一种预测:随着数据逐渐成为企业的一种资产,数据产业会向传统企业的供应链模式发展,最终形成“数据供应链”。这里尤其有两 个明显的现象:1) 外部数据的重要性日益超过内部数据。在互联互通的互联网时代,单一企业的内部数据与整个互联网数据比较起来只是沧海一粟;2) 能提供包括数据供应、数据整合与加工、数据应用等多环节服务的公司会有明显的综合竞争优势。

对于提供大数据服务的企业来说,他们等待的是合作机会,就像微软史密斯说的:“给我提供一些数据,我就能做一些改变。如果给我提供所有数据,我就能拯救世界。”

然而,一直做企业服务的巨头将优势不在,不得不眼看新兴互联网企业加入战局,开启残酷竞争模式。为何会出现这种局面?从 IT 产业的发展来看,第一代 IT 巨头大多是 ToB 的,比如 IBM、Microsoft、Oracle、SAP、HP这类传统 IT 企业;第二代 IT 巨头大多是ToC 的,比如 Yahoo、Google、Amazon、Facebook 这类互联网企业。大数据到来前,这两类公司彼此之间基本是井水不犯河水;但在当前这个大数据时代,这两类公司已经开始直接竞争。比如 Amazon 已经开始提供云模式的数据仓库服务,直接抢占 IBM、Oracle 的市场。这个现象出现的本质原因是:在互联网巨头的带动下,传统 IT 巨头的客户普遍开始从事电子商务业务,正是由于客户进入了互联网,所以传统 IT 巨头们不情愿地被拖入了互联网领域。如果他们不进入互联网,他们业务必将萎缩。在进入互联网后,他们又必须将云技术,大数据等互联网最具有优势的技术通过 封装打造成自己的产品再提供给企业。

以IBM举例,上一个十年,他们抛弃了PC,成功转向了软件和服务,而这次将远离服务与咨询,更多地专注于因大数据分析软件而带来的全新业务增长 点。IBM执行总裁罗睿兰认为,“数据将成为一切行业当中决定胜负的根本因素,最终数据将成为人类至关重要的自然资源。”IBM积极的提出了“大数据平 台”架构。该平台的四大核心能力包括Hadoop系统、流计算(StreamComputing)、数据仓库(Data Warehouse)和信息整合与治理(Information Integration and Governance)

IBM大数据

另外一家亟待通过云和大数据战略而复苏的巨头公司HP也推出了自己的产品:HAVEn,一个可以自由扩展伸缩的大数据解决方案。这个解决方案由HP Autonomy、HP Vertica、HP ArcSight 和惠普运营管理(HP OperationsManagement)四大技术组成。还支持Hadoop这样通用的技术。HAVEn不是一个软件平台,而是一个生态环境。四大组成 部分满足不同的应用场景需要,Autonomy解决音视频识别的重要解决方案;Vertica解决数据处理的速度和效率的方案;ArcSight解决机器 的记录信息处理,帮助企业获得更高安全级别的管理;运营管理解决的不仅仅是外部数据的处理,而是包括了IT基础设施产生的数据。

36大数据
Ø 个人的大数据

个人的大数据这个概念很少有人提及,简单来说,就是与个人相关联的各种有价值数据信息被有效采集后,可由本人授权提供第三方进行处理和使用,并获得第三方提供的数据服务。

举个例子来说明会更清晰一些:

未来,每个用户可以在互联网上注册个人的数据中心,以存储个人的大数据信息。用户可确定哪些个人数据可被采集,并通过可穿戴设备或植入芯片等感知技 术来采集捕获个人的大数据,比如,牙齿监控数据,心率数据,体温数据,视力数据,记忆能力,地理位置信息,社会关系数据,运动数据,饮食数据,购物数据等 等。用户可以将其中的牙齿监测数据授权给XX牙科诊所使用,由他们监控和使用这些数据,进而为用户制定有效的牙齿防治和维护计划;也可以将个人的运动数据 授权提供给某运动健身机构,由他们监测自己的身体运动机能,并有针对的制定和调整个人的运动计划;还可以将个人的消费数据授权给金融理财机构,由他们帮你 制定合理的理财计划并对收益进行预测。当然,其中有一部分个人数据是无需个人授权即可提供给国家相关部门进行实时监控的,比如罪案预防监控中心可以实时的 监控本地区每个人的情绪和心理状态,以预防自杀和犯罪的发生。

以个人为中心的大数据有这么一些特性:

1- 数据仅留存在个人中心,其它第三方机构只被授权使用(数据有一定的使用期限),且必须接受用后即焚的监管。
2- 采集个人数据应该明确分类,除了国家立法明确要求接受监控的数据外,其它类型数据都由用户自己决定是否被采集。
3- 数据的使用将只能由用户进行授权,数据中心可帮助监控个人数据的整个生命周期。

展望过于美好,也许实现个人数据中心将遥遥无期,也许这还不是解决个人数据隐私的最好方法,也许业界对大数据的无限渴求会阻止数据个人中心的实现, 但是随着数据越来越多,在缺乏监管之后,必然会有一场激烈的博弈:到底是数据重要还是隐私重要;是以商业为中心还是以个人为中心。

自:36大数据

centos7安装owncloud9.0

ownCloudis a software system for File hosting.it is released under AGPLv3 license, so you can setup own cloud storage server without any additional cost.It has a goodweb suite that provides a cloud storage over the network, data can be uploaded via web browser or using software client.The project is based on PHP and a SQLite, MySQL, Oracle or PostgreSQL database, so it can run on all platforms that meet these requirements.In this tutorial, we will install ownCloud 7 on CentOS 7.

Initial setup

Install CentOS 7 with default Minimal configuration then install all current updates:

yum -y update

Next,we need to installPHP, Apache web server and MySQL server and some php extensions:

yum install httpd php php-mysql mariadb-server mariadb sqlite php-dom php-mbstring php-gd php-pdo 

Set SELinux to allow OwnCloud to write the data:

setsebool -P httpd_unified 1

Allow web traffic through the firewall:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Start Apache using the following command:

systemctl start httpd.service

Start MariaDBby issuing this command:

systemctl start mariadb.service
Auto start the service at system start-up:
systemctl enable httpd.service
systemctl enable mariadb.service

Installation

First, we need to downloadownCloud from official website. Run the following command.

wget https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2

Extract the archive we just downloaded.

tar -jxvf owncloud-7.0.0.tar.bz2 -C /var/www/html/

Next we need to assign the permission for web serverto read and write the files on cloud directory.

chown -R apache.apache /var/www/html/owncloud/

DataBase configuration

Configure the mariadb instance.

mysql_secure_installation;

Hit enter on any of these that have the capitalY.

Set root password?[Y/n]New password: databaserootpassword
Re-enter new password: databaserootpassword
Remove anonymous users?[Y/n]Y
Disallow root login remotely?[Y/n]Y
Remove test database and access to it?[Y/n]Y
Reload privilege tables now?[Y/n]

Create the ownCloud database and user.

Login to mysql server, Using the following command

mysql -u root -p

Next, we need to Create DataBase for ownCloud and grand permission for ownCloud user.

mysql> create database owncloud;
mysql> create user 'owncloud'@'LOCALHOST' identified by'YOUR-DATABASE-PASSWORD'; 
mysql> grant all on owncloud.* to 'owncloud'@'LOCALHOST';
mysql> flush privileges;
mysql> quit;

Apache server configuration

Open an externalconfiguration file for ownCloud in your favorite editor, I’m using vim.

vim /etc/httpd/conf.d/owncloud.conf

Add the following lines in the config file.

<IfModule mod_alias.c>
Alias /owncloud /var/www/html/owncloud
</IfModule>
<Directory “/var/www/html/owncloud”>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>

如果要检查apache有没有安装,可以用命令检查apache的安装包是否安装上。

# rpm -qa | grep httpd

如果想看安装的运行级别。

# chkconfig –list httpd

如果想看有没有启动。

# service httpd status

etc/httpd是apache的安装目录,

如果发现有.htaccess设置不正确的提示,可以这样:

打开httpd.conf(在那里? APACHE目录的CONF目录里面),用vim打开后,查找

Options FollowSymLinks

AllowOverride None

改为

Options FollowSymLinks

AllowOverride All

然后去掉下面的注释

LoadModule rewrite_modulemodules/mod_rewrite.so

.htaccess可以更改上传文件大小,默认的是2M

上传大小限制(设置成10G)

编辑文件:/var/www/html/owncloud/.htaccess

php_value upload_max_filesize 10240M

php_value post_max_size 10240M

php_value memory_limit 2048M

Restart all apache and mariaDB services:

systemctl start httpd.service
systemctl start mariadb.service

OwnCloud configuration

Open up your favorite browser and pastehttp://your_ip_address/owncloudorhttp://your_Domain.com/owncloud. It will shows the initial owncloud setup page.it must be configured before going to live.

Hadoop TeraSort 基准测试

<一> TeraSort 介绍

1TB排序通常用于衡量分布式数据处理框架的数据处理能力。Terasort是Hadoop中的的一个排序作业,在2008年,Hadoop在1TB排序基准评估中赢得第一名,耗时209秒。

<二> 相关资料

Hadoop MapReduce扩展性的测试:  http://cloud.csdn.net/a/20100901/278934.html
用MPI实现Hadoop:  Map/Reduce的TeraSort  http://emonkey.blog.sohu.com/166546157.html
Hadoop中TeraSort算法分析:  http://dongxicheng.org/mapreduce/hadoop-terasort-analyse/
hadoop的1TB排序terasort:  http://hi.baidu.com/dtzw/blog/item/cffc8e1830f908b94bedbc12.html
Sort Benchmark:  http://sortbenchmark.org/
Trir树:http://www.cnblogs.com/cherish_yimi/archive/2009/10/12/1581666.html
<三> 实验

(0) 源码位置
/local/zkl/hadoop/hadoop-0.20.1/hadoop-0.20.1/src/examples/org/apache/hadoop/examples/terasort

(1) 首先执行 teragen 生成数据

[root@gd86 hadoop-0.20.1]# /local/zkl/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/hadoop jar hadoop-0.20.1-examples.jar teragen 1000000 terasort/1000000-input

查看生成的数据

[root@gd86 hadoop-0.20.1]# /local/zkl/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/hadoop fs -ls  /user/root/terasort/1000000-input
Found 3 items
drwxr-xr-x   – root supergroup          0 2011-03-31 16:21 /user/root/terasort/1000000-input/_logs
-rw-r–r–   3 root supergroup   50000000 2011-03-31 16:21 /user/root/terasort/1000000-input/part-00000
-rw-r–r–   3 root supergroup   50000000 2011-03-31 16:21 /user/root/terasort/1000000-input/part-00001

生成两个数据,每个的大小是 50000000 B = 50 M

[root@gd86 hadoop-0.20.1]# bin/hadoop jar hadoop-0.20.1-examples.jar teragen 10 terasort/1000000-input
将生成两个 500 B 的数据,加起来是 1000 B = 1 kb

产生的数据一行是100B,参数10表示产生10行,共1000B;1,000,000 行就有 100,000,000 B = 100 M;

teragen是用两个 map 来完成数据的生成,每个 map 生成一个文件,两个文件大小共 100 M,每个就是 50 M .

[root@gd86 hadoop-0.20.1]# bin/hadoop jar hadoop-0.20.1-examples.jar teragen 10000000 terasort/1G-input

这将产生 1 G 的数据,由于数据块是 64 M 一块,这会被分成16个数据块,当运行terasort时会有64个map task。

[root@gd86 hadoop-0.20.1]# bin/hadoop jar hadoop-0.20.1-examples.jar teragen 10000000 terasort/1G-input
Generating 10000000 using 2 maps with step of 5000000
11/04/01 17:02:46 INFO mapred.JobClient: Running job: job_201103311423_0005
11/04/01 17:02:47 INFO mapred.JobClient:  map 0% reduce 0%
11/04/01 17:03:00 INFO mapred.JobClient:  map 19% reduce 0%
11/04/01 17:03:01 INFO mapred.JobClient:  map 41% reduce 0%
11/04/01 17:03:03 INFO mapred.JobClient:  map 52% reduce 0%
11/04/01 17:03:04 INFO mapred.JobClient:  map 63% reduce 0%
11/04/01 17:03:06 INFO mapred.JobClient:  map 74% reduce 0%
11/04/01 17:03:10 INFO mapred.JobClient:  map 91% reduce 0%
11/04/01 17:03:12 INFO mapred.JobClient:  map 100% reduce 0%
11/04/01 17:03:14 INFO mapred.JobClient: Job complete: job_201103311423_0005
11/04/01 17:03:14 INFO mapred.JobClient: Counters: 6
11/04/01 17:03:14 INFO mapred.JobClient:   Job Counters
11/04/01 17:03:14 INFO mapred.JobClient:     Launched map tasks=2
11/04/01 17:03:14 INFO mapred.JobClient:   FileSystemCounters
11/04/01 17:03:14 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=1000000000
11/04/01 17:03:14 INFO mapred.JobClient:   Map-Reduce Framework
11/04/01 17:03:14 INFO mapred.JobClient:     Map input records=10000000
11/04/01 17:03:14 INFO mapred.JobClient:     Spilled Records=0
11/04/01 17:03:14 INFO mapred.JobClient:     Map input bytes=10000000
11/04/01 17:03:14 INFO mapred.JobClient:     Map output records=10000000
(2) 执行 terasort 排序

执行 terasort 程序,将会执行 16 个 MapTask

root@gd38 hadoop-0.20.1# bin/hadoop jar hadoop-0.20.1-examples.jar terasort terasort/1G-input terasort/1G-output

11/03/31 17:12:49 INFO terasort.TeraSort: starting
11/03/31 17:12:49 INFO mapred.FileInputFormat: Total input paths to process : 2
11/03/31 17:13:05 INFO util.NativeCodeLoader: Loaded the native-hadoop library
11/03/31 17:13:05 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
11/03/31 17:13:05 INFO compress.CodecPool: Got brand-new compressor
Making 1 from 100000 records
Step size is 100000.0
11/03/31 17:13:06 INFO mapred.JobClient: Running job: job_201103311423_0006
11/03/31 17:13:07 INFO mapred.JobClient:  map 0% reduce 0%
11/03/31 17:13:20 INFO mapred.JobClient:  map 12% reduce 0%
11/03/31 17:13:21 INFO mapred.JobClient:  map 37% reduce 0%
11/03/31 17:13:29 INFO mapred.JobClient:  map 50% reduce 2%
11/03/31 17:13:30 INFO mapred.JobClient:  map 75% reduce 2%
11/03/31 17:13:32 INFO mapred.JobClient:  map 75% reduce 12%
11/03/31 17:13:36 INFO mapred.JobClient:  map 87% reduce 12%
11/03/31 17:13:38 INFO mapred.JobClient:  map 100% reduce 12%
11/03/31 17:13:41 INFO mapred.JobClient:  map 100% reduce 25%
11/03/31 17:13:44 INFO mapred.JobClient:  map 100% reduce 31%
11/03/31 17:13:53 INFO mapred.JobClient:  map 100% reduce 33%
11/03/31 17:14:02 INFO mapred.JobClient:  map 100% reduce 68%
11/03/31 17:14:05 INFO mapred.JobClient:  map 100% reduce 71%
11/03/31 17:14:08 INFO mapred.JobClient:  map 100% reduce 75%
11/03/31 17:14:11 INFO mapred.JobClient:  map 100% reduce 79%
11/03/31 17:14:14 INFO mapred.JobClient:  map 100% reduce 82%
11/03/31 17:14:17 INFO mapred.JobClient:  map 100% reduce 86%
11/03/31 17:14:20 INFO mapred.JobClient:  map 100% reduce 90%
11/03/31 17:14:23 INFO mapred.JobClient:  map 100% reduce 93%
11/03/31 17:14:26 INFO mapred.JobClient:  map 100% reduce 97%
11/03/31 17:14:32 INFO mapred.JobClient:  map 100% reduce 100%
11/03/31 17:14:34 INFO mapred.JobClient: Job complete: job_201103311423_0006
11/03/31 17:14:34 INFO mapred.JobClient: Counters: 18
11/03/31 17:14:34 INFO mapred.JobClient:   Job Counters
11/03/31 17:14:34 INFO mapred.JobClient:     Launched reduce tasks=1
11/03/31 17:14:34 INFO mapred.JobClient:     Launched map tasks=16
11/03/31 17:14:34 INFO mapred.JobClient:     Data-local map tasks=16
11/03/31 17:14:34 INFO mapred.JobClient:   FileSystemCounters
11/03/31 17:14:34 INFO mapred.JobClient:     FILE_BYTES_READ=2382257412
11/03/31 17:14:34 INFO mapred.JobClient:     HDFS_BYTES_READ=1000057358
11/03/31 17:14:34 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=3402255956
11/03/31 17:14:34 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=1000000000
11/03/31 17:14:34 INFO mapred.JobClient:   Map-Reduce Framework
11/03/31 17:14:34 INFO mapred.JobClient:     Reduce input groups=10000000
11/03/31 17:14:34 INFO mapred.JobClient:     Combine output records=0
11/03/31 17:14:34 INFO mapred.JobClient:     Map input records=10000000
11/03/31 17:14:34 INFO mapred.JobClient:     Reduce shuffle bytes=951549012
11/03/31 17:14:34 INFO mapred.JobClient:     Reduce output records=10000000
11/03/31 17:14:34 INFO mapred.JobClient:     Spilled Records=33355441
11/03/31 17:14:34 INFO mapred.JobClient:     Map output bytes=1000000000
11/03/31 17:14:34 INFO mapred.JobClient:     Map input bytes=1000000000
11/03/31 17:14:34 INFO mapred.JobClient:     Combine input records=0
11/03/31 17:14:34 INFO mapred.JobClient:     Map output records=10000000
11/03/31 17:14:34 INFO mapred.JobClient:     Reduce input records=10000000
11/03/31 17:14:34 INFO terasort.TeraSort: done

执行完成,排序,生成的数据仍是 1G ,

root@gd38 hadoop-0.20.1# bin/hadoop fs -ls terasort/1G-output
Found 2 items
drwxr-xr-x   – root supergroup          0 2011-03-31 17:13 /user/root/terasort/1G-output/_logs
-rw-r–r–   1 root supergroup 1000000000 2011-03-31 17:13 /user/root/terasort/1G-output/part-00000

 

Hadoop2.0基础基准测试

使用DFSIO测试集群HDFS的读写性能在Hadoop中包含很多的基准测试。你可以用来验证你集群的HDFS是不是设置合理,性能是不是达到预期,DFSIO是Hadoop的一个基准测试工具,被用来分析集群HDFS的I/O性能。接下来我们来看看如何使用DFSIO来测试集群HDFS的读写性能。

 

这次测试环境针对Hadoop2.0的YARN。其中需要依靠

hadoop-mapreduce-client-jobclient-*-tests.jar这个文件,我这里环境是CDH5.3

11.png

第一步:执行以下命令来运行HDFS写性能测试,其中参数-nrFiles指定了测试中要写的文件数目。可以选择一个和你集群槽位相匹配的数目。参数-fileSize指明了写入每个文件的大小单位是MB。

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-2.5.0-cdh5.3.3-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 100

12.png

13.png

14.png

这里会在HDFS上产生一系列的文件存放在HDFS的/benchmarks/TestDFSIO文件夹下。

15.png

第二步:这个基准测试结果会在控制台打印出来,也会写入一个名为TestDFSIO_results.log的文件中,我们可以添加参数-resFile来指定结果文件的名字。默认如下:

16.png

17.png

第三步:下面性能基准测试针对HDFS的读操作进行。读操作将用到第一步的写操作。因此写操作必须在读操作之前执行,产生类似的日志

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-2.5.0-cdh5.3.3-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 100

18.png

第四步:可以用下面的命令来清空之前产生的文件

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-2.5.0-cdh5.3.3-tests.jar TestDFSIO -clean

这样可以清空HDFS上/benchmarks/TestDFSIO中的所有文件。

 

DFSIO 后台执行MapReduce框架,其中Map任务以并行方式读写文件,Reduce任务用来收集和汇总性能数字。你可以通过这个基准测试对比吞吐量、IO 速率的结果。以及整个磁盘的原始速度。来确定你的集群是否得到了期待的性能。当确定写性能的时候,请考虑复制因子。可以通过这些测试中指标的严重偏差发现 集群中一个或多个问题节点。

关于裸磁盘IO的测试参见《linux使FIO测试磁盘iops方法详解.doc》

结合监控系统一起使用能够帮助我们更好的定位我们Hadoop集群的瓶颈所在。

 

使用TeraSort测试集群MapReduce的性能Hadoop的TeraSort是一个常用的测试,目的是利用MapReduce来尽可能快的对1TB数据进行排序,TeraSort测试可以很好的对MapReduce框架的每个过程进行压力测试,为调优和配置Hadoop集群提供一个合理的参考。

最初的TeraSort测试会排序1千万条100字节的记录,使得总数据规模达到1TB。然而我们可以指明记录的数目,使得我们可以控制整个数据的规模。

这次测试环境针对Hadoop2.0的YARN。其中需要依靠

hadoop-mapreduce-examples-2.5.0-cdh5.3.3.jar这个文件,我这里环境是CDH5.3

19.png

第 一步:在进行TeraSort测试之前的一个准备过程就是数据的产生,你可以使用teragen命令来生成TeraSort测试输入的数据。 teragen命令的第一个参数是记录的数目,第二个参数是生成数据的HDFS目录。下面这个命令生成1GB的数据,由1千万条记录组成,在HDFS的 tera_in目录中

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.3.jar teragen 10000000 /tera_in

20.png

21.png

22.png

注:

1.      一个更好的选择是指定用于teragen计算的Map任务的数目,这样可以加速数据的产生,这个可以通过-Dmapred. map. Tasks参数来实现。

2.      你也可以增加产生数据的HDFS数据块的大小,其中用于teragen计算的Map任务数目和输入数据的数据块数目差不多是一致的。这个可以由–Ddfs.block. Size参数指定。

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.3.jar teragen -Ddfs.block.size=268435456 -Dmapred.map.tasks=6 10000000 /tera_in

 

 

第二步:TeraSort基准测试的第二步就是在第一步产生的数据上执行TeraSort MapReduce计算。对于TeraSort第一个参数是HDFS上输入文件的路径,第二个参数是HDFS上输出结果的路径

23.png

24.png

25.png

26.png

注:

对于TeraSort计算我们可以通过指定Reduce任务的数量。来加速TeraSort计算的Reduce部分。这可以通过指定-Dmapred.reduce.tasks参数来实现,命令如下所示

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.3.jar terasort -Dmapred.reduce.tasks=6 /tera_in /tera_out

 

第三步:验证TeraSort基准测试程序结果的正确性,可以使用teravalidate命令来执行。第一个参数是排序的结果集的HDFS上的位置。第二个参数是验证结果集正确性的报告存放位置。

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.3.jar teravalidate /tera_out /tera_validate

27.png

28.png

29.png

TeraSort使用MapReduce框架通过分区操作将Map过程中的结果输出到Reduce任务,确保整体排序的顺序。

Hadoop测试TeraSort

使用teragen产生数据

使用Teragen来产生数据,示例如下:

hadoop jar hadoop-*-examples.jar teragen 参数1 参数2

teragen的参数解释:

  • 参数1:表示要产生的数据的行数。Teragen每行数据的大小是100B。
    要产生1T的数据,需要的行数=102410241024*1024/100=10995116277行
  • 参数2 : 产生的数据放置的文件夹地址

默认的teragen的启动的map数比较少,只有2个,如果要指定map数可以加-Dmapred.map.tasks=map数的方式。比如我们来产生1T的数据

hadoop jar hadoop-*-examples.jar teragen -Dmapred.map.tasks=100 10995116277 terasort/1T-input

ls一下目录是否产出

hadoop@myhost $ hadoop fs -ls /user/hadoop/terasort/
Found 1 items
drwxr-xr-x   - hadoop cug-admin          0 2013-07-13 12:49 /user/hadoop/terasort/1T-input

使用Terasort排序

使用terasort对刚才使用teragen产生的数据进行排序,排序结果输出到/user/hadoop/terasort/1T-output。
默认的reduce数目是1,会导致任务跑得非常慢。通过-Dmapred.reduce.tasks指定reduce数目,这里我们设置50个

hadoop jar hadoop-*-examples.jar terasort -Dmapred.reduce.tasks=50 \
/user/hadoop/terasort/1T-input /user/hadoop/terasort/1T-output

启动Teragen之后,会提交mapre reduce任务来,产生TeraSort需要的数据

使用Teravalidate 进行验证

使用TeraValidate 对Terasort的结果进行验证:

hadoop jar hadoop-*-examples.jar teravalidate /user/hadoop/terasort/1T-output /user/hadoop/terasort/1T-validate