Openresty/Lua + Thrift + HBase

【信息科学与工程学】计算机科学与自动化 第二百三十三篇 凤凰架构01 编号类型领域系统软件/硬件或系统集成方案及系统架构模块子模块函数名称/算法名称算法的数学分析及计算机体系架构及数据结构与算法详细设计及参数列表及数值范围设计关联知识1共识算法分布式基石状态机复制架构:Proposer/Acceptor/Learner 多节点角色模型,基于操作转移(Operation Transfer)分布式共识PaxosPaxos 协议(Prepare/Promise/Accept/Accepted 两阶段)数学基础:多数派(Quorum)投票,基于鸽巢原理保证 W+R>N 时读写集合必有 阅读详情

1. 问题

在Openresty环境下(也就是lua语言下),如何访问HBase?Lua不方便调用HBase的原生API(Java),所以只能通过别的方式,例如:

  • Rest
  • Thrift

Rest提供的接口不够丰富,比如checkAndPut就没有支持,所以,有必要尝试一下Thrift.

2. Thrift是什么

简单来说,Thrift是一种SOA(Service Oriented Architecture)的实现方式,和WSDL+SOAP那一套类似。过程都是这样的:

  • 以一种接口语言定义接口(对于WSDL+SOAP是.wsdl文件;对于Thrift是.thrift文件);
  • 使用一个编译器,把接口文件(.wsdl或者.thrift)转化为代码(客户端类和服务端虚基类/接口);
  • 继承服务端虚基类/接口,实现服务端逻辑;并部署服务;
  • 基于客户端类,通过少量的开发即可实现客户端,与服务端通信。
Thrift或者WSDL+SOAP框架帮助程序员实现远程方法调用,在整个过程中,程序员不用考虑参数的序列化、网络传输、返回数据的反序列化,甚至包括安全、事务等方面的工作。

3. 环境

  • CentOS 7
  • Luajit:为了很好的和openresty结合,我们使用openresty 1.9.15.1包自带的luajit;它和lua 5.1兼容;
  • Thrift 0.9.2:目前最新版是0.9.3,但是Thrift 0.9.3需要lua 5.2及以上版本,所以我们使用和lua 5.1兼容的Thrift 0.9.2。这为我们带来很多麻烦,因为Thrift 0.9.2有一些bug,见后文Thrift安装部分;
  • HBase 1.2.2:它里面有两个Thrift Server:thrift基于HBase的老API;thrift2基于HBase的新API;我们使用后者。

4. HBase安装与配置

HBase的安装与配置涉及到Hadoop hdfs和zookeeper,这里略去其过程。HBase服务成功启动后,启动Thrift服务:

# /usr/local/hbase-1.2.2/bin/hbase-daemon.sh start thrift2 -p 9090 --infoport 9095

5. Openresty安装

目前我们只需要使用luajit,但为了后续与openresty兼容,干脆这里把openresty安装了,后面实验直接使用它自带的luajit。假定已经安装了PCRE,OpenSSL等依赖:

# cd /tmp/
# wget https://openresty.org/download/openresty-1.9.15.1.tar.gz
# tar zxvf openresty-1.9.15.1.tar.gz
# cd openresty-1.9.15.1/
# ./configure --prefix=/usr/local/openresty-1.9.15.1 --without-lua51 --with-luajit
# gmake
# gmake install
# ln -s /usr/local/openresty-1.9.15.1/luajit/lib/libluajit-5.1.so /usr/lib64/libluajit-5.1.so
# ln -s /usr/local/openresty-1.9.15.1/luajit/lib/libluajit-5.1.so.2 /usr/lib64/libluajit-5.1.so.2

现在,我们就有了luajit:/usr/local/openresty-1.9.15.1/luajit/

6. 安装Thrift

6.1 安装依赖

# yum install readline.x86_64 install readline-devel.x86_64
# yum install libtool.x86_64
# yum install boost.x86_64 boost-devel.x86_64
# yum install byacc.x86_64
# yum install flex.x86_64 flex-devel.x86_64 
# yum install openssl.x86_64 openssl-devel.x86_64

6.2 编译安装Thrift

