搭建flume
- 先安装JDK:参考http://wenku.baidu.com/link?url=QnE9lgoCkS2OoILGeHim7uonsth5LwiGB3IWKOnNirSE6qEOaNgdW4-DDWR2XKKoX0X8aLIbjDD0i_z4BeXh4VA_AEScZhrxvz_9BucO-Ze
- 下载flume,目前最新版本1.6.0:链接http://flume.apache.org/download.html
- 安装flume:参考http://wenku.baidu.com/link?url=LS_fM5ifOAiHumoqaZUd9G42P9vAlvePdsQsdE7FcniaGHTMuWt1LJ5SZaA6yQBq3p9jxtp9lt81n39627kNT8fxFx7EGK8WfFS_mUt5WGG
- 我的环境变变量的设置:文件/etc/profile
-
- if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
- INPUTRC=/etc/inputrc
- fi
- export JAVA_HOME=/opt/jdk/jdk1.6.0_45
- export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
- export CLASSPATH=.:/opt/jdk/jdk1.6.0_45/lib:/opt/jdk/jdk1.6.0_45/jre/lib:$CLASSPATH
- export FLUME_HOME=/usr/local/flume
- export PLUME_LOG_DIR=$FLUME_HOME/log
- export PATH=$PATH:$FLUME_HOME/bin
- export KAFKA_HOME=/usr/local/kafka
- export PATH=$PATH:$KAFKA_HOME/bin
- export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
测试
- 链接中有很多测试案例,可用于测试flume安装是否成功,并且初步了解各种source的使用方式以及区别:http://www.aboutyun.com/thread-8917-1-1.html
- 上面博文中测试用例都是用命令行的方式实现的,实际开发中我们需要编写自己的client,与flume source对接
Syslog source
- 这篇博文中用使用Java编写了一个客户端(创建socket客户端)之后发送数据,flume配置的source类型为syslog,测试可以运行。链接:http://blog.csdn.net/shuijinglianyi/article/details/8492415
- 由于业务需求,我的客户端需要用C语言实现。所以尝试着用C编写了一个类似的socket client,但是运行不成功。刚开始以为是跨语言的问题,所以用java编写了socket 服务端与我的C client通信,运行成功,说明不是语言问题。(Java与C之间的socket通信,参考:http://blog.csdn.net/yutianzuijin/article/details/24807417)
- 仔细检查后才明白是发送的消息格式不正确,下面是C语言的client代码。
- 之前发送的消息之前没有加<4>,然后就发送不成功。猜测:<4>应该是flume event要求的一个固定字段。
- 由于刚开始接触flume,event的格式还不是很明白,关于为什么消息前面必须加<4>,在下一篇博文中说明。
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <arpa/inet.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <string.h>
- #include <errno.h>
- int main()
- {
- int sock_id;
- char send_buf3[] = "<4>helloworld\nnihao\n"; // 要发送给服务器的信息
- char server_addr[16] = "127.0.0.1";//服务器IP地址
- int server_port = 5496;//服务器分配的端口号
- struct sockaddr_in servaddr;//服务器的地址信息
- bzero(&servaddr,sizeof(servaddr));
- //读取IP地址
- servaddr.sin_family = AF_INET ;
- servaddr.sin_addr.s_addr = inet_addr(server_addr);
- servaddr.sin_port = htons(server_port);
- //创建TCP流式socket
- sock_id = socket(AF_INET,SOCK_STREAM,0);
- if(sock_id == -1){
- perror("socket() failed");
- return -1;
- }
- //与服务器建立连接
- if(connect(sock_id,(struct sockaddr *)&servaddr,sizeof(servaddr)) != 0){
- perror("connect() failed");
- return -1;
- }
- int send_len = send(sock_id,send_buf3,100,0);
- //printf("send_len=%d\n",send_len);
- if(send_len < 0){
- perror("send() failed");
- }
- printf("send_len=%d\n",send_len);
- close(sock_id);
- return 0;
- }