lucene indexer/searcher简单代码示例

仅供拷贝 <!–pom.xml–> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>3.0.0</version> </dependency> package player.kent.chen.temp.lucene; import java.io.File; import java.io.FileReader; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class MyLuceneIndexer { public static void main(String[] args) throws Exception { String rootDir = "/home/kent/diskD/home-kent-dev/workspace/kent-temp/data/lucene"; File contentDir = new File(rootDir, "content"); File indexDir …

lucene indexer/searcher简单代码示例 Read More »

系统交互时利用摘要机制来校验参数组合的正确性

一个系统在处理另一个系统发来的请求时,如果遇到 "种类 = 可乐 & 口味 = 苦味" 这样的无意义参数组合,应该如何甄别出这是一个无效的请求? 因为可乐不可能是苦味的,正常的系统不会发出这样的请求,这种请求只可能是别人伪造出来的。 最直接的甄别手段是在本系统里实现“可乐不可能是苦味”这种业务逻辑,但是本系统是一个基础应用,不应该让特殊的业务逻辑侵入。 另一种方案是让本系统通过RPC回调业务系统,校验是否“可乐,苦味”这种组合的有效性。但这会导致两个系统之间存在互调,对性能和发布都不利。 今天有个同事想出了一个简单的办法:发送端将参数组合起来加密,接收端解密文,如果解出来的东西不是一堆乱码,就可以认为这个组合是有效的。 即使中间人截获了报文,他也只能截获“可乐,甜味”,“可乐,酸甜味”这种有效的组合;如果中间人把这种组合发出来了,我们的基础系统也照样帮忙处理,没什么大不了的。 那为什么说中间人拼不出“可乐,苦味”这种无效组合的密文呢? 因为中间人不知道具体的加密办法。 所以,通过加解密就可以保证参数组合是有效的。 当然,更简单的办法是用摘要,摘要算法如MD5是不可逆的加密算法,它的执行可以快一些;不过,MD5算法很容易被人猜到,你在MD5之前应该先往明文里掺点噪音数据,并让发送方和接收方使用相同的噪音数据。

搭建简单的Hadoop集群

声明:这里要搭的集群很简单,仅供研究学习使用: 1. 绝大部分参数都用默认值 2. Name Node 和 Job Tracker共用一台机器 3. 没有Secondary Name Node 在master机上生成ssh所需的key-pair $ssh-keygen -t rsa 为了方便,shell提示输入passphrase时可以直接按回车 让每台机(包括master机本身)都信任master机器 以worker1机器为例, ##在master机上 $scp ~/.ssh/id_rsa.pub worker1:~/hadoop/namenode_rsa.pub ##在worker1上 $cat ~/hadoop/namenode_rsa.pub >> ~/.ssh/authorized_keys ##试着从master直接登录到worker1上,看看是不是可以免输密码 $ssh worker 在master上指定相关的workers 引用 ##修改conf/slaves worker1 worker2 这个文件不必同步到worker机器上 修改master机器的配置文件并同步到其他机器 <!–修改conf/core-site.xml–> <configuration> <property> <name>fs.default.name</name> <value>hdfs://master/</value> </property> </configuration> <!–修改conf/hdfs-site.xml–> <configuration> <property> <name>dfs.name.dir</name> <value>/home/kent/hadoop/name</value> </property> <property> <name>dfs.data.dir</name> <value>/home/kent/hadoop/data</value> …

搭建简单的Hadoop集群 Read More »

例示Hive + Sqoop Export

做完Hive分析后,怎么让普通用户通过web界面访问你的分析结果? 最直接的办法是将分析结果存为另一张Hive表,然后让web应用通过hive jdbc连接这张表。 这种做法的坏处是:Hive结果表在被查询时会临时起MapReduce任务,这对快速返回查询结果不利;如果结果表本身比较大、并且查询方式本身还有点复杂的话,那响应就更慢了,因为Hive对查询的优化能力跟RDBMS没法比。 所以最好把hive结果表再通过sqoop导入到rdbms的一张表中,以适应OLTP环境下的各种查询。 这里以日志分析为例。 假设你拿到了若干很大的日志文件并已存为Hive表,业务方要求你返回总的访问次数、总的访问用户数、访问次数最多的10个用户 第一步当然是对Hive日志表进行分析。由于用户数并非海量,所以结果表可以存成<user_name_id, visit_count>这种格式,最好再导到RDBMS中 create table visiting_user (usernameid string, visitcount int); –创建Hive结果表 insert overwrite table visiting_user — 统计分析 select usernameid, visitcount from (select usernameid, count(*) as visitcount from coupon11_log group by usernameid) stats order by visitcount desc limit 10; 然后把Hive结果表导入mysql create table visiting_user (usernameid varchar(50), visitcount int); –在mysql中创建结果表 $sqoop export –connect …

例示Hive + Sqoop Export Read More »

简单的Sqoop安装、使用示例

Hadoop相关的东西在版本兼容性方面都很麻烦,这个例子里用的Sqoop是1.4.2, Hadoop是Apache的1.0.4; 本例介绍的方法未必适用其他版本的Sqoop和Hadoop. 1.安装Sqoop 下载、解压 略 编译 $ant -Dhadoopversion=100 #这里的100表示编译后的Sqoop将与Hadoop 1.0.*结合使用 配置$HADOOP_HOME变量 Sqoop不认$HADOOP_INSTALL变量,只认$HADOOP_HOME, 所以要把$HADOOP_HOME配置到环境变量中 试运行一下 $sqoop version 2.从mysql中导入数据到HDFS 先把HADOOP启起来 MapReduce服务和HDFS服务都要启起来 把mysql jdbc驱动丢到sqoop的类目录下 $cp mysql-connector-java-5.1.6.jar /home/kent/dev/hadoop/sqoop-1.4.2/lib/ 执行sqoop import $sqoop import –connect jdbc:mysql://localhost/kent –username kent –password *** –table user –verbose –target-dir /sqoop/user –fields-terminated-by ‘\0001’ ##导出后的hdfs文件将在/sqoop/user路径下 ##导出后的hdfs文件中列之间将以’\0001’分隔 观察一下控制台输出,   a. 生成了 /tmp/sqoop-kent/compile/b54fd32800d1ddb50c259c709464a35c/user.java   b. user.java被编译打包到了/tmp/sqoop-kent/compile/b54fd32800d1ddb50c259c709464a35c/user.jar   c. 观察Hadoop的控制台,可以看到有新的MapReduce …

简单的Sqoop安装、使用示例 Read More »

例示:用Zookeeper搭建服务注册中心

用Zookeeper搭建一个服务注册中心:不断有ServiceProvider上来注册自己的进程ID或者与注册中心断开,ServiceConsumer则捕捉这些变化。 1.创建一个根结点,所有注册信息都将挂这个结点的下面 public class RegistryStartup { public static void main(String[] args) throws Exception { ZooKeeper zk = new ZooKeeper("localhost", 1000, null); while (zk.getState() != States.CONNECTED) { ;//wait } Stat rootExists = zk.exists("/serviceProviderRoot", false); if (rootExists == null) { zk.create("/serviceProviderRoot", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } System.out.println("The node ‘/serviceProviderRoot’ has been created"); } } 2.ServiceProvider注册自己的进程号 <!–pom.xml, 引入一个库,以帮助获取当前进程的ID–> <dependency> …

例示:用Zookeeper搭建服务注册中心 Read More »

搭建ZooKeeper Standalone环境

无干货,仅供复制 1. 下载、解压 略 2. 配置 引用 #conf/zoo.cfg tickTime=2000 dataDir=/home/kent/dev/hadoop/zookeeper-3.4.5/dataStore clientPort=2181 3. 启动 引用 $zkServer.sh start-foreground  4. 验证 引用 $telnet localhost 2181 $>ruok  #zookeeper支持的四字短语之一 5. 用Java API创建一个结点 <!–pom.xml–> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.5</version> </dependency> public class FirstNode { public static void main(String[] args) throws Exception { ZooKeeper zk = new ZooKeeper("localhost", 1000, null); while (zk.getState() != …

搭建ZooKeeper Standalone环境 Read More »

hbase跟hadoop的关系

HBase是独立项目 虽然HBase一开始是作为Hadoop的子项目存在的,但现在它已经是apache顶级项目了. 在使用时,HBase也只是用作NoSql数据库,跟Hadoop的MapReduce没有必然联系。 不过,两者之间还是有很多相关的地方: 相关点 1.HBase数据的存储用的是Hadoop文件的API,实际的存储一般也是HDFS 2.HBase经常用作MapReduce的数据源或者目标输出 3.HBase的分布式架构模仿了Hadoop的风格,也是一主多从 4.HBase的配置文件名、配置项的名字也尽量与Hadoop一致。