# cd /tmp/
# git clone https://github.com/apache/thrift
# cd thrift/
# git branch -a
# git checkout -b 0.9.2 origin/0.9.2    <-- 切换到0.9.2版本
# ./bootstrap.sh
# ./configure --prefix=/usr/local/thrift-0.9.2                                \
        LUA=/usr/local/openresty-1.9.15.1/luajit/bin/luajit                   \
        LUA_INCLUDE=-I/usr/local/openresty-1.9.15.1/luajit/include/luajit-2.1 \
        LUA_LIB="-L/usr/local/stor-openresty/luajit/lib -lluajit-5.1"

修改bug1:

# vim lib/lua/src/luabpack.c
106c106
<   size_t len = lua_rawlen(L, 2);
---
>   size_t len = lua_objlen(L, 2);

修改bug2:

# vim lib/lua/Makefile
385a386,387
> LUA_INCLUDE=-I/usr/local/openresty-1.9.15.1/luajit/include/luajit-2.1
> LUA_LIB=-lluajit-5.1
516,517c518,519
< libluasocket_la_CPPFLAGS = $(AM_CPPFLAGS) -I/usr/include/lua5.2 -DLUA_COMPAT_MODULE
< libluasocket_la_LDFLAGS = $(AM_LDFLAGS) -llua5.2 -lm
---
> libluasocket_la_CPPFLAGS = $(AM_CPPFLAGS) $(LUA_INCLUDE) -DLUA_COMPAT_MODULE
> libluasocket_la_LDFLAGS = $(AM_LDFLAGS) $(LUA_LIB) -lm
519,520c521,522
< libluabpack_la_CPPFLAGS = $(AM_CPPFLAGS) -I/usr/include/lua5.2 -DLUA_COMPAT_MODULE
< libluabpack_la_LDFLAGS = $(AM_LDFLAGS) -llua5.2 -lm
---
> libluabpack_la_CPPFLAGS = $(AM_CPPFLAGS) $(LUA_INCLUDE) -DLUA_COMPAT_MODULE
> libluabpack_la_LDFLAGS = $(AM_LDFLAGS) $(LUA_LIB) -lm
523,524c525,526
< libluabitwise_la_CPPFLAGS = $(AM_CPPFLAGS) -I/usr/include/lua5.2 -DLUA_COMPAT_MODULE
< libluabitwise_la_LDFLAGS = $(AM_LDFLAGS) -llua5.2 -lm
---
> libluabitwise_la_CPPFLAGS = $(AM_CPPFLAGS) $(LUA_INCLUDE) -DLUA_COMPAT_MODULE
> libluabitwise_la_LDFLAGS = $(AM_LDFLAGS) $(LUA_LIB) -lm
529,530c531,532
< liblualongnumber_la_CPPFLAGS = $(AM_CPPFLAGS) -I/usr/include/lua5.2 -DLUA_COMPAT_MODULE
< liblualongnumber_la_LDFLAGS = $(AM_LDFLAGS) -llua5.2 -lm
---
> liblualongnumber_la_CPPFLAGS = $(AM_CPPFLAGS) $(LUA_INCLUDE) -DLUA_COMPAT_MODULE
> liblualongnumber_la_LDFLAGS = $(AM_LDFLAGS) $(LUA_LIB) -lm

修改bug3:

# vim lib/lua/Makefile
508a509
>                       liblualongnumber.la \
510,511c511
<                       libluabitwise.la \
<                       liblualongnumber.la
---
>                       libluabitwise.la


好,现在开始make并make install。若make因缺失依赖而失败,需要make clean,重新configure,重新fix上面的bug,然后重试make。

# make
# make install

另外,make install不会拷贝lua库,所以需要手动拷贝

# mkdir /usr/local/thrift-0.9.2/lualib
# cp lib/lua/*.lua /usr/local/thrift-0.9.2/lualib/

修改bug4:错误 Thrift.lua:43: malformed number near '0.9.2'

# vim /usr/local/thrift-0.9.2/lualib/Thrift.lua
43c43
< version = 0.9.2
---
> --version = 0.9.2

修改bug5:创建TBufferedTransport实例时,误创建为的TTransportBase实例。

# vim /usr/local/thrift-0.9.2/lualib/TBufferedTransport.lua
40c40
<   return TTransportBase:new(obj)
---
>   return TTransportBase.new(self,obj)

