Oobspark

Out Of the Box and Spark


  • 首页

  • 归档

  • 标签

使用pac文件屏蔽那些不想访问的网站

发表于 2018-06-05

概述

代理自动配置(Proxy auto-config,简称PAC),用于定义应用该如何自动选择适当的代理服务器来访问一个网址。一般使用在浏览器中,现在在一些便携式设备(Android设备,iOS设备)中,WIFI连接时也可以添加PAC协议来实现自动代理配置。

使用场景

在我们的场景中,我们有一些网站我们并不想去访问,譬如一些自动弹出的广告,某一个糟心的网站等等。这时就可以利用PAC文件来主动屏蔽这些网站。

使用方法

  • 编写PAC文件filter.pac

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // 我们不想访问的网站域名
    var FILTERS = [
    "do_not_want_to_visit_1.com",
    "do_not_want_to_visit_2.com",
    "do_not_want_to_visit_3.com",
    ];

    // 一个没有在使用的端口,因为我们不想访问这些网站
    var PROXY = "PROXY 127.0.0.1:9999";
    var DERECT = "DIRECT";

    // PAC的主方法
    function FindProxyForURL(url, host) {
    function rule_filter(domain) {
    for (var i = 0; i < FILTERS.length; i++) {
    if (domain.search(FILTERS[i]) !== -1) {
    return false;
    }
    }
    return true;
    }

    if (rule_filter(host) === true) {
    return DERECT;
    } else {
    return PROXY;
    }
    }
  • 把PAC文件上传到网络上,且保证我们能直接访问到该文件。如果你有GitHub账号,你可以直接在你的项目中上传该文件。

  • 在浏览器插件(如SwitchySharp)中,或者是在WIFI链接时的代理设置->自动选项中,填入我们上传的地址(我们的场景是https://github.com/oobspark/oobspark.github.io/blob/master/files/filter.pac)。

使用安卓ADB工具模拟滑动操作的两种简易方式

发表于 2018-06-04

近日需要在安卓设备中模拟滑动操作,进行一番研究之后,发现了两种比较简易的方式。不能不感叹安卓Android Debug Bridge (adb)工具功能之强大。下面进入正文。

环境搭建

  • 接入设备并安装设备驱动(此过程请自行百度)

  • Windows系统中,从官网下载ADB Kits并解压,譬如解压为D:\adb。

  • 为了方便起见,一般我们可以把D:\adb加入Windows环境变量中。此处我们直接由cmd进入adb目录

  • 执行adb devices,这时候我们就能看到之前接入的设备标识,这就说明adb已经可以正常使用了

adb devices

第一种方式(adb shell input swipe)

adb shell input swipe xStart yStart xEnd yEnd duration

此方法比较简单,也是使用得比较广泛的一种,GOOGLE或BAIDU到的大量文章都是基于此方法实现的。

  • adb shell input swipe 200 600 200 300 1000,表示从坐标(200,600)这个点滑动到坐标(200,300),1000毫秒内完成。表现在屏幕上就是上滑过程。

第二种方式(Monkey Script)

Drag(xStart, yStart, xEnd, yEnd, stepCount)

Money命令是adb中用来测试程序稳定性的一个工具。根据参数的不同,它可以产生不同的测试效果。用它可以产生很多随机事件,当然,也可以使用Monkey Script来产生很多指定事件。Monkey Script,我们来了解一下。

  • Monkey也是属于adb工具的一部分,所以还是要先安装好adb,请参考文章第一部分

  • 编写Monkey Script脚本,并命名为drag.mks

    1
    2
    3
    4
    5
    count = 1
    speed = 1.0
    start data >>
    Drag(200,600,200,300,100)
    UserWait(500)
  • adb push drag.mks /data/local/

  • adb shell monkey -f /data/local/drag.mks 10,将上滑操作执行10次

作为正向代理的Apache Traffic Server

发表于 2018-05-31

对比

Comparing HTTP Intermediaries

安装

  • 环境:ubuntu 16.04

  • sudo apt-get install trafficserver

配置

更改records.config配置,一般为/etc/trafficserver/records.config

1
2
3
CONFIG proxy.config.url_remap.remap_required INT 0
CONFIG proxy.config.http.cache.http INT 1
CONFIG proxy.config.reverse_proxy.enabled INT 0

如果不想返回头中包含有ATS信息,如

1
2
Proxy-Connection: keep-alive
Server: ATS/3.2.4

可以参照以下配置

1
2
3
4
5
6
7
CONFIG proxy.config.http.response_server_enabled INT 0
CONFIG proxy.config.http.insert_age_in_response INT 0
CONFIG proxy.config.http.insert_request_via_str INT 0
CONFIG proxy.config.http.anonymize_insert_client_ip INT 0
CONFIG proxy.config.http.insert_squid_x_forwarded_for INT 0
CONFIG proxy.config.reverse_proxy.enabled INT 0
CONFIG proxy.config.url_remap.remap_required INT 0

启动

sudo service trafficserver restart

使用正向代理

配置代理服务器:IP:8080,8080为默认端口

特征提取之词向量

发表于 2018-05-22

特征提取-词向量

Word2Vec(词向量),计算每个单词在其给定语料库环境下的分布式词向量(Distributed Representation)。

如果词的语义相近,那么它们的词向量在向量空间中也相互接近,这使得词语的向量化建模更加精确,可以改善现有方法并提高鲁棒性。词向量已经在许多自然语言处理场景中得到应用,如:命名实体识别,消歧,标注,解析,机器翻译等。

代码示例

相关API :Word2Vec

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pyspark.ml.feature import Word2Vec

spark = SparkSession.builder.master("local").appName("Word2Vec").getOrCreate()

documentDF = spark.createDataFrame([
("Hi I heard about Spark".split(" "), ),
("I wish Java could use case classes".split(" "), ),
("Logistic regression models are neat".split(" "), )
], ["text"])

word2Vec = Word2Vec(vectorSize=3, minCount=0, inputCol="text", outputCol="result")
model = word2Vec.fit(documentDF)

result = model.transform(documentDF)
for row in result.collect():
text, vector = row
print("Text: [%s] => \nVector: %s\n" % (", ".join(text), str(vector)))

参考文章

MySQL事务隔离级别

发表于 2018-05-21

事务的基本要素(ACID)

  1. Atomicity(原子性):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

  2. Consistency(一致性):数据库总是从一个一致性状态转换到另一个一致状态。

  3. Isolation(隔离性):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。注意这里的“通常来说”,后面的事务隔离级级别会说到。

  4. Durability(持久性):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。(持久性的安全性与刷新日志级别也存在一定关系,不同的级别对应不同的数据安全级别。)

MySQL事务隔离级别

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

  1. Read Uncommitted(未提交读):在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

  2. Read Committed(提交读):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

  3. Repeatable Read(可重复读):这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

  4. Serializable(可串行化):这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

事务的并发问题

  1. 脏读(Dirty Read):最容易理解。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据。

  2. 不重复读(NonRepeatable Read):解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致。

  3. 幻读(Phantom Read):解决了不重复读,保证了同一个事务里,查询的结果都是事务开始并且第一次查询时的状态(一致性)。但是,如果另一个事务同时提交了新数据,虽然本事务再次按照相同的条件查找会得到相同的结果集,但是本事务指定更新时(看了后面的演示你就会知道),就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

隔离级别 脏读
Dirty Read
不可重复读
NonRepeatable Read
幻读
Phantom Read
未提交读
Read uncommitted
可能 可能 可能
已提交读
Read committed
不可能 可能 可能
可重复读
Repeatable read
不可能 不可能 可能
可串行化
Serializable
不可能 不可能 不可能

特征提取之TF-IDF算法

发表于 2018-05-14

特征提取之TF-IDF

TF-IDF(词频-逆文档频率)算法是一种统计方法,用以评估一字词对于一个文件集或者一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上就是 TF*IDF,其中 TF(Term Frequency),表示词条在文章Document 中出现的频率;IDF(Inverse Document Frequency),其主要思想就是,如果包含某个词 Word的文档越少,则这个词的区分度就越大,也就是 IDF 越大。对于如何获取一篇文章的关键词,我们可以计算这边文章出现的所有名词的 TF-IDF,TF-IDF越大,则说明这个名词对这篇文章的区分度就越高,取 TF-IDF 值较大的几个词,就可以当做这篇文章的关键词。

在此推荐这篇文章。

计算步骤

  1. 计算词频(TF)

$$
词频={某个词在文章中的出现次数 \over 文章总次数}
$$

  1. 计算逆文档频率(IDF)

$$
逆文档频率 = log {语料库的文档总数 \over 文章总次数}
$$

  1. 计算词频-逆文档频率(TF-IDF)

$$
词频-逆文档频率 = 词频 * 逆文档频率
$$

代码示例

相关API :HashingTF,IDF

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pyspark.ml.feature import HashingTF, IDF, Tokenizer

spark = SparkSession.builder.master("local").appName("TF-IDF").getOrCreate()

sentenceData = spark.createDataFrame([
(0.0, "Hi I heard about Spark"),
(0.0, "I wish Java could use case classes"),
(1.0, "Logistic regression models are neat")
], ["label", "sentence"])

tokenizer = Tokenizer(inputCol="sentence", outputCol="words")
wordsData = tokenizer.transform(sentenceData)

hashingTF = HashingTF(inputCol="words", outputCol="rawFeatures", numFeatures=20)
featurizedData = hashingTF.transform(wordsData)

idf = IDF(inputCol="rawFeatures", outputCol="features")
idfModel = idf.fit(featurizedData)
rescaledData = idfModel.transform(featurizedData)

rescaledData.select("label", "features").show()

可参考examples/src/main/python/ml/word2vec_example.py

精读深度学习-前言

发表于 2018-04-26

前言

AI 系统需要具备自己获取知识的能力,即从原始数据中提取模式的能力。这种能力被称为机器学习(machine learning)。

引入机器学习使计算机能够解决涉及现实世界知识的问题,并能作出看似主观的决策。比如,一个被称为逻辑回归(logistic regression)的简单机器学习算法可以决定是否建议剖腹产 (Mor-Yosef et al., 1990)。而同样是简单机器学习算法的朴素贝叶斯(naive Bayes)则可以区分垃圾电子邮件和合法电子邮件。

这些简单的机器学习算法的性能在很大程度上依赖于给定数据的表示(repre-sentation)。

然而,对于许多任务来说,我们很难知道应该提取哪些特征。例如,假设我们想编写一个程序来检测照片中的车。我们知道,汽车有轮子,所以我们可能会想用车轮的存在与否作为特征。不幸的是,我们难以准确地根据像素值来描述车轮看上去像什么。虽然车轮具有简单的几何形状,但它的图像可能会因场景而异,如落在车轮上的阴影、太阳照亮的车轮的金属零件、汽车的挡泥板或者遮挡的车轮一部分的前景物体等等。

解决这个问题的途径之一是使用机器学习来发掘表示本身,而不仅仅把表示映射到输出。这种方法我们称之为表示学习(representation learning)。

在许多现实的人工智能应用中,困难主要源于多个变差因素同时影响着我们能够观察到的每一个数据。比如,在一张包含红色汽车的图片中,其单个像素在夜间可能会非常接近黑色。汽车轮廓的形状取决于视角。大多数应用需要我们理清变差因素并忽略我们不关心的因素。

深度学习(deep learning)通过其他较简单的表示来表达复杂表示,解决了表示学习中的核心问题。

深度学习模型的典型例子是前馈深度网络或多层感知机(multilayer perceptron, MLP)。多层感知机仅仅是一个将一组输入值映射到输出值的数学函数。该函数由许多较简单的函数复合而成。我们可以认为不同数学函数的每一次应用都为输入提供了新的表示。

深度学习是一种表示学习,也是一种机器学习,可以用于许多(但不是全部)AI 方法。

深度学习的进步也严重依赖于软件基础架构的进展。软件库如 Theano (Bergstra et al., 2010a; Bastien et al., 2012a)、PyLearn2 (Goodfellow et al., 2013e)、Torch (Col-lobert et al., 2011b)、DistBelief (Dean et al., 2012)、Caffe (Jia, 2013)、MXNet (Chen et al., 2015) 和 TensorFlow (Abadi et al., 2015) 都能支持重要的研究项目或商业产品。

总之,深度学习是机器学习的一种方法。在过去几十年的发展中,它大量借鉴了我们关于人脑、统计学和应用数学的知识。近年来,得益于更强大的计算机、更大的数据集和能够训练更深网络的技术,深度学习的普及性和实用性都有了极大的发展。未来几年充满了进一步提高深度学习并将它带到新领域的挑战和机遇。

Ref

  • 深度学习(Deep Learning)
  • 英文版地址http://www.deeplearningbook.org/

分布式数据仓库Hive

发表于 2018-04-25

简介

Hive是基于Hadoop的数据仓库解决方案。由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性,因此使用Hive构建的数据仓库也秉承了这些特性。

简单来说,Hive就是在Hadoop上架了一层SQL接口,可以将SQL翻译成MapReduce去Hadoop上执行,这样就使得数据开发和分析人员很方便的使用SQL来完成海量数据的统计和分析,而不必使用编程语言开发MapReduce那么麻烦。

环境依赖

  • Java
  • Hadoop,可移步至Hadoop安装

Java 1.8

  • sudo apt-get update
  • sudo apt-get install -y default-jre default-jdk

Hive 2.3.3

  • wget http://mirrors.hust.edu.cn/apache/hive/hive-2.3.3/apache-hive-2.3.3-bin.tar.gz
  • tar zxvf apache-hive-2.3.3-bin.tar.gz
  • sudo mv apache-hive-2.3.3-bin /usr/local/hadoop/hive
  • sudo chown vagrant:vagrant /usr/local/hadoop/hive

PATH

vi ~/.bashrc,添加以下代码

1
2
3
4
export JAVA_HOME=/usr/lib/jvm/default-java
export HIVE_HOME=/usr/local/hadoop/hive
export PATH=$HIVE_HOME/bin:$PATH
export HADOOP_HOME=<hadoop-install-dir>

HDFS上的文件初始化

$HADOOP_HOME/bin/hdfs dfs -mkdir /tmp
$HADOOP_HOME/bin/hdfs dfs -mkdir /user/hive/warehouse
$HADOOP_HOME/bin/hdfs dfs -chmod g+w /tmp
$HADOOP_HOME/bin/hdfs dfs -chmod g+w /user/hive/warehouse

Hive元数据的储存模式

+“单用户”模式:利用该模式连接到内存数据库Derby,Derby不支持多会话连接,这种模式一般用于单机测试
+“多用户”模式:通过网络和JDBC连接到规模更大的专业数据库,如MySQL
+“远程服务器”模式:用于非Java客户端访问在远程服务器上储存的元数据库,需要在服务端启动一个MetaStoreServer,然后在客户端通过Thrift协议访问该服务器,进而访问到元数据

单用户模式

  • 配置文件
    cp conf/hive-default.xml.template conf/hive-default.xml

  • Hive Shell:
    bin/hive

Hive集成MySQL数据库

  1. 新建hive数据库,用来保存hive的元数据
    mysql> create database hive;

  2. 将hive数据库下的所有表的所有权限赋给hadoop用户,并配置mysql为hive-site.xml中的连接密码,然后刷新系统权限关系表

    1
    2
    3
    mysql> CREATE USER  'hadoop'@'%'  IDENTIFIED BY 'mysql';
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'hadoop'@'%' WITH GRANT OPTION;
    mysql> flush privileges;

多用户模式安装

  • vi conf/hbase-site.xml,没有的话新建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <configuration>
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true</value>
    <description>metadata is stored in a MySQL server</description>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>MySQL JDBC driver class</description>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>user name for connecting to mysql server</description>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
    <description>password for connecting to mysql server</description>
    </property>
    </configuration>
  • 下载相应的mysql jar包,解压后放入$HIVE_HIME/lib下
    lib/mysql-connector-java-5.1.46-bin.jar

  • 初始化数据表
    schematool -dbType mysql -initSchema
    schematool -dbType mysql -info

  • Hive Shell:
    bin/hive

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE pokes (foo INT, bar STRING);
    CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
    SHOW TABLES;
    SHOW TABLES '.*s';
    DESCRIBE invites;
    LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
    LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
    LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');
    SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
    INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';

    DDL 和 DML

分布式数据库HBase

发表于 2018-04-23

简介

HBase – Hadoop Database,是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。

HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。

环境依赖

  • Java,具体可参考推荐版本
  • ssh,sshd服务

Java 1.8

  • sudo apt-get update
  • sudo apt-get install -y default-jre default-jdk

HBase 1.3.2

  • wget http://mirrors.hust.edu.cn/apache/hbase/1.3.2/hbase-1.3.2-bin.tar.gz
  • tar zxvf hbase-1.3.2-bin.tar.gz
  • sudo mv hbase-1.3.2 /usr/local/hadoop/hbase
  • sudo chown vagrant:vagrant /usr/local/hadoop,注意此处,必须为hbase上级目录设置权限

PATH

  • vi ~/.bashrc,添加以下代码
    1
    2
    export JAVA_HOME=/usr/lib/jvm/default-java
    export HBASE_HOME=/usr/local/hadoop/hbase

单机模式安装

  • 配置文件

    • hbase-site.xml:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <configuration>
      <property>
      <name>hbase.rootdir</name>
      <value>file:///opt/data/hbase</value>
      </property>
      <property>
      <name>hbase.zookeeper.property.dataDir</name>
      <value>/opt/data/zookeeper</value>
      </property>
      </configuration>
    • conf/hbase-env.sh文件中,修改:
      export JAVA_HOME=/usr/lib/jvm/default-java
      export HBASE_MANAGES_ZK=true,使用hbase自带zookeeper

  • 运行:

    1. 启动服务
      bin/start-hbase.sh

    2. 停止服务
      bin/stop-hbase.sh

伪分布式安装

  • 配置文件

    • hbase-site.xml:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      <configuration>
      <property>
      <name>hbase.rootdir</name>
      <value>hdfs://localhost:8020/hbase</value>
      </property>
      <property>
      <name>hbase.zookeeper.property.dataDir</name>
      <value>/opt/data/zookeeper</value>
      </property>
      <property>
      <name>hbase.cluster.distributed</name>
      <value>true</value>
      </property>
      </configuration>
    • conf/hbase-env.sh文件中,修改:
      export JAVA_HOME=/usr/lib/jvm/default-java
      export HBASE_MANAGES_ZK=true,使用hbase自带zookeeper

  • 运行:

    1. 启动服务
      bin/start-hbase.sh

    2. master副本
      bin/local-master-backup.sh start 2 3 5

    3. region server副本
      bin/local-regionservers.sh start 2 3

    4. 停止服务
      bin/stop-hbase.sh
      cat /tmp/hbase-vagrant-1-master.pid |xargs kill -9
      bin/local-regionservers.sh stop 3

HBase基本操作

  1. 连接到HBase

    1
    2
    $ ./bin/hbase shell
    hbase(main):001:0>
  2. 显示帮助,help

  3. 建表

    1
    2
    hbase(main):001:0> create 'test', 'cf'
    0 row(s) in 0.4170 seconds
  4. 查看表信息

    1
    2
    3
    4
    hbase(main):002:0> list 'test'
    TABLE
    test
    1 row(s) in 0.0180 seconds
  5. 写数据

    1
    2
    3
    4
    5
    6
    7
    8
    hbase(main):003:0> put 'test', 'row1', 'cf:a', 'value1'
    0 row(s) in 0.0850 seconds

    hbase(main):004:0> put 'test', 'row2', 'cf:b', 'value2'
    0 row(s) in 0.0110 seconds

    hbase(main):005:0> put 'test', 'row3', 'cf:c', 'value3'
    0 row(s) in 0.0100 seconds
  6. 获取数据

    1
    2
    3
    4
    5
    6
    hbase(main):006:0> scan 'test'
    ROW COLUMN+CELL
    row1 column=cf:a, timestamp=1421762485768, value=value1
    row2 column=cf:b, timestamp=1421762491785, value=value2
    row3 column=cf:c, timestamp=1421762496210, value=value3
    3 row(s) in 0.0230 seconds
  7. 获取单行数据

    1
    2
    3
    4
    hbase(main):007:0> get 'test', 'row1'
    COLUMN CELL
    cf:a timestamp=1421762485768, value=value1
    1 row(s) in 0.0350 seconds
  8. 禁用表

    1
    2
    3
    4
    5
    hbase(main):008:0> disable 'test'
    0 row(s) in 1.1820 seconds

    hbase(main):009:0> enable 'test'
    0 row(s) in 0.1770 seconds
  9. 删除表

    1
    2
    hbase(main):010:0> drop 'test'
    0 row(s) in 0.1370 seconds
  10. 退出

    1
    hbase(main):011:0> exit

Hadoop安装

发表于 2018-04-21

环境依赖

  • Java,具体可参考推荐版本
  • ssh,sshd服务

Java 1.8

  • sudo apt-get update
  • sudo apt-get install -y default-jre default-jdk

Hadoop 2.7.5

  • wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.5/hadoop-2.7.5.tar.gz
  • tar zxvf hadoop-2.7.5.tar.gz
  • sudo mv hadoop-2.7.5 /usr/local/hadoop
  • sudo chown vagrant /usr/local/hadoop

PATH

  • vi ~/.bashrc,添加以下代码
    1
    2
    export JAVA_HOME=/usr/lib/jvm/default-java
    export HADOOP_HOME=/usr/local/hadoop

Hadoop目前支持的集群模式

  • 单机模式安装
  • 伪分布式模式安装
  • 完全分布式安装

单机模式安装

  • mkdir input
  • cp etc/hadoop/*.xml input
  • bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar grep input output 'dfs[a-z.]+'
  • ls output

伪分布式模式安装

  • shh配置

    • ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
    • cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    • chmod 0600 ~/.ssh/authorized_keys
    • 测试:ssh localhost
  • 配置文件

    • etc/hadoop/core-site.xml,ubuntu-xenial为服务器主机名或IP:

      1
      2
      3
      4
      5
      6
      <configuration>
      <property>
      <name>fs.defaultFS</name>
      <value>hdfs://ubuntu-xenial:9000</value>
      </property>
      </configuration>
    • etc/hadoop/hdfs-site.xml:

      1
      2
      3
      4
      5
      6
      <configuration>
      <property>
      <name>dfs.replication</name>
      <value>1</value>
      </property>
      </configuration>
    • etc/hadoop/hadoop-env.sh文件中,修改:
      export JAVA_HOME=/usr/lib/jvm/default-java

  • 运行:

    1. 格式化文件系统
      bin/hdfs namenode -format

    2. 运行NameNode和DataNode服务
      sbin/start-dfs.sh

      运行日志默认写在$HADOOP_LOG_DIR文件夹下,默认为$HADOOP_HOME/logs

    3. NameNode web界面
      http://ubuntu-xenial:50070/

    4. 建立分布式文件夹
      bin/hdfs dfs -mkdir /user
      bin/hdfs dfs -mkdir /user/<username>

    5. 将本地文件复制到分布式系统
      bin/hdfs dfs -put etc/hadoop input

    6. 运行MapReduce任务
      bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar grep input output 'dfs[a-z.]+'

    7. 从分布式文件系统文件复制到本地,并验证
      bin/hdfs dfs -get output output
      cat output/*
      or
      bin/hdfs dfs -cat output/*

    8. 停止服务
      sbin/stop-dfs.sh

YARN服务的引入

  • 配置文件

    • etc/hadoop/mapred-site.xml:

      1
      2
      3
      4
      5
      6
      <configuration>
      <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
      </property>
      </configuration>
    • etc/hadoop/yarn-site.xml:

      1
      2
      3
      4
      5
      6
      <configuration>
      <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
      </property>
      </configuration>
  • 运行YARN的ResourceManager和NodeManager
    sbin/start-yarn.sh

  • ResourceManager的web界面
    http://ubuntu-xenial:8088/

  • 运行MapReduce任务

  • 停止YARN服务
    sbin/stop-yarn.sh

123
oobspark

oobspark

Out Of the Box and Spark

27 日志
51 标签
GitHub
© 2018 - 2020 oobspark
由 Hexo 强力驱动
主题 - NexT.Muse