Erlang学习手记

erlang install notes

ubuntu10.04下erlide for eclipse安装

网址:http://erlide.sourceforge.net/
3.5版本的eclipse,直接用url http://erlide.org/update 安装

安装后,还需要erlang的环境:

sudo apt-get install erlang

现在还不能打开文件,会报空指针错误,选择window->preferences->erlang->installed runtimes
把location选择到 /usr/lib/erlang 即可使用。

[把build automatically关掉,这插件还是不怎么靠谱的,用来写写代码就完了,要编译还是走命令行]

erlang学习要点: (1)-module(xx). 注意前面的杠(-)和后面的点(.) 类似java的package,文件名要求为xx.erl,与module里名字相同。 (2)-export([double/1]). 同样注意杠和点。表示模块内的函数为double,包含一个参数。
扩展:多个声明这样写 -export([fac/1, mult/2]). (3)模式匹配 xxxx->aaaa;
箭头的用意:节省代码,不需要if...else...对应前面执行箭头后面。 (4)变量只能单次赋值 首字母必须大写。 (5)元子 以小写字母开头。只是一个名字。类似java的常量。 (6)元组 {inch,Y}
{moscow,{c,-10}}
元组中有元素。 (7)列表 [{},{},{}]
列表不一定要写在一行,不可以在元子或者整数中间分段。
一个很有用的遍历列表的方法是“|” (8)guard满足条件之后才会执行后面的 大于> 小于< 等于== 大于等于>= 小于等于<= 不等于/= (9)竖线的作用 | 得到列表中第一个元素:
[M1|T1] =[aaa,bbb,ccc].
在列表头部添加元素:
L1=[ddd|T1]. (10)if case if
condition 1 -> Action 1;
condition 4 -> Action 4
end.
最后一个没有分号。
case XXX of
xxx-> xxx;
yyy-> yyy
end.
最后一个条件没有分号。 (11)io:format ~p很长的时候断行
~w输出
~n回车 (12)spawn和receive以及!还有self() spawn启动一个process
receive等待来自其它进程的消息
!用来发消息:Pid!Message
self()表示正在运行的进程ID (13)register 将一个进程名字注册为一个名字。 (14)头文件 *.hrl
-include("xxx.hrl"). (15)宏 -define(SERV_NODE,messenger@super).
?SERV_NODE (16)记录 -record(message_to,{to_name,message}).
message_to{to_name=aaaa,message="hello"}
将得到{message_to,aaaa,"hello"}

利用sqoop将mysql数据同步到hive手记

sqoop mysql hive

1.下载 http://archive.cloudera.com/cdh/3/sqoop-1.2.0-CDH3B4.tar.gz

2.下载 http://archive.cloudera.com/cdh/3/hadoop-0.20.2-CDH3B4.tar.gz

3.解压 2

4.复制3里hadoop-core-0.20.2-CDH3B4.jar到sqoop的lib下

5.在某处复制mysql-connector-java-5.1.10.jar到sqoop的lib下

6.修改configure-sqoop

注释掉hbase zookeeper检查:
#if [ ! -d "${HBASE_HOME}" ]; then
# echo "Error: $HBASE_HOME does not exist!"
# echo 'Please set $HBASE_HOME to the root of your HBase installation.'
# exit 1
#fi
#if [ ! -d "${ZOOKEEPER_HOME}" ]; then
# echo "Error: $ZOOKEEPER_HOME does not exist!"
# echo 'Please set $ZOOKEEPER_HOME to the root of your ZooKeeper installation.'
# exit 1
#fi

7.运行:
列出mysql所有的表:

./sqoop list-tables --connect jdbc:mysql://127.0.0.1/operation --username root --password 123

导入mysql表到hive:

./sqoop import --connect jdbc:mysql://192.168.100.52/operation --username root --password 3487e498770b9740086144fc03140876 --table active_uuid --hive-import

导入需要表里有主建,还要注意不要使用127.0.0.1,因为map出去不一定在哪个节点执行。

如果曾经执行失败过,那再执行的时候,会有错误提示:

ERROR tool.ImportTool: Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory xxx already exists

执行 $HADOOP_HOME/bin/hadoop fs -rmr xxx 即可

8.验证:

bin/hive
show tables;多了一个表

9.经验:
sqoop做了一些mysqldump时的map reduce,所以速度会比单纯的dump后load快。

用hadoop Hive协同scribe Log用户行为分析方案