Thrift安装完毕!

7. 访问HBase

7.1 找到.thrift文件

下载HBase 1.2.2源代码,里面包含两个.thrift文件。它们是接口定义文件,类似于WSDL+SOAP里面的.wsdl文件:

# find . -name "*.thrift"
./hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift
./hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift

我们只需要上面那个,它是thrift2的接口定义。

7.2 编译.thrift文件生成lua文件

# cd /home
# mkdir test
# cd test/
# cp /home/hbase-1.2.2/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift .
# /usr/local/thrift-0.9.2/bin/thrift -r --gen lua hbase.thrift
# ls
gen-lua  hbase.thrift
# ll gen-lua/           <--生成的目录和文件
total 120
-rw-r--r--. 1 root root   136 Aug 30 10:04 hbase_constants.lua
-rw-r--r--. 1 root root 74532 Aug 30 10:04 hbase_THBaseService.lua
-rw-r--r--. 1 root root 38447 Aug 30 10:04 hbase_ttypes.lua

修改bug6: 生成代码错误

# vim gen-lua/hbase_ttypes.lua
508c508
<     oprot:writeListBegin(TType.STRUCT, string.len(self.columns))
---
>     oprot:writeListBegin(TType.STRUCT, #self.columns)<strong>
</strong>

7.3 使用生成的lua文件访问HBase

# mkdir mycode
# vim mycode/client.lua

#!/usr/local/openresty-1.9.15.1/luajit/bin/luajit

require('TSocket')
require('TBufferedTransport')
require('TFramedTransport')
--require('THttpTransport')
--require('TCompactProtocol')
--require('TJsonProtocol')
require('TBinaryProtocol')
require('liblualongnumber')

require('hbase_THBaseService')


local client = nil

function teardown()
  if client then
    -- close the connection
    client:close()
  end
end

function parseArgs(rawArgs)
  local opt = {
    protocol='binary',
    transport='buffered',
    port='9090',
  }
  for i, str in pairs(rawArgs) do
    if i > 0 then
      k, v = string.match(str, '--(%w+)=(%w+)')
      assert(opt[k] ~= nil, 'Unknown argument')
      opt[k] = v
    end
  end
  return opt
end

function assertEqual(val1, val2, msg)
  assert(val1 == val2, msg)
end

function testBasicClient(rawArgs)
  local opt = parseArgs(rawArgs)
  local socket = TSocket:new{
    port = tonumber(opt.port)
  }
  assert(socket, 'Failed to create client socket')
  socket:setTimeout(5000)

  local transports = {
    buffered = TBufferedTransport,
    framed = TFramedTransport,
    http = THttpTransport,
  }
  assert(transports[opt.transport] ~= nil)

  local transport = transports[opt.transport]:new{
    trans = socket,
    isServer = false
  }

  local protocols = {
    binary = TBinaryProtocol,
    compact = TCompactProtocol,
    json = TJSONProtocol,
  }
  assert(protocols[opt.protocol] ~= nil)
  local protocol = protocols[opt.protocol]:new{
    trans = transport
  }
  assert(protocol, 'Failed to create binary protocol')

  client = THBaseServiceClient:new{
    protocol = protocol
  }
  assert(client, 'Failed to create client')

  -- Open the transport
  local status, _ = pcall(transport.open, transport)
  assert(status, 'Failed to connect to server')


  --1. check if a row exists
  local tget = TGet:new{
      row="UUUU1234_bucket1"
  }

  local ok,ret = pcall(client.exists, client, "bucket", tget)
  if not ok or not ret then
      print("client:exists failed")
  else
      print("client:exists succeeded:")
      print("\t", ret)
  end

  --2. get a row
  local ok,ret = pcall(client.get, client, "bucket", tget)
  if not ok or not ret then
      print("client:get failed")
  else
      print("client:get succeeded:")
      local row=ret.row
      for i,v in pairs(ret.columnValues) do
          print("\t",row, v.family..":"..v.qualifier, v.value)
      end
  end

end

testBasicClient(arg)
teardown()


我是参照thrit源代码中test_basic_client.lua搞通的,前文提到的bug5也是在这个测试中发现。当然,HBase里的数据是我通过hbase shell手动插入的,这里只测试它是否存在,并get出来。

7.4 测试

为了方便运行,我写了个脚本:

# vim client.sh

#!/bin/bash


TEST_HOME=/home/test
THRIFT_HOME=/usr/local/thrift-0.9.2
LUA_HOME=/usr/local/openresty-1.9.15.1/luajit

rm -fr gen-lua
$THRIFT_HOME/bin/thrift -r --gen lua hbase.thrift

export LUA_PATH="$THRIFT_HOME/lualib/?.lua;$TEST_HOME/gen-lua/?.lua;$TEST_HOME/mycode/?.lua;;"
export LUA_CPATH="$THRIFT_HOME/lib/?.so;;"

$LUA_HOME/bin/luajit mycode/client.lua


运行结果:

# ./client.sh
client:exists succeeded:
                true
client:get succeeded:
                UUUU1234_bucket1        exattrs:content movies
                UUUU1234_bucket1        info:ctime      Thu, 11 Aug 2016 02:14:45 +0000
                UUUU1234_bucket1        info:mtime      Thu, 11 Aug 2016 02:14:45 +0000
                UUUU1234_bucket1        quota:enabled   yes
                UUUU1234_bucket1        quota:objects   1024
                UUUU1234_bucket1        quota:size_mb   1024000
                UUUU1234_bucket1        stats:mb_rounded        0
                UUUU1234_bucket1        stats:objects   0
                UUUU1234_bucket1        stats:size_bytes        0
                UUUU1234_bucket1        ver:tag BBBB1234
                UUUU1234_bucket1        ver:version     0


8. 下一步

研究HBase Thrift API支持的接口(是否比REST丰富);

测试Thrift的性能;

lua实现调用webservice lua实现webservice调用 通过gsoap 实现 C/C++ 调用web service 立即下载

相关推荐

滚动时域优化方法

滚动时域优化(Receding Horizon Optimization, RHO),也被广泛称为模型预测控制(Model Predictive Control, MPC),是一种用于动态系统优化和控制的。其核心思想是“在每个当前时刻k,控制器只考虑未来一个(称为“预测时域”或“优化时域”,长度N)内的系统行为。(通过测量或估计得到)。(描述状态如何随输入和干扰变化)。(如果有,可能基于历史数据或假设)。在这个有限的未来时域[k, k+N-1]上,求解一个。这个优化问题的目标是找到一个。

m0_69522810的博客 2289

lua是什么

Lua是什么 管理提醒: 本帖被 lua china 从 lua新手入门 移动到本区(2008-12-01) 1993年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人员,他们给这门语言取了个浪漫的名字——Lua,在葡萄牙语里代表美丽的...

weixin_30568715的博客 502

Python爬虫实战:5分钟搞定东方财富A股数据抓取(附完整代码)

本文提供了一套基于Python的A股数据自动化采集与分析系统构建方案。文章详细解析了如何通过稳健的爬虫框架从东方财富等公开数据源高效抓取A股数据,并设计数据库进行自动化存储与管理,特别适合量化研究和数据分析场景。

weixin_29062963的博客 4425

有关lua,luci的介绍

一颗璀璨的月光宝石——Lua Lua语言简介 1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人员,他们给这门语言取了个浪漫的名字——Lua,在葡萄牙语里代表美丽的月亮。事实证明她没有糟蹋这个优美的单词,Lua语言正如它名字

user_920的专栏 1万+

面积二次矩second moment of area 极惯性矩polar moment of area 转动惯量moment of inertia面积一次矩first moment of area

看论文记录一下力学的名词专业术语,后面可以查看。

subtitle_的博客 5367

RTT(RT-Thread)串口设备(RTT保姆级教程)

本章主要介绍串口设备在RT-Thread操作系统中应用层如何使用。关于串口设备的使用,我们只需要在应用层找到串口设备,然后去初始化,初始化完成以后就可以读写串口设备了。操作的方法在应用层,驱动是不需要我们去完成的,驱动已经在操作系统中提供了。

qq_25218501的博客 1万+

WebService的作用和好处

小弟初探WebService,有些东西不明白请大家赐教。 1、WebService一般都用在什么样的场景? 2、网上搜索一些WebService的实现,上来就是吧wsdl贴出来,一堆属性...它是怎么传输xml的? 3、看到大家实现的WebService都是一个项目中,比如java中创建了server,有创建client,在client中又调用server中的接口,具体在跨语言系统中如...

weixin_36440307的博客 1249

XGBoost详解(原理篇)

XGBoost全称为eXtreme Gradient Boosting,即极致梯度提升树。XGBoost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器(个体学习器间存在强依赖关系,必须串行生成的序列化方法)。Note:关于Boosting算法详见博文集成学习详解_tt丫的博客-优快云博客XGBoost是一种提升树模型,即它将许多树模型集成在一起,形成一个很强的分类器。其中所用到的树模型则是CART回归树模型。

tt丫的博客 7万+

【Nginx高级篇】Lua基础语法和OpenResty的安装

讲解Lua脚本的基础语法和OpenResty的安装

m0_62946761的博客 3793

OCEAN 电路仿真

介绍利用 Cadence OCEAN 进行电路脚本仿真的方法

weixin_43249158的博客 4401

车载以太网测试-3【Wireshark介绍】

数据包捕获支持从多种网络接口(如以太网、Wi-Fi、蓝牙等)捕获数据包。可以实时捕获或从文件中读取已捕获的数据包。协议解析支持解析数百种网络协议(如 TCP/IP、HTTP、DNS、FTP 等)。能够深入解析协议头部和负载,帮助用户理解网络通信的细节。过滤功能提供强大的显示过滤器和捕获过滤器,帮助用户快速定位和分析感兴趣的数据包。支持基于协议、IP地址、端口号等多种条件的过滤。统计和分析提供多种统计工具,如流量图、会话统计、协议分层统计等。

车载网络测试工程师的博客 1982

Lua的各种资源1

Libraries And Bindings LuaDirectory>LuaAddons>LibrariesAndBindings This is a list of libraries implemented in Lua or implemented in another lang...

weixin_33824363的博客 606

uniapp [安卓苹果App端] - 实现支付宝支付功能+拉起支付宝app付款支付后返回跳转到原页面,详解uniApp如何唤起本机支付宝并跳转到支付页面全流程及示例源码(APP端支付宝支付,支持打包

全网最详细的uniapp支付宝支付教程,uniapp支付宝支付流程,uni-app项目在APP端使用支付宝支付功能,uniapp前端实现支付宝支付,uniapp中唤醒支付宝进行支付并返回app,uniApp调起支付宝支付失败报错,uniapp app端调支付宝支付接口,uniapp开发安卓App对接支付宝支付,uniapp苹果ios唤起支付宝支付,uniapp调用支付宝支付uniapp开发app-调用支付宝支付,uniapp开发安卓苹果app如何接入支付宝支付,UniApp中实现支付宝支付功能,支付报错,调

🏆 前端领域优质创作者 1万+

Hbase-day01_HBase1.7.1安装搭建

HBase1.7.1安装搭建 4.1 hbase下载 官网下载地址:https://www.apache.org/dyn/closer.lua/hbase/1.7.1/hbase-1.7.1-bin.tar.gz 4.2 前期准备(Hadoop,zookeeper,jdk) 启动hadoop start-all.sh 验证 http://master:50070 启动zookeepe...

weixin_48370579的博客 480

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OpenResty介绍及实现限流

OpenResty介绍及实现限流

weixin_38277138的博客 1734

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LUA--thrift--lib库的创建生成

首选先参考这个作者些的: thrift是一个比较流行的rpc框架,很多公司都有大规模使用的经验,不过网上很少有关于thrift-lua的介绍和example apache的thrift-lua也是刚刚从fbthrift项目引入,在安装过程中踩了一些坑,记录一下 首先是版本问题,apache-thrift的最新版本是0.9.3,这个版本支持的lua版本是5.

senlin1202的博客 1455

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

在openresty中利用lua嵌入C程序

在openresty中利用lua嵌入C程序 两个前提: 已经安装openresty,若是没有安装可以前往https://blog.youkuaiyun.com/weixin_43850474/article/details/112860649查看如何安装 已经学会如何在lua中调用C函数,若是不会,可以前往https://blog.youkuaiyun.com/weixin_43850474/article/details/112860725学习 一、步骤展示 第一步:编写C程序,假设其文件命名为:test.c 该C程序功能很

weixin_43850474的博客 567

CentOS安装docker

docker要求CentOS在7.0以后的版本,如果你的系统版本还在7.0以前,请先升级一下版本在进行安装,同时不支持32位的系统,内核版本至少3.10。 请先确保没有安装过docker,否则有可能会导致安装失败,如果之前安装过,可以尝试直接yum isntall -y docker 1.更新软件源第一个命令 yum update 看到下面信息表示更新成功: 第二个命令 yum install -y yum-utils device-mapper-persistent-data lvm2 2.添加d

徐哈哈的博客 495

【Nginx 归档整理】Openresty 实现数据文件上传数仓网关 2020.7.28

模块设计 模块组成 Nginx Web模块 Shell脚本模块 最终形体 Openresty(Nginx+lua扩展+lua_upload库) + Shell(OS+HDFS+Hive+Impala) 设计思想 Nginx Web模块 采用 封装 lua 语言扩展完善的 Openresty 自带 upload 库 Openresty 部署方式为 Docker 快速部署 带来的问题

在微风中飘落的博客 510

Linux系统源码安装PHP以及相关问题总结

1 安装依赖 # 添加epel yum install epel-release yum update # 添加依赖包 yum -y install systemtap-sdt-devel libxml2 libxml2-devel openssl-devel libcurl-devel enchant-devel libpng-devel libicu-devel libmcrypt-devel recode-devel net-snmp-devel libtidy-devel autoconf read

麦田里的守望者 3076

Lua 服务器与客户端实例

 =============================================================== 服务器,main.lua =============================================================== local socket = require ( "socket" ) local tcpServ

u011269801的专栏 9268

Lua: 好的, 坏的, 和坑爹的

在我使用Lua编程整整9个月后, 是时候停下来反省一下这段经历了. 过去了几年里, 我使用了各式各样的语言:Perl (soaplite.com, 还有其它的项目, 包括我现在的咨询工作), C (DHCPLite 和 ping-pong juggling robot), JavaScript (Google Maps相关经验 和 canvas), MATLAB (ping-pong juggli

逍遥剑客 2万+

Lua之学习笔记

迭代器 lua代码: array = {"Lua","C#","Java"} for k in pairs(array) do print(k,v) end array[2]=nil for k,v in ipairs(array) do print(k,v) end --pairs迭代table,遍历表中所有的key跟value --ipars按照索引从1开始,递增遍历,遇到nil值...

Csoap2的博客 364

Thrift 技术总结

Thrift 支持多种编程语言,通过 Thrift IDL 和编译器,用户可以使用不同的编程语言实现客户端和服务端,通过 Thrift 进行通信,实现多语言服务的集成和互通。通过 Thrift,服务可以使用不同的编程语言实现,进行跨语言的服务调用。Thrift提供了多语言SDK,用户可以使用不同的编程语言实现客户端,通过SDK进行服务注册和发现、配置管理等操作。Thrift 提供了异步调用支持,通过异步接口和回调机制,用户可以实现非阻塞的远程服务调用,提升系统的并发性能和响应速度。

weixin_40426261的博客 887

一颗璀璨的月光宝石——Lua

邓际锋本文发表于2006年6月《程序员》杂志,谢绝转载Lua语言简介    1993年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人员,他们给这门语言取了个浪漫的名字——Lua,在葡萄牙语里代表美丽的月亮。事实证明她没有糟蹋这个优美的单词,Lu

歌谣在风中飘舞 6656

thrift的lua实现

最近要进行系统升级,后台的数据是根据城市区分的。担心新系统的稳定性及新数据的准确性,计划部分城市采用新接口。接口的入参里没有城市信息,只有经纬度坐标,需要调用一个thrift接口来根据坐标获取城市信息。   如果直接修改代码逻辑,则会造成新旧版本的耦合,不仅完全上线时要再次修改,而且还要增加一次测试流程,这样成本就有些高了。这时就想到能不能用nginx+lua对新旧版本接口做灰度发布。

senlin1202的博客 530
上一篇: lua的require
下一篇: centos 7 ceph-10.2.3编译与安装问题记录
for_tech
博客等级 码龄11年 50粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值