HDEMO
Hadoop worldcount
日志格式内容如下所示:
101.200.88.27 - - [15/May/2018:19:31:05 +0800] "GET / HTTP/1.1" 200 4219 "-" "-"
筛选提取IP,使用awk命令:
awk '{print $1}' access.log > ips.txt
上传至hdfs上:
hadoop fs -mkdir /input
hadoop fs -put ips.txt /input
执行wordcount命令:
hadoop jar hadoop jar /usr/hdp/3.1.4.0-315/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount /input /output
19/10/16 10:11:05 INFO client.RMProxy: Connecting to ResourceManager at master.longruan.com/192.168.10.41:8050
19/10/16 10:11:06 INFO client.AHSProxy: Connecting to Application History server at master.longruan.com/192.168.10.41:10200
19/10/16 10:11:06 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /user/root/.staging/job_1570779199369_0012
19/10/16 10:11:06 INFO input.FileInputFormat: Total input files to process : 1
19/10/16 10:11:06 INFO mapreduce.JobSubmitter: number of splits:2
19/10/16 10:11:07 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1570779199369_0012
19/10/16 10:11:07 INFO mapreduce.JobSubmitter: Executing with tokens: []
19/10/16 10:11:07 INFO conf.Configuration: found resource resource-types.xml at file:/etc/hadoop/3.1.4.0-315/0/resource-types.xml
19/10/16 10:11:07 INFO impl.YarnClientImpl: Submitted application application_1570779199369_0012
19/10/16 10:11:07 INFO mapreduce.Job: The url to track the job: http://master.longruan.com:8088/proxy/application_1570779199369_0012/
19/10/16 10:11:07 INFO mapreduce.Job: Running job: job_1570779199369_0012
...
查看执行的结果:
hadoop fs -cat /output/part-r-00000
Spark - SparkSQL - Python
以使用python脚本执行people为例
安装pyspark : 安装前,修改一下pip源,使用国内的速度更快
mkdir ~/.pip
vi ~/.pip/pip.conf
----输入下面内容
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn
Spark SQL所有的功能入口都是SQLContext 类。不过要创建一个SQLContext对象,首先需要有一个SparkContext对象,然后再创建SQLContext
from pyspark import SparkContext
from pyspark import SQLContext
sc = SparkContext("local","spark_demo")
spark = SQLContext(sc)
df = spark.read.json("/usr/hdp/3.1.4.0-315/spark2/examples/src/main/resources/people.json")
df.show()
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+
df.createOrReplaceTempView("people")
#将DataFrame注册为SQL临时视图
sqlDF=spark.sql("select * from people")
sqlDF.show()
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+
Spark SQL中的临时视图是会话范围的。 如果在所有会话之间共享一个临时视图并保持活动状态,直到Spark应用程序终止,则可以创建一个全局临时视图。 全局临时视图与系统保存的数据库global_temp绑定,我们必须使用限定名称来引用它,例如, SELECT * FROM global_temp.view1
df.createGlobalTempView("people1")
spark.sql("SELECT * FROM global_temp.people1").show()
spark.newSession().sql("SELECT * FROM global_temp.people1").show()
Sqoop Client
一些字段的特别说明
--boundary-query
边界查询,也就是在导入前先通过SQL查询得到一个结果集,然后导入的数据就是该结果集内的数据,格式如:--boundary-query 'select id,no from t where id = 3'
,表示导入的数据为id=3的记录,或者 select min(\<split-by\>), max(\<split-by\>) from \<table name\>
,注意查询的字段中不能有数据类型为字符串的字段,否则会报错
--query,-e
从查询结果中导入数据,该参数使用时必须指定–target-dir
、–hive-table
,在查询语句中一定要有where条件且在where条件中需要包含 \$CONDITIONS
,示例:--query 'select * from t where \$CONDITIONS ' --target-dir /tmp/t –hive-table t
如果使用双引号(“)将查询语句引起来的话,则必须使用$CONDITIONS进行转义,而不是$CONDITIONS, 转义之后shell才会将其视为shell变量。双引号查询语句如下所示
"SELECT * FROM x WHERE a='foo' AND \$CONDITIONS"
–warehouse-dir 与 –target-dir 不能同时使用,指定数据导入的存放目录,适用于hdfs导入,不适合导入hive目录
–create-hive-table:如果设置,那么如果存在目标hivetable,作业将失败。默认情况下,此属性为false。
--split-by ${tablename.column}
如果设置map数量为1个时即-m 1,不用加上--split-by ${tablename.column}
,否则需要加上
--incremental (mode)
:指定Sqoop如何确定哪些行是新的。此项参数的值有append和lastmodified两个。
sqoop to hdfs examples
数据库列表
sqoop list-databases \
--connect jdbc:mysql://192.168.10.55:3306 \
--username root \
--password 123456
导入前2行数据
sqoop import --connect jdbc:mysql://192.168.10.55:3306/devaccess \
--username root --password 123456--table access \
--where 'id<3' --target-dir '/sqoop/devaccess/access'
增量导入,导入3到9行数据
sqoop import --connect jdbc:mysql://192.168.10.55:3306/devaccess \
--username root --password 123456 --table access \
--where "id > 2 and id < 10" \
--target-dir '/sqoop/devaccess/access' \
--append
手动增量更新,更新id 大于3的数据(最后一次导入的位置为3000)
sqoop import --connect jdbc:mysql://192.168.10.55:3306/devaccess \
--username root --password 123456 --table access \
--target-dir '/sqoop/devaccess/access' \
--check-column 'id' \
--incremental append \
--last-value 3000
自动更新,自动导入数据
mysql -query 注意,import 前面有个空格,单独存在一个“–”
sqoop job --create devaccess -- import \
--connect jdbc:mysql://192.168.10.55:3306/devaccess \
--username root --password 123456 \
--target-dir '/sqoop/devaccess/access' \
--query "select * from access where remote_address='218.26.97.2' and \$CONDITIONS" \
--split-by id \
--check-column 'id' \
--incremental append \
--last-value 10000
sqoop job --exec devaccess
可以把该指令设为Linux定时任务
sqoop to hive
类型对应表
MySQL(bigint) --> Hive(bigint)
MySQL(tinyint) --> Hive(tinyint)
MySQL(int) --> Hive(int)
MySQL(double) --> Hive(double)
MySQL(bit) --> Hive(boolean)
MySQL(varchar) --> Hive(string)
MySQL(decimal) --> Hive(double)
MySQL(date/timestamp) --> Hive(string)
导入数据库表类型
sqoop create-hive-table \
--connect jdbc:mysql://192.168.10.55:3306/devaccess \
--username root \
--password 123456\
--table access \
--hive-table access \
--hive-database devaccess
注:hive表中的database要存在
导入前2行数据
sqoop import --connect jdbc:mysql://192.168.10.55:3306/devaccess \
--username root --password 123456 --table access \
--where 'id<3' --target-dir '/warehouse/devaccess/access' \
--hive-import \
--hive-database devaccess \
--hive-table access
未完待续…