hadoop,hive,scribe scribe 是 开源的分布式日志系统,在其示例配置中,并发量可达到max_msg_per_second=2000000。54chen使用手记见:http://www.54chen.com/java-ee/log-server-scribe-helper.html hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为 MapReduce任务进行运行。54chen使用手记见:http://www.54chen.com/_linux_/hive-hadoop-how-to-install.html 下面来讲述二者合成的使用办法: 创建和scribe格式相符的hive table bin/hive

> create table log(active string,uuid string,ip string,dt string) row format delimited fields terminated by ',' collection items terminated by "\n" stored as textfile;
加载数据

>LOAD DATA LOCAL INPATH '/opt/soft/hadoop-0.20.2/hive-0.7.0/data/log-2011-04-13*' OVERWRITE INTO TABLE log;

查询

>select count(*) from log group by uuid;

进入mapreduce计算,过了一会儿,结果出来了。

修改已经定义数据格式 cutter.py 数据自定义脚本,从标准输入拿到数据后输出到标准输出
cd bin/
./hive

>add file /opt/soft/hadoop-0.20.2/hive-0.7.0/bin/hive-shell/cutter.py;
>select transform (active,uuid,ip,dt) using 'python cutter.py' as (active,uuid,ip,dt) from log limit 1;
得到格式化后的结果
>create table log_new(active string,uuid string,ip string,dt string) row format delimited fields terminated by ',' collection items terminated by "\n" stored as textfile;
>INSERT OVERWRITE TABLE log_new select transform (active,uuid,ip,dt) using 'python cutter.py' as (active,uuid,ip,time) from log;
以hive server运行(thrift的server)
bin/hive --service hiveserver
默认以thrift service在10000启动服务。

用标准的thrift-jdbc来连接hive

