人人都可以,从0到1建立大数据平台

大数据时代这个词被提出已有10年左右了,越来越多的企业已经完成了数字化转型,或在转型中。其普及原因一是因为大数据价值在越来越多的场景中被挖掘,二是因为大数据平台的搭建门槛也越来越低。借助开源的力量,任何有基础研发能力的组织完全可以搭建自己的大数据平台,这里和大家分享0到1搭建方案,以扫盲。

总览

整体大数据平台可以分为存、管、用三部分:
存数据,主要指数据的采集和存储;
管数据,主要指数据仓库内数据模型的搭建和元数据管理;
用数据,主要指使用数据来优化决策是改善用户体验。
我们主要选择Hadoop生态系统为基础,来构建我们的数据平台。

数据流程

如上图所示,从数据源到分析报告或系统应用的过程中,主要包括数据采集同步、数据仓库存储、ETL、统计分析、写入上层DB等环节。这是一条主线,在实际的落地过程中,可能还会有分支的环节出现,比如特征工程。

数据采集

日常的数据来源主要是两块:APP/web访问日志,各业务数据库。这两类数据采集同步到数据仓库的方式有所不同,并且每种数据都分为实时和非实时两种场景。

APP/web访问日志采集

用户访问我们的产品会产生大量的日志,因此我们需要特定的日志采集系统来采集并输送这些日志。Flume是目前常用的开源选择,Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。

继续阅读“人人都可以,从0到1建立大数据平台”

用R快速搭建配置web后台

在日常的数据工作中,常会碰到需要上传配置数据的情况,比如字典表、指定特定的用户或商品等。若能快速地做出相应的配置后台,只需在浏览器上就能上传数据,既方便自己,更重要的是还能够开放给需要的业务人员自己去管理。

这里分享一个用R快速搭建配置后台的方式,借助R的shiny包,能方便的做出这个web应用。

这个简单的配置管理后台具有两个模块:
1、查询现有的配置列表
2、上传更新配置列表

OK,下面开始coding。

首先,载入用到的包。这里使用xlsx上传数据,因为对于业务人员来说excel更通用,远端数据库用的是MySQL。这里你完全可以根据自己的需要修改。

library(shiny)
library(xlsx)
library(RMySQL)

接着,进行必要的信息配置。首先,在数据库中新建表,并定义字段,这是用来存储配置数据的。

yourtable <- "tmp_peizhi_test_yueshi"  #此处修改为对应的表名

# 配置数据库连续信息
host <- "xxxx"
user <- "yueshi"
password <- "VcXDBcGEC1aI"
port <- 3305
dbname <- "test"

然后,开始进行shiny的部分,shiny的代码包括ui和server两个主模块。

ui采用navbarPage的布局,分别建立两个tabPanel,对应"现有配置列表"和"上传配置"。为了保证上传的数据符合规范,这里设计提供上传模板,让用户下载模板后,按模板上传数据即可。在成功上传后,会提示上传成功状态,并说明数据位置,同时在右侧展示新上传的配置数据。

继续阅读“用R快速搭建配置web后台”

CNN实战:tensorflow训练mnist手写数字识别

用tensorflow可以轻松的搭建卷积神经网络,layer层api的加入更是方便了整个过程。本文以mnist手写数字识别的训练为例,轻松挑战99%准确率。

准备

首先,导入必要的库和函数。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

载入mnist数据,注意这里input_data.read_data_sets的参数reshape=Fales,以保留3维的图片数据,否则图片会被变换为向量。由于是黑白图片,所以这里的颜色通道数为1。这里image的shape为(None,28,28,1)。

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True, reshape=False)

定义数据流图结构

定义变量。这里我们不需要再定义各层网络的权重和偏差,这便是layers的方便之处,它们会被自动创建。

x = tf.placeholder(tf.float32, shape=(None,28,28,1))
y_ = tf.placeholder(tf.float32, shape=(None,10))
istrain = tf.placeholder(tf.bool) # dropout时参数用到

然后开始定义卷积网络结构,激活函数采用relu,这里使用卷积层⇒池化层⇒卷积层⇒池化层。 继续阅读“CNN实战:tensorflow训练mnist手写数字识别”

在ipython中引入pyspark

除了通过pyspark命令来启动pyspark外,可否在普通的python进程中调用spark呢,这样便能方便配合IDE使用了。findspark包可以实现,过程如下:

1、首先设置SPARK_HOME

如果你不清楚SPARK_HOME位置,可以在pyspark的shell里获取:
启动pyspark

import os
os.environ.get('SPARK_HOME', None)

此时会显示路径,如'/opt/cloudera/parcels/CDH/lib/spark'

在 .bashrc 里添加

export SPARK_HOME='/opt/cloudera/parcels/CDH/lib/spark’
然后重新登入终端,以使更改生效。

2、安装findspark包

pip install findspark

一切就绪。

3、启动ipython

import findspark
findspark.init()

然后你就可以自由调用pyspark的API了,如:

from pyspark.sql import SparkSession

SSH远程访问jupyter notebook

jupyter notebook的一大好处,就是可以通过浏览器进行操作,那远程访问在很多时候自然是非常必要的。配置如下:

首先,在远程端打开jupyter notebook服务:

jupyter notebook


如上图,会显示端口号(这里是8888)和token,token在之后登入时会用到。

接着,在本地终端输入:

ssh username@host_address -N -L localhost:8889:localhost:8888