public class HiveJdbcClient {
private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

/**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.exit(1);
Connection con = DriverManager.getConnection("jdbc:hive://192.168.100.52:10000/default", "", "");
Statement stmt = con.createStatement();

ResultSet res = stmt.executeQuery("select count(distinct uuid) from usage_new where active='user_login_succ'");
if (res.next()) {
System.out.println(res.getString(1));
}

} 依赖的jar包(maven pom)

<dependency>
<groupId>hadoop</groupId>
<artifactId>hive-jdbc</artifactId>
<version>0.7.0</version>
</dependency>
<dependency>
<groupId>hadoopl</groupId>
<artifactId>hive-metastore</artifactId>
<version>0.7.0</version>
</dependency>

<dependency>
<groupId>hadoop</groupId>
<artifactId>hive-exec</artifactId>
<version>0.7.0</version>
</dependency>

<dependency>
<groupId>hadoop</groupId>
<artifactId>hive-service</artifactId>
<version>0.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>thrift</artifactId>
<version>0.5.0-xiaomi</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>thrift-fb303</artifactId>
<version>0.5.0</version>
</dependency>

<dependency>
<groupId>hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>0.20.2</version>
</dependency>

<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.1</version>
</dependency>

QCon2011讲师经验总结及QCon2011的ppt下载

qcon 2011 ppt

第一次作为讲师参加这样大规模的会议,经验不足,特总结一下:
1.虚心接受批评建议,诚心提高演讲技巧。
2.会前准备过份考虑切合当天大会主旋律。
3.铺垫过多,观众需要速食。
4.要讲的东西一定要放到ppt上,会场很大,由于音响回声,前半场需要讲师,后半场只需要幻灯播放员。
5.三段式的ppt最能快速切入主题:1)解决什么问题 2)用什么关键代码解决 3)在哪里下载
6.不谈构架,潜心解决实际问题。
7.10月份杭州QCon如果时间允许,再去分享更好的主题:米聊团队背后的技术,届时一定不忘记上面的6点。
如果您当天听了我的讲座有任何建议,欢迎以评论方式提出。
下面是ppt:

QCon 2011 beijing官方下载地址 http://www.qconbeijing.com

Hadoop Hive安装手记

hadoop hive hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为 MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

[网络环境设置] vim /etc/hosts

192.168.100.52 hadoop1
192.168.99.34 hadoop2
192.168.103.135 hadoop3

分别到对应机器执行:

hostname hadoop1
hostname hadoop2
hostname hadoop3

[打通机器]

hadoop1# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
hadoop1# scp ~/.ssh/id_dsa.pub hadoop2:/root/
hadoop1# scp ~/.ssh/id_dsa.pub hadoop3:/root/
hadoop2# cat id_dsa.pub >> ~/.ssh/authorized_keys
hadoop3# cat id_dsa.pub >> ~/.ssh/authorized_keys

验证:从hadoop1登录到hadoop2和hadoop3,不再需要密码。

[安装hadoop] 确保所有机器有 ssh rsync jdk
确保设置了:
export JAVA_HOME=/opt/soft/jdk

hive在0.20.x的hadoop做了大量的测试,因此选择0.20

cd /opt/soft/
wget http://mirror.bjtu.edu.cn/apache/hadoop/core/hadoop-0.20.2/hadoop-0.20.2.tar.gz
tar -zxvf hadoop-0.20.2.tar.gz
cd hadoop-0.20.2/
vim .bashrc
export HADOOP_HOME=/opt/soft/hadoop-0.20.2

(重复以上作到另外两机器)

[配置hadoop] vim conf/core-site.xml
修改:

<configuration>
<property>
<!-- 用于dfs命令模块中指定默认的文件系统协议 -->
<name>fs.default.name</name>
<value>hdfs://hadoop1:9000</value>
</property>
</configuration>

vim conf/hdfs-site.xml
修改:

<configuration>
<property>
<!-- DFS中存储文件命名空间信息的目录 -->
<name>dfs.name.dir</name>
<value>/opt/hadoop/data/dfs.name.dir</value>
</property>
<property>
<!-- DFS中存储文件数据的目录 -->
<name>dfs.data.dir</name>
<value>/opt/hadoop/data/dfs.data.dir</value>
</property>
<property>
<!-- 是否对DFS中的文件进行权限控制(测试中一般用false)-->
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>

vim conf/mapred-site.xml
修改:

<configuration>
<property>
<!-- 用来作JobTracker的节点的(一般与NameNode保持一致) -->
<name>mapred.job.tracker</name>
<value>hadoop1:9001</value>
</property>
<property>
<!-- map/reduce的系统目录(使用的HDFS的路径) -->
<name>mapred.system.dir</name>
<value>/opt/hadoop/system/mapred.system.dir</value>
</property>
<property>
<!-- map/reduce的临时目录(可使用“,”隔开,设置多重路径来分摊磁盘IO) -->
<name>mapred.local.dir</name>
<value>/opt/hadoop/data/mapred.local.dir</value>
</property>
</configuration>

vim masters

hadoop1
vim slaves

hadoop2
hadoop3

scp conf/* hadoop2:/opt/soft/hadoop-0.20.2/conf/
scp conf/* hadoop3:/opt/soft/hadoop-0.20.2/conf/

[初始化]

cd $HADOOP_HOME/bin
./hadoop namenode -format

启动
./start-all.sh

[验证] $HADOOP_HOME/bin/hadoop dfs -ls /
打开 http://192.168.100.52:50030
http://192.168.100.52:50070

[搭建hive集群] 下载
只需要在hadoop1机器上安装

cd /opt/soft/hadoop-0.20.2
wget http://mirror.bjtu.edu.cn/apache/hive/hive-0.7.0/hive-0.7.0.tar.gz
tar zxvf hive-0.7.0.tar.gz
cd hive-0.7.0
vim ~/.bashrc
export HIVE_HOME=/opt/soft/hadoop-0.20.2/hive-0.7.0

$HIVE_HOME/bin/hive
>create table tt(id int,name string) row format delimited fields terminated by ',' collection items terminated by "\n" stored as textfile;
>select * from tt;
>drop table tt;

试玩结束。

[配置hive] 准备mysql:hadoop1 user:hadoop pwd:hadoop

>create database hive
>GRANT all ON hive.* TO hadoop@% IDENTIFIED BY 'hadoop';
>FLUSH PRIVILEGES ;

vim $HIVE_HOME/conf/hive-site.xml

<?xml version="1.0"?>
<?xml-stylesheets type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>

<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop1:3306/hive?createDatabaseIfNotExist=true</value>
</property>

<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>

<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hadoop</value>
</property>

<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hadoop</value>
</property>
</configuration>

[启动] 复制一个mysql-connector-java-5.1.10.jar到hive/lib下后:

$HIVE_HOME/bin/hive
>create table tt(id int,name string) row format delimited fields terminated by ',' collection items terminated by "\n" stored as textfile;

如果报如下错:

FAILED: Error in metadata: javax.jdo.JDOException: Couldnt obtain a new sequence (unique id) : Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'

退出hive后,以root进入mysql执行:

>set global binlog_format='MIXED';

这是mysql的一个bug。

安装结束。