前面localhost:8889是本地的端口,后面localhost:8888是要映射的远程端口。

最后,你应该可以通过在本地浏览器输入127.0.0.1:8889或者localhost:8889访问jupyter notebook了,用刚刚的token即可登入。

如何读取Google开源的audioset的tfrecord文件

谷歌前段时间开源的audioset可以说是音频届的imagenet了,拥有200多万的音频和500多个分类(截止2017年3月)。官方下载地址点这里。官方提供了两种数据获取方式:一种是提供音频字典信息,由自己下载相关youtube音频;另一种以1Hz采样的128维音频特征数据,tfrecord格式数据。

那么,这些tfrecord格式的数据便可按下面的方式来读取。

import numpy as np
import tensorflow as tf

sess = tf.InteractiveSession()

filename = '2a.tfrecord'
filename_queue = tf.train.string_input_producer([filename])  # 添加队列
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
contexts, features = tf.parse_single_sequence_example(
serialized_example,
context_features={
"video_id": tf.FixedLenFeature([], tf.string),
"labels": tf.VarLenFeature(tf.int64)
},
sequence_features={
'audio_embedding': tf.FixedLenSequenceFeature([], dtype=tf.string)
})

embedding_0 = tf.decode_raw(features['audio_embedding'], tf.uint8)  # 转换格式
embedding = tf.reshape(embedding_0, [10, 128])  # 指定embedding的结构
batch = tf.train.shuffle_batch(
[embedding], batch_size=30, capacity=2000, min_after_dequeue=1000)

tf.global_variables_initializer().run()  # 初始化变量
tf.train.start_queue_runners(sess=sess)  # 启动队列

print(embedding_0.eval().shape)  # 验证embedding的shape
audio_feature = batch.eval()  # 读取数据

Mac上iterm2配置rz、sz从远程服务器上传下载文件

首先,下载并安装iterm2:http://www.iterm2.com/downloads.html

接着,安装rzsz

brew install lrzsz

然后,保存iterm2-send-zmodem.sh 和 iterm2-recv-zmodem.sh 脚本到/usr/local/bin/ :

git clone https://github.com/mmastrac/iterm2-zmodem.git
cd iterm2-zmodem/
mv iterm2-recv-zmodem.sh /usr/local/bin/
mv iterm2-send-zmodem.sh /usr/local/bin/

最后,在iterm2的Triggers里添加如下两条规则:
Regular expression: rz waiting to receive.\*\*B0100
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-send-zmodem.sh
Instant: checked


Regular expression: \*\*B00000000000000
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-recv-zmodem.sh
Instant: checked

配置完成。另外,远程服务端也需要安装lrzsz。

用tensorflow解码图片

用深度学习进行图片识别时,往往需要将各原始图片转换为相同的尺寸,并且数字化。其实,tensorflow本身就能非常方便地实现这个过程。

import tensorflow as tf

"""读取图片文件"""
file1 = tf.read_file('image.jpg')

"""解码图片,png格式用tf.image.decode_png,
channels=3表示RGB,1表示灰度"""
image = tf.image.decode_jpeg(file1, channels=3)

"""调整图片大小,size=[new_height, new_width]"""
image = tf.image.resize_images(image, size=[32,32])

"""转化图片转化为float32类型,并缩放到[0,1]之间,
也可使用 tf.cast(image, tf.float32)/255(一般图片类型最大值为255)"""
image = tf.image.convert_image_dtype(image, tf.float32)

# 在会话中运行
sess = tf.Session()
sess.run(image)

tensorflow实现mnist手写数字识别

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 载入数据
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 定义tensorflow结构
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y_ = tf.placeholder(tf.float32, [None, 10])

"""激励函数softmax和loss函数交叉熵"""
y = tf.nn.softmax(tf.matmul(x, W) + b)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), axis=1))

"""或者用tf内置的loss函数,注意tf.nn.softmax_cross_entropy_with_logits已内置softmax变换"""
# y_l = tf.matmul(x,W) + b
# cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_l))

"""用梯度下降提升"""
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

"""初始化全部变量"""
init = tf.global_variables_initializer()

# 训练
sess = tf.Session()
sess.run(init)

"""进行600次更新,SGD每批次输入100个样本"""
for i in range(600):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
# 评估模型,每20步打印准确率
if i % 20 == 0:
"""tf.argmax返回最大值的index,tf.equal比较是否相等"""
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
"""转换为数字并求平均,如[True,False,False,True]转化为[1,0,0,1],平均值为0.5"""
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
"""用测试数据计算,并打印准确率"""
print(i, sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

sess.close()

tensorflow的GPU配置

以Ubuntu系统为例:

1、首先安装Cuda Toolkit
下载地址:https://developer.nvidia.com/cuda-downloads
安装步骤:

# Install repository meta-data:
sudo dpkg -i cuda-repo-<distro>_<version>_<architecture>.deb
# Update the Apt repository cache:
sudo apt-get update
# Install CUDA:
sudo apt-get install cuda

2、安装cuDNN
下载地址:https://developer.nvidia.com/cudnn
配置步骤(假设Cuda toolkit安装在/usr/local/cuda):

tar xvzf cudnn-8.0-linux-x64-v5.1-ga.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

3、安装其他依赖

sudo apt-get install libcupti-dev

4、安装支持gpu版本的tensorflow

pip install tensorflow-